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