Kubernetes的两个Service(ServiceA、ServiceB)和对应的Pod(PodA、PodB)分别属于不同的namespace名称空间,现需要PodA和PodB跨namespace名称空间并通过Service实现互访。应该如何实现?
场景需求
Kubernetes的两个Service(ServiceA、ServiceB)和对应的Pod(PodA、PodB)分别属于不同的namespace名称空间,现需要PodA和PodB跨namespace名称空间并通过Service实现互访。如何实现?
说明:这里是指通过Service的Name进行通信访问,而不是通过Service的IP【因因为每次重启Service,NAME不会改变,而IP是会改变的】。
主机配置规划
服务器名称(hostname) | 系统版本 | 配置 | 内网IP | 外网IP(模拟) |
---|---|---|---|---|
k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 |
k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 |
k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 |
创建Service和Pod
相关yaml文件
1 | [root@k8s-master cross_ns]# pwd |
运行yaml文件
1 | kubectl apply -f deply_service_myns.yaml |
查看myns名称空间信息
1 | [root@k8s-master cross_ns]# kubectl get svc -n myns -o wide |
查看mytest名称空间信息
1 | [root@k8s-master cross_ns]# kubectl get svc -n mytest -o wide |
只看Service和Pod
1 | [root@k8s-master cross_ns]# kubectl get pod -A -o wide | grep -E '(my)|(NAME)' |
pod跨名称空间namespace与Service通信
说明:是通过Service的NAME进行通信,而不是Service的IP【因为每次重启Service,NAME不会改变,而IP是会改变的】。
1 | # 进入ns名称空间下的一个Pod容器 |
实现跨namespace与Service通信
通过Service的ExternalName类型即可实现跨namespace名称空间与Service通信。
Service域名格式:$(service name).$(namespace).svc.cluster.local
,其中 cluster.local 为指定的集群的域名
相关yaml文件
1 | [root@k8s-master cross_ns]# pwd |
运行yaml文件
1 | [root@k8s-master cross_ns]# kubectl apply -f svc_ExternalName_visit.yaml |
pod跨名称空间namespace与Service通信
到目前所有service和pod信息查看
1 | [root@k8s-master cross_ns]# kubectl get svc -A -o wide | grep -E '(my)|(NAME)' |
myns 名称空间的pod,访问 mytest 名称空间的Service:myapp-clusterip2
1 | [root@k8s-master cross_ns]# kubectl exec -it -n myns myapp-deploy1-5b9d78576c-wfw4n sh |
mytest 名称空间的Pod,访问 myns 名称空间的Service:myapp-clusterip1
1 | [root@k8s-master cross_ns]# kubectl exec -it -n mytest myapp-deploy2-dc8f96497-w47dt sh |
由上可见,实现了Pod跨namespace名称空间与Service访问。
完毕!