Monday, January 20, 2025

[Kubernetes 9] Thực hành tạo Headless Service trên Kubernetes

-

Tạo Service kiểu headless giúp ta truy vấn thẳng đến các IP của các Pod trên Kubernetes

1. Tổng quan

Các Service trước bạn tạo nó có một địa chỉ IP riêng của Service, nó dùng cơ chế cân bằng tải để liên kết với các POD. Tuy nhiên nếu muốn không dùng cơ chế cân bằng tải, mỗi lần truy cập tên Service nó truy cập thẳng tới IP của PO thì dùng loại Headless Service.

Một Headless Service (Service không IP) nó liên kết thẳng với IP của POD, có nghĩa bạn sẽ không tương tác trực tiếp với POD qua proxy. Tạo loại Service này giống như Service khác, chỉ việc thiết lập thêm .spec.clusterIP có giá trị None

2. Thực hành

Tạo Headless Service

cat > ./headless-svc.yaml << OEF
apiVersion: v1
kind: Service
metadata:
  name: headless       # đặt tên Service
spec:
  clusterIP: None      # Thiết lập là Headless Svc
  selector:
    app: headless      # Các nhãn của POD nó quản lý
  ports:
    - protocol: TCP
      port: 80         # Cổng Service
      targetPort: 80   # Cổng POD (container, endpoints)
OEF

Triển khai service

root@k8s-standalone:/home# kubectl apply -f headless-svc.yaml 
service/headless created

Verify headless service

root@k8s-standalone:/home# kubectl get svc/headless -owide
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE   SELECTOR
headless   ClusterIP   None         <none>        80/TCP    76s   app=headless

Như vậy vừa tạo một Headless Svc tên headless, bạn thấy nó có CLUSTER-IP là None, và nó bao bọc các Pod với nhãn là app=test-app, hiện giờ chưa triển khai POD nào có nhãn như vậy nên khi kiểm tra chi tiết Service thấy như sau:

root@k8s-standalone:/home# kubectl describe svc/headless
Name:              headless
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=headless
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

Thấy mục Endpoint là None (không có POD nào), bây giờ triên khai một Deploy tạo POD có nhãn trên

cat > ./nginx-deployment-headless.yaml << OEF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-headless-nginx
spec:
  replicas: 5
  selector:
    matchLabels:
      app: headless
  template:
    metadata:
      labels:
        app: headless
    spec:
      containers:
      - name: nginx
        image: nginx
        resources:
          limits:
            memory: "128Mi"
            cpu: "100m"
        ports:
        - containerPort: 80
        - containerPort: 443
OEF

Sau khi triển khai manifest trên

root@k8s-standalone:/home# kubectl apply -f ./nginx-deployment-headless.yaml
deployment.apps/deploy-headless-nginx created

Verify deployment

root@k8s-standalone:/home# kubectl get deploy
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deploy-headless-nginx   5/5     5            5           15s

Bạn cũng có thể xem chi tiết headless bằng lệnh describe

root@k8s-standalone:/home# kubectl describe svc/headless
Name:              headless
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=headless
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.20.157:80,10.244.20.158:80,10.244.20.159:80 + 2 more...
Session Affinity:  None
Events:            <none>

Kiểm tra lại service headless thấy Endpoint tương ứng với các IP của POD

root@k8s-standalone:/home# kubectl get po -l "app=headless" -o wide
NAME                                     READY   STATUS    RESTARTS   AGE     IP              NODE             NOMINATED NODE   READINESS GATES
deploy-headless-nginx-84f54d7d99-485lm   1/1     Running   0          4m17s   10.244.20.158   k8s-standalone   <none>           <none>
deploy-headless-nginx-84f54d7d99-8c7p5   1/1     Running   0          4m17s   10.244.20.157   k8s-standalone   <none>           <none>
deploy-headless-nginx-84f54d7d99-crp9d   1/1     Running   0          4m17s   10.244.20.169   k8s-standalone   <none>           <none>
deploy-headless-nginx-84f54d7d99-gcwzn   1/1     Running   0          4m17s   10.244.20.160   k8s-standalone   <none>           <none>
deploy-headless-nginx-84f54d7d99-rpkwm   1/1     Running   0          4m17s   10.244.20.159   k8s-standalone   <none>           <none>

Bạn có thể vào một Container trong hệ thống Kubernetes để kiểm tra

root@k8s-standalone:/home# kubectl exec -it po/deploy-headless-nginx-84f54d7d99-485lm bash

Vì một số conntainer không có sẵn lệnh ping hoặc nslookup, hãy thực hiện các lệnh dưới để cài đặt nó (áp dụng với ubuntu)

root@deploy-headless-nginx-84f54d7d99-485lm:/# apt-get update -y
root@deploy-headless-nginx-84f54d7d99-485lm:/# apt-get install iputils-ping
root@deploy-headless-nginx-84f54d7d99-485lm:/# apt-get install dnsutils -y

Hãy thực hiện lệnh ping đến Service headless ta thấy một lần trả về IP của POD chứ không có IP service như trước.

root@deploy-headless-nginx-84f54d7d99-485lm:/# ping headless
PING headless.default.svc.cluster.local (10.244.20.158) 56(84) bytes of data.
64 bytes from deploy-headless-nginx-84f54d7d99-485lm (10.244.20.158): icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from deploy-headless-nginx-84f54d7d99-485lm (10.244.20.158): icmp_seq=2 ttl=64 time=0.041 ms
64 bytes from deploy-headless-nginx-84f54d7d99-485lm (10.244.20.158): icmp_seq=3 ttl=64 time=0.045 ms
64 bytes from deploy-headless-nginx-84f54d7d99-485lm (10.244.20.158): icmp_seq=4 ttl=64 time=0.035 ms
64 bytes from deploy-headless-nginx-84f54d7d99-485lm (10.244.20.158): icmp_seq=5 ttl=64 time=0.037 ms
^C
--- headless.default.svc.cluster.local ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4098ms
rtt min/avg/max/mdev = 0.020/0.035/0.045/0.008 ms

Hoặc dùng lệnh nslookup để phân giải tên headless là những IP nào

root@deploy-headless-nginx-84f54d7d99-485lm:/# nslookup headless
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   headless.default.svc.cluster.local
Address: 10.244.20.169
Name:   headless.default.svc.cluster.local
Address: 10.244.20.157
Name:   headless.default.svc.cluster.local
Address: 10.244.20.159
Name:   headless.default.svc.cluster.local
Address: 10.244.20.160
Name:   headless.default.svc.cluster.local
Address: 10.244.20.158

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories