驗證Kubernetes的服務發現機制
服務發現是讓客戶端能夠以固定的方式獲取到后端Pod訪問地址的機制。下面驗證環境變量和DNS這兩種機制。
一、驗證基于環境變量的服務發現機制
對于需要訪問服務的Pod,必須在該Pod創建之前創建Service。
(1)創建Service。
[root@master ~]# vim nginx-deploy-service.yaml
[root@master ~]# cat nginx-deploy-service.yaml
apiVersion: apps/v1 # 版本號
kind: Deployment # 類型為Deployment
metadata: # 元數據name: nginx-deploy labels: # 標簽app: nginx-deploy
spec: # 詳細信息replicas: 2 # 副本數量selector: # 選擇器,指定該控制器管理哪些PodmatchLabels: # 匹配規則app: nginx-podtemplate: # 定義模板,當副本數量不足時會根據模板定義創建Pod副本metadata:labels:app: nginx-pod # Pod的標簽spec:containers: # 容器列表(本例僅定義一個容器)- name: nginx # 容器的名稱image: nginx:1.14.2 # 容器所用的鏡像ports:- name: nginx-portcontainerPort: 80 # 容器需要暴露的端口---
apiVersion: v1
kind: Service
metadata:name: nginx-svc #設置service的顯示名字
spec:ports:- port: 8080 #讓集群知道service綁定的端口targetPort: 80 #目標Pod的端口selector:app: nginx-pod #指定pod的標簽[root@master ~]#
(2)執行一次性創建Deployment和Service
[root@master ~]# kubectl apply -f nginx-deploy-service.yaml
deployment.apps/nginx-deploy created
service/nginx-svc created
[root@master ~]#
(3)基于鏡像創建一個Pod
[root@master ~]# kubectl run nginx --image=nginx:1.14.2
pod/nginx created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 3s
nginx-deploy-59c566bbbb-cm4bz 1/1 Running 0 17m
nginx-deploy-59c566bbbb-n7qsz 1/1 Running 0 17m
(4)執行以下命令列出該Pod的環境變量,并篩選出含NGINX的環境變量
[root@master ~]# kubectl exec nginx -- printenv | grep NGINX
NGINX_SVC_PORT_8080_TCP=tcp://10.108.118.39:8080
NGINX_SVC_SERVICE_PORT=8080
NGINX_SVC_PORT_8080_TCP_PROTO=tcp
NGINX_SVC_SERVICE_HOST=10.108.118.39
NGINX_SVC_PORT=tcp://10.108.118.39:8080
NGINX_SVC_PORT_8080_TCP_PORT=8080
NGINX_SVC_PORT_8080_TCP_ADDR=10.108.118.39
NGINX_VERSION=1.14.2-1~stretch
[root@master ~]#
此pod的環境變量中就包含以上Service的主機地址和端口,可以引用這些環境變量來訪問Service
(5)刪除該pod
[root@master ~]# kubectl delete po nginx
pod "nginx" deleted
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-deploy-59c566bbbb-cm4bz 1/1 Running 0 19m
nginx-deploy-59c566bbbb-n7qsz 1/1 Running 0 19m
[root@master ~]#
(6)創建測試用的名稱空間
[root@master ~]# kubectl create namespace test-ns
namespace/test-ns created
[root@master ~]# kubectl get namespace
NAME STATUS AGE
default Active 26d
kube-node-lease Active 26d
kube-public Active 26d
kube-system Active 26d
test-ns Active 3s
(7)創建一個屬于test-ns名稱空間的pod
[root@master ~]# kubectl run nginx --image=nginx:1.14.2 -n test-ns
pod/nginx created
(8)查看名稱空間test-ns中名稱為nginx的pod相關環境變量
[root@master ~]# kubectl exec nginx -n test-ns -- printenv | grep NGINX
NGINX_VERSION=1.14.2-1~stretch
可以發現沒有與Service相關的環境變量,這是因為該pod與該service分屬不同的名稱空間,該service屬于默認的名稱空間,彼此隔離,無法訪問
(9)刪除新創建的pod
[root@master ~]# kubectl delete pod nginx -n test-ns
pod "nginx" deleted
[root@master ~]# kubectl get pod -n test-ns
No resources found in test-ns namespace.
[root@master ~]# kubectl delete -f nginx-deploy-service.yaml
deployment.apps "nginx-deploy" deleted
service "nginx-svc" deleted