验证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