1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Kubernetes K8S之Pod跨namespace名称空间访问Service服务

Kubernetes K8S之Pod跨namespace名称空间访问Service服务

时间:2020-05-18 06:07:56

相关推荐

Kubernetes K8S之Pod跨namespace名称空间访问Service服务

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是会改变的】。

主机配置规划

创建Service和Pod

相关yaml文件

[root@k8s-master cross_ns]# pwd/root/k8s_practice/cross_ns[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# cat deply_service_myns.yaml apiVersion: v1kind: Namespacemetadata:name: myns---apiVersion: apps/v1kind: Deploymentmetadata:name: myapp-deploy1namespace: mynsspec:replicas: 2selector:matchLabels:app: myapprelease: v1template:metadata:labels:app: myapprelease: v1spec:containers:- name: myappimage: -/google_registry/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80---apiVersion: v1kind: Servicemetadata:name: myapp-clusterip1namespace: mynsspec:type: ClusterIP # 默认类型selector:app: myapprelease: v1ports:- name: httpport: 80targetPort: 80[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# cat deply_service_mytest.yaml apiVersion: v1kind: Namespacemetadata:name: mytest---apiVersion: apps/v1kind: Deploymentmetadata:name: myapp-deploy2namespace: mytestspec:replicas: 2selector:matchLabels:app: myapprelease: v2template:metadata:labels:app: myapprelease: v2spec:containers:- name: myappimage: -/google_registry/myapp:v2imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80---apiVersion: v1kind: Servicemetadata:name: myapp-clusterip2namespace: mytestspec:type: ClusterIP # 默认类型selector:app: myapprelease: v2ports:- name: httpport: 80targetPort: 80

运行yaml文件

kubectl apply -f deply_service_myns.yaml kubectl apply -f deply_service_mytest.yaml

查看myns名称空间信息

[root@k8s-master cross_ns]# kubectl get svc -n myns -o wideNAMETYPE CLUSTER-IPEXTERNAL-IP PORT(S) AGE SELECTORmyapp-clusterip1 ClusterIP 10.100.61.11 <none> 80/TCP 3m app=myapp,release=v1[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# kubectl get deploy -n myns -o wideNAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTORmyapp-deploy1 2/22 2 3m7s myapp -/google_registry/myapp:v1 app=myapp,release=v1[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# kubectl get rs -n myns -o wideNAME DESIRED CURRENT READY AGECONTAINERS IMAGES SELECTORmyapp-deploy1-5b9d78576c 2 2 2 3m15s myapp -/google_registry/myapp:v1 app=myapp,pod-template-hash=5b9d78576c,release=v1[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# kubectl get pod -n myns -o wideNAME READY STATUS RESTARTS AGEIP NODE NOMINATED NODE READINESS GATESmyapp-deploy1-5b9d78576c-wfw4n 1/1Running 03m20s 10.244.2.136 k8s-node02 <none> <none>myapp-deploy1-5b9d78576c-zsfjl 1/1Running 03m20s 10.244.3.193 k8s-node01 <none> <none>

查看mytest名称空间信息

[root@k8s-master cross_ns]# kubectl get svc -n mytest -o wideNAMETYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORmyapp-clusterip2 ClusterIP 10.100.201.103 <none> 80/TCP 4m9s app=myapp,release=v2[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# kubectl get deploy -n mytest -o wideNAME READY UP-TO-DATE AVAILABLE AGECONTAINERS IMAGES SELECTORmyapp-deploy2 2/22 2 4m15s myapp -/google_registry/myapp:v2 app=myapp,release=v2[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# kubectl get rs -n mytest -o wideNAME DESIRED CURRENT READY AGECONTAINERS IMAGES SELECTORmyapp-deploy2-dc8f96497 2 2 2 4m22s myapp -/google_registry/myapp:v2 app=myapp,pod-template-hash=dc8f96497,release=v2[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# kubectl get pod -n mytest -o wideNAME READY STATUS RESTARTS AGEIP NODE NOMINATED NODE READINESS GATESmyapp-deploy2-dc8f96497-nnkqn 1/1Running 04m27s 10.244.3.194 k8s-node01 <none> <none>myapp-deploy2-dc8f96497-w47dt 1/1Running 04m27s 10.244.2.137 k8s-node02 <none> <none>

只看Service和Pod

[root@k8s-master cross_ns]# kubectl get pod -A -o wide | grep -E '(my)|(NAME)'NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmyns myapp-deploy1-5b9d78576c-wfw4n1/1Running 041m 10.244.2.136 k8s-node02 <none> <none>myns myapp-deploy1-5b9d78576c-zsfjl1/1Running 041m 10.244.3.193 k8s-node01 <none> <none>mytest myapp-deploy2-dc8f96497-nnkqn1/1Running 041m 10.244.3.194 k8s-node01 <none> <none>mytest myapp-deploy2-dc8f96497-w47dt1/1Running 041m 10.244.2.137 k8s-node02 <none> <none>[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# [root@k8s-master cross_ns]# kubectl get svc -A -o wide | grep -E '(my)|(NAME)'NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORmyns myapp-clusterip1 ClusterIP 10.100.61.11<none> 80/TCP 41m app=myapp,release=v1mytest myapp-clusterip2 ClusterIP 10.100.201.103 <none> 80/TCP 41m app=myapp,release=v2

pod跨名称空间namespace与Service通信

说明:是通过Service的NAME进行通信,而不是Service的IP【因为每次重启Service,NAME不会改变,而IP是会改变的】。

# 进入ns名称空间下的一个Pod容器[root@k8s-master cross_ns]# kubectl exec -it -n myns myapp-deploy1-5b9d78576c-wfw4n sh/ # cd /root/### 如下说明在同一名称空间下,通信无问题~ # ping myapp-clusterip1 PING myapp-clusterip1 (10.100.61.11): 56 data bytes64 bytes from 10.100.61.11: seq=0 ttl=64 time=0.046 ms64 bytes from 10.100.61.11: seq=1 ttl=64 time=0.081 ms~ # ~ # wget myapp-clusterip1 -O myns.htmlConnecting to myapp-clusterip1 (10.100.61.11:80)myns.html 100%~ # ~ # cat myns.html Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>### 如下说明在不同的名称空间下,通过Service的NAME进行通信存在问题~ # ping myapp-clusterip2ping: bad address 'myapp-clusterip2'~ # ~ # wget myapp-clusterip2 -O mytest.htmlwget: bad address 'myapp-clusterip2'

实现跨namespace与Service通信

通过Service的ExternalName类型即可实现跨namespace名称空间与Service通信。

Service域名格式:$(service name).$(namespace).svc.cluster.local,其中 cluster.local 为指定的集群的域名

相关yaml文件

[root@k8s-master cross_ns]# pwd/root/k8s_practice/cross_ns[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# cat svc_ExternalName_visit.yaml # 实现 myns 名称空间的pod,访问 mytest 名称空间的Service:myapp-clusterip2apiVersion: v1kind: Servicemetadata:name: myapp-clusterip1-externalnamenamespace: mynsspec:type: ExternalNameexternalName: myapp-clusterip2.mytest.svc.cluster.localports:- name: httpport: 80targetPort: 80---# 实现 mytest 名称空间的Pod,访问 myns 名称空间的Service:myapp-clusterip1apiVersion: v1kind: Servicemetadata:name: myapp-clusterip2-externalnamenamespace: mytestspec:type: ExternalNameexternalName: myapp-clusterip1.myns.svc.cluster.localports:- name: httpport: 80targetPort: 80

运行yaml文件

[root@k8s-master cross_ns]# kubectl apply -f svc_ExternalName_visit.yaml[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# kubectl get svc -A -o wide | grep -E '(ExternalName)|(NAME)' NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORmyns myapp-clusterip1-externalname ExternalName <none> myapp-clusterip2.mytest.svc.cluster.local 80/TCP 28s <none>mytest myapp-clusterip2-externalname ExternalName <none> myapp-clusterip1.myns.svc.cluster.local80/TCP 28s <none>

pod跨名称空间namespace与Service通信

到目前所有service和pod信息查看

[root@k8s-master cross_ns]# kubectl get svc -A -o wide | grep -E '(my)|(NAME)'NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORmyns myapp-clusterip1ClusterIP10.100.61.11<none> 80/TCP 62m app=myapp,release=v1myns myapp-clusterip1-externalname ExternalName <none> myapp-clusterip2.mytest.svc.cluster.local 80/TCP 84s <none>mytest myapp-clusterip2ClusterIP10.100.201.103 <none> 80/TCP 62m app=myapp,release=v2mytest myapp-clusterip2-externalname ExternalName <none> myapp-clusterip1.myns.svc.cluster.local80/TCP 84s <none>[root@k8s-master cross_ns]# [root@k8s-master cross_ns]# kubectl get pod -A -o wide | grep -E '(my)|(NAME)'NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmyns myapp-deploy1-5b9d78576c-wfw4n1/1Running 062m 10.244.2.136 k8s-node02 <none> <none>myns myapp-deploy1-5b9d78576c-zsfjl1/1Running 062m 10.244.3.193 k8s-node01 <none> <none>mytest myapp-deploy2-dc8f96497-nnkqn1/1Running 062m 10.244.3.194 k8s-node01 <none> <none>mytest myapp-deploy2-dc8f96497-w47dt1/1Running 062m 10.244.2.137 k8s-node02 <none> <none>

myns 名称空间的pod,访问 mytest 名称空间的Service:myapp-clusterip2

[root@k8s-master cross_ns]# kubectl exec -it -n myns myapp-deploy1-5b9d78576c-wfw4n sh/ # cd /root/### 如下说明在同一名称空间下,通信无问题~ # ping myapp-clusterip1 PING myapp-clusterip1 (10.100.61.11): 56 data bytes64 bytes from 10.100.61.11: seq=0 ttl=64 time=0.057 ms64 bytes from 10.100.61.11: seq=1 ttl=64 time=0.071 ms………………~ # ~ # wget myapp-clusterip1 -O myns.htmlConnecting to myapp-clusterip1 (10.100.61.11:80)myns.html 100%~ # ~ # cat myns.html Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>### 如下说明通过Service externalname类型,实现了Pod跨namespace名称空间与Service访问~ # ping myapp-clusterip1-externalnamePING myapp-clusterip1-externalname (10.100.201.103): 56 data bytes64 bytes from 10.100.201.103: seq=0 ttl=64 time=0.050 ms64 bytes from 10.100.201.103: seq=1 ttl=64 time=0.311 ms………………~ # ~ # wget myapp-clusterip1-externalname -O mytest.htmlConnecting to myapp-clusterip1-externalname (10.100.201.103:80)mytest.html100%~ # ~ # cat mytest.html Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

mytest 名称空间的Pod,访问 myns 名称空间的Service:myapp-clusterip1

[root@k8s-master cross_ns]# kubectl exec -it -n mytest myapp-deploy2-dc8f96497-w47dt sh/ # cd /root/### 如下说明在同一名称空间下,通信无问题~ # ping myapp-clusterip2 PING myapp-clusterip2 (10.100.201.103): 56 data bytes64 bytes from 10.100.201.103: seq=0 ttl=64 time=0.087 ms64 bytes from 10.100.201.103: seq=1 ttl=64 time=0.073 ms………………~ # ~ # wget myapp-clusterip2 -O mytest.htmlConnecting to myapp-clusterip2 (10.100.201.103:80)mytest.html100%~ # ~ # cat mytest.html Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>### 如下说明通过Service externalname类型,实现了Pod跨namespace名称空间与Service访问~ # ping myapp-clusterip2-externalnamePING myapp-clusterip2-externalname (10.100.61.11): 56 data bytes64 bytes from 10.100.61.11: seq=0 ttl=64 time=0.089 ms64 bytes from 10.100.61.11: seq=1 ttl=64 time=0.071 ms………………~ # ~ # wget myapp-clusterip2-externalname -O myns.htmlConnecting to myapp-clusterip2-externalname (10.100.61.11:80)myns.html 100%~ # ~ # cat myns.html Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

由上可见,实现了Pod跨namespace名称空间与Service访问。

完毕!

———END———如果觉得不错就关注下呗 (-^O^-) !

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。