Hiểu Rõ Các Loại Service Trong Kubernetes

Service là một thành phần quan trọng trong Kubernetes, cung cấp một địa chỉ IP ổn định và một DNS name cho một nhóm các Pod. Nó đóng vai trò như một lớp trừu tượng hóa mạng, cho phép các ứng dụng giao tiếp với nhau một cách linh hoạt mà không cần quan tâm đến việc các Pod được triển khai trên node nào và có địa chỉ IP nào. Kubernetes cung cấp bốn loại Service chính, mỗi loại phục vụ một mục đích mạng khác nhau.

Các Loại Service

  1. ClusterIP: Đây là loại Service mặc định. Nó chỉ có thể được truy cập từ bên trong cụm Kubernetes. Các ứng dụng bên ngoài không thể kết nối trực tiếp. Service này tạo ra một địa chỉ IP ảo bên trong cụm để các Pod khác có thể giao tiếp với nó.
  2. NodePort: Loại Service này mở rộng chức năng của ClusterIP bằng cách ánh xạ một cổng cụ thể trên mỗi node trong cụm. Bằng cách truy cập vào NodeIP:NodePort, bạn có thể kết nối với Service từ bên ngoài cụm. Cổng này thường nằm trong khoảng 30000-32767.
  3. LoadBalancer: Dựa trên NodePort, loại Service này sử dụng một bộ cân bằng tải bên ngoài (thường do nhà cung cấp đám mây cung cấp) để tiếp nhận các yêu cầu từ bên ngoài và chuyển chúng đến các Pod. Nó cung cấp một địa chỉ IP công khai cho Service.
  4. ExternalName: Đây là một loại Service đặc biệt hoạt động như một bí danh DNS. Nó không có địa chỉ IP riêng và không tạo ra các Endpoints. Thay vào đó, nó trỏ một tên DNS bên trong cụm đến một tên miền bên ngoài thông qua một bản ghi CNAME.

1. Triển Khai Service ClusterIP

ClusterIP là loại Service phổ biến nhất, được sử dụng để cho phép các ứng dụng bên trong cụm giao tiếp với nhau.

1.1. Tạo Deployment

Đầu tiên, chúng ta cần một Deployment để chạy các Pod. Dưới đây là một ví dụ về Deployment cho một ứng dụng web đơn giản.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-application
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web-server
  template:
    metadata:
      labels:
        app: web-server
    spec:
      containers:
      - name: app-container
        image: nginx:latest
        ports:
        - containerPort: 80

Áp dụng Deployment:

kubectl apply -f web-deployment.yaml

Kiểm tra các Pod đã được tạo:

kubectl get pods -l app=web-server

1.2. Tạo Service ClusterIP

Bây giờ, chúng ta sẽ tạo một Service để truy cập vào các Pod này.

apiVersion: v1
kind: Service
metadata:
  name: web-clusterip-service
spec:
  selector:
    app: web-server
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80

Áp dụng Service:

kubectl apply -f web-clusterip-service.yaml

Kiểm tra Service đã được tạo:

kubectl get svc web-clusterip-service

Bạn sẽ thấy một địa chỉ CLUSTER-IP được tự động phân bổ.

1.3. Truy Cập Service

Bạn có thể truy cập Service này từ bên trong cụm bằng cách sử dụng địa chỉ CLUSTER-IP hoặc tên DNS của nó (web-clusterip-service.default.svc.cluster.local).

Từ một Pod khác trong cụm:

kubectl exec -it <tên-pod-test> -- curl http://web-clusterip-service.default.svc.cluster.local

Từ một node trong cụm (sử dụng địa chỉ IP):

curl http://<CLUSTER-IP-CỦA-SERVICE>:80

1.4. Xem Quy Tắc IPVS

Nếu bạn đang sử dụng kube-proxy ở chế độ ipvs, bạn có thể xem các quy tắc được tạo ra.

ipvsadm -Ln

Bạn sẽ thấy các quy tắc chuyển tiếp lưu lượng đến các địa chỉ IP của các Pod đằng sau Service.

2. Triển Khai Service NodePort

NodePort cho phép bạn truy cập Service từ bên ngoài cụm bằng cách mở một cổng trên mỗi node.

2.1. Tạo Service NodePort

apiVersion: v1
kind: Service
metadata:
  name: web-nodeport-service
spec:
  type: NodePort
  selector:
    app: web-server
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 31000

Áp dụng Service:

kubectl apply -f web-nodeport-service.yaml

Kiểm tra Service:

kubectl get svc web-nodeport-service

Bạn sẽ thấy cổng NodePort được chỉ định (ví dụ: 80:31000/TCP).

2.2. Truy Cập Service

Bạn có thể truy cập Service này từ bất kỳ node nào trong cụm bằng cách sử dụng địa chỉ IP của node và cổng NodePort.

curl http://<IP-CỦA-NODE>:31000

3. Triển Khai Service LoadBalancer

LoadBalancer sử dụng một bộ cân bằng tải bên ngoài để tiếp nhận các yêu cầu từ Internet.

3.1. Cài Đặt MetalLB (cho môi trường on-premise)

Đối với các cụm không trên đám mây, bạn có thể sử dụng MetalLB để mô phỏng một bộ cân bằng tải.

# Cài đặt MetalLB
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.5/config/manifests/metallb-native.yaml

# Cấu hình IP pool
cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 192.168.100.10-192.168.100.20
EOF

# Cấu hình L2Advertisement
cat <<EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool
EOF

3.2. Tạo Service LoadBalancer

apiVersion: v1
kind: Service
metadata:
  name: web-loadbalancer-service
spec:
  type: LoadBalancer
  selector:
    app: web-server
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: 80

Áp dụng Service:

kubectl apply -f web-loadbalancer-service.yaml

Kiểm tra Service:

kubectl get svc web-loadbalancer-service

Sau một thời gian, bạn sẽ thấy một địa chỉ EXTERNAL-IP được phân bổ từ pool IP của MetalLB.

3.3. Truy Cập Service

Bạn có thể truy cập Service này bằng cách sử dụng địa chỉ EXTERNAL-IP.

curl http://<EXTERNAL-IP-CỦA-SERVICE>

4. Triển Khai Service ExternalName

ExternalName hoạt động như một bí danh DNS cho một dịch vụ bên ngoài.

4.1. Tạo Service ExternalName

apiVersion: v1
kind: Service
metadata:
  name: external-api
spec:
  type: ExternalName
  externalName: api.example.com

Áp dụng Service:

kubectl apply -f external-api-service.yaml

Kiểm tra Service:

kubectl get svc external-api

Bạn sẽ thấy không có CLUSTER-IPEXTERNAL-IP.

4.2. Truy Cập Service

Từ bên trong cụm, bạn có thể truy vấn DNS để giải quyết tên này.

kubectl exec -it <tên-pod-test> -- nslookup external-api

Kết quả sẽ cho thấy external-api.default.svc.cluster.local trỏ đến api.example.com.

Thẻ: Kubernetes Service ClusterIP NodePort LoadBalancer

Đăng vào ngày 22 tháng 7 lúc 15:32