Skip to main content

Kubernetes Service - Truy cập Service trong Kubernetes

Service trong Kubernetes là một tài nguyên để quản lý Pod và cung cấp các chính sách truy cập đến các Pod đó.

kubernetes_services.png

Hiểu một cách đơn giản, để có thể truy cập vào các Pod trên Kubernetes thì cần phải khai báo Service cho nó, các loại Service trong Kubernetes bao gồm:

  • ClusterIP: Expose 1 port để giao tiếp với Pod trong cluster với internal IP. Loại này thường được sử dụng trong trường hợp Pod chỉ giao tiếp nội bộ với nhau trong cùng cluster (bên ngoài/end user sẽ không truy cập được). Đây là loại mặc định của Service.
  • NodePort: Expose 1 static public port (mặc định trong khoảng 30000 - 32767) cho Pod trên mỗi Node IP, được hiểu là Kubernetes sẽ NAT port để cho phép người sử dụng có thể truy cập vào các Pod đang được deploy trên Node đó từ bên ngoài bằng địa chỉ: <NodeIP>:<NodePort>. Loại này thường được sử dụng trong trường hợp phục vụ test/thử nghiệm.
  • LoadBalancer: Expose 1 public port cho Pod trên 1 địa chỉ IP, cho phép người sử dụng truy cập dịch vụ từ bên ngoài. Điểm khác biệt so với NodePort, đó là lưu lượng này sẽ được phân tải cho tất cả các Pod trên các Node theo cơ chế load balancer (cân bằng tải). Loại này thường được sử dụng khi cần cung cấp truy cập đến dịch vụ cho người dùng.
  • ExternalName: Đây là loại service có cơ chế tách biệt một chút so với 3 loại service phía trên. Loại service này không sử dụng selectors mà thay vào đó lại sử dụng tên DNS. Nó ánh xạ một service với một tên DNS là nội dung của trường externalName (Ví dụ: app.test.com). Khi bạn muốn truy cập vào tên service đó, thay vì trả về cluster-ip của service này, nó sẽ trả về bản ghi CNAME với giá trị được đề cập trong externalName

kubenetes-service2

Cùng tìm hiểu cách khai báo các Service trong Kubernetes theo ví dụ sau:

- Tạo Pod:

apiVersion: v1 
kind: Pod 
metadata: 
  name: myapp-pod 
  labels: 
    app: myapp 
    type: front-end
spec: 
  containers: 
    - name: nginx-container 
      image: nginx

- Khai báo Service ClusterIP:

apiVersion: v1 
kind: Service 
metadata: 
  name: front-end-service 
spec: 
  type: ClusterIP 
  selector: 
    app: myapp 
    type: front-end 
  ports: 
    - targetPort: 80
      port: 80

- Khai báo Service NodePort:

apiVersion: v1 
kind: Service 
metadata:
  name: myapp-service 
spec: 
  type: NodePort 
  selector: 
    app: myapp 
    type: front-end 
  ports: 
    - targetPort: 80 
      port: 80 
      nodePort: 32593

- Khai báo Service LoadBalancer:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 9376
      nodePort: 31000
  selector:
    app: myapp

- Khai báo Service ExternalName:

apiVersion: v1
kind: Service
metadata:
  name: "google-service"
spec:
  ports:
    - port: 80
  type: ExternalName
  externalName: google.com

Tham khảo: https://kubernetes.io/docs/concepts/services-networking/service/