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

 

主机配置规划

服务器名称(hostname)系统版本配置内网IP外网IP(模拟)
k8s-masterCentOS7.72C/4G/20G172.16.1.11010.0.0.110
k8s-node01CentOS7.72C/4G/20G172.16.1.11110.0.0.111
k8s-node02CentOS7.72C/4G/20G172.16.1.11210.0.0.112

 

创建Service和Pod

相关yaml文件

 1 [root@k8s-master cross_ns]# pwd

2 /root/k8s_practice/cross_ns

3 [root@k8s-master cross_ns]#

4 [root@k8s-master cross_ns]# cat deply_service_myns.yaml

5apiVersion: v1

6kind: Namespace

7metadata:

8 name: myns

9 ---

10 apiVersion: apps/v1

11kind: Deployment

12metadata:

13 name: myapp-deploy1

14 namespace: myns

15spec:

16 replicas: 2

17 selector:

18 matchLabels:

19 app: myapp

20 release: v1

21 template:

22 metadata:

23 labels:

24 app: myapp

25 release: v1

26 spec:

27 containers:

28 - name: myapp

29 image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1

30 imagePullPolicy: IfNotPresent

31 ports:

32 - name: http

33 containerPort: 80

34 ---

35apiVersion: v1

36kind: Service

37metadata:

38 name: myapp-clusterip1

39 namespace: myns

40spec:

41 type: ClusterIP # 默认类型

42 selector:

43 app: myapp

44 release: v1

45 ports:

46 - name: http

47 port: 80

48 targetPort: 80

49

50 [root@k8s-master cross_ns]#

51 [root@k8s-master cross_ns]# cat deply_service_mytest.yaml

52apiVersion: v1

53kind: Namespace

54metadata:

55 name: mytest

56 ---

57 apiVersion: apps/v1

58kind: Deployment

59metadata:

60 name: myapp-deploy2

61 namespace: mytest

62spec:

63 replicas: 2

64 selector:

65 matchLabels:

66 app: myapp

67 release: v2

68 template:

69 metadata:

70 labels:

71 app: myapp

72 release: v2

73 spec:

74 containers:

75 - name: myapp

76 image: registry.cn-beijing.aliyuncs.com/google_registry/myapp:v2

77 imagePullPolicy: IfNotPresent

78 ports:

79 - name: http

80 containerPort: 80

81 ---

82apiVersion: v1

83kind: Service

84metadata:

85 name: myapp-clusterip2

86 namespace: mytest

87spec:

88 type: ClusterIP # 默认类型

89 selector:

90 app: myapp

91 release: v2

92 ports:

93 - name: http

94 port: 80

95 targetPort: 80

 

运行yaml文件

1 kubectl apply -f deply_service_myns.yaml

2 kubectl apply -f deply_service_mytest.yaml

 

查看myns名称空间信息

 1 [root@k8s-master cross_ns]# kubectl get svc -n myns -o wide

2 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR

3 myapp-clusterip1 ClusterIP 10.100.61.11 <none> 80/TCP 3m app=myapp,release=v1

4 [root@k8s-master cross_ns]#

5 [root@k8s-master cross_ns]# kubectl get deploy -n myns -o wide

6 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR

7 myapp-deploy1 2/222 3m7s myapp registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp,release=v1

8 [root@k8s-master cross_ns]#

9 [root@k8s-master cross_ns]# kubectl get rs -n myns -o wide

10NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR

11 myapp-deploy1-5b9d78576c 222 3m15s myapp registry.cn-beijing.aliyuncs.com/google_registry/myapp:v1 app=myapp,pod-template-hash=5b9d78576c,release=v1

12 [root@k8s-master cross_ns]#

13 [root@k8s-master cross_ns]# kubectl get pod -n myns -o wide

14NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

15 myapp-deploy1-5b9d78576c-wfw4n 1/1 Running 0 3m20s 10.244.2.136 k8s-node02 <none> <none>

16 myapp-deploy1-5b9d78576c-zsfjl 1/1 Running 0 3m20s 10.244.3.193 k8s-node01 <none> <none>

 

查看mytest名称空间信息

 1 [root@k8s-master cross_ns]# kubectl get svc -n mytest -o wide

2 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR

3 myapp-clusterip2 ClusterIP 10.100.201.103 <none> 80/TCP 4m9s app=myapp,release=v2

4 [root@k8s-master cross_ns]#

5 [root@k8s-master cross_ns]# kubectl get deploy -n mytest -o wide

6 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR

7 myapp-deploy2 2/222 4m15s myapp registry.cn-beijing.aliyuncs.com/google_registry/myapp:v2 app=myapp,release=v2

8 [root@k8s-master cross_ns]#

9 [root@k8s-master cross_ns]# kubectl get rs -n mytest -o wide

10NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR

11 myapp-deploy2-dc8f96497 222 4m22s myapp registry.cn-beijing.aliyuncs.com/google_registry/myapp:v2 app=myapp,pod-template-hash=dc8f96497,release=v2

12 [root@k8s-master cross_ns]#

13 [root@k8s-master cross_ns]# kubectl get pod -n mytest -o wide

14NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

15 myapp-deploy2-dc8f96497-nnkqn 1/1 Running 0 4m27s 10.244.3.194 k8s-node01 <none> <none>

16 myapp-deploy2-dc8f96497-w47dt 1/1 Running 0 4m27s 10.244.2.137 k8s-node02 <none> <none>

 

只看Service和Pod

 1 [root@k8s-master cross_ns]# kubectl get pod -A -o wide | grep -E '(my)|(NAME)'

2NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

3 myns myapp-deploy1-5b9d78576c-wfw4n 1/1 Running 0 41m 10.244.2.136 k8s-node02 <none> <none>

4 myns myapp-deploy1-5b9d78576c-zsfjl 1/1 Running 0 41m 10.244.3.193 k8s-node01 <none> <none>

5 mytest myapp-deploy2-dc8f96497-nnkqn 1/1 Running 0 41m 10.244.3.194 k8s-node01 <none> <none>

6 mytest myapp-deploy2-dc8f96497-w47dt 1/1 Running 0 41m 10.244.2.137 k8s-node02 <none> <none>

7 [root@k8s-master cross_ns]#

8 [root@k8s-master cross_ns]#

9 [root@k8s-master cross_ns]# kubectl get svc -A -o wide | grep -E '(my)|(NAME)'

10 NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR

11 myns myapp-clusterip1 ClusterIP 10.100.61.11 <none> 80/TCP 41m app=myapp,release=v1

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

 

 1# 进入ns名称空间下的一个Pod容器

2 [root@k8s-master cross_ns]# kubectl exec -it -n myns myapp-deploy1-5b9d78576c-wfw4n sh

3 / # cd /root/

4### 如下说明在同一名称空间下,通信无问题

5 ~ # ping myapp-clusterip1

6 PING myapp-clusterip1 (10.100.61.11): 56 data bytes

764 bytes from 10.100.61.11: seq=0 ttl=64time=0.046 ms

864 bytes from 10.100.61.11: seq=1 ttl=64time=0.081 ms

9 ~ #

10 ~ # wget myapp-clusterip1 -O myns.html

11 Connecting to myapp-clusterip1 (10.100.61.11:80)

12 myns.html 100%

13 ~ #

14 ~ # cat myns.html

15 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

16

17### 如下说明在不同的名称空间下,通过Service的NAME进行通信存在问题

18 ~ # ping myapp-clusterip2

19ping: bad address 'myapp-clusterip2'

20 ~ #

21 ~ # wget myapp-clusterip2 -O mytest.html

22wget: bad address 'myapp-clusterip2'

 

 

实现跨namespace与Service通信

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

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

相关yaml文件

 1 [root@k8s-master cross_ns]# pwd

2 /root/k8s_practice/cross_ns

3 [root@k8s-master cross_ns]#

4 [root@k8s-master cross_ns]# cat svc_ExternalName_visit.yaml

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

6apiVersion: v1

7kind: Service

8metadata:

9 name: myapp-clusterip1-externalname

10 namespace: myns

11spec:

12 type: ExternalName

13 externalName: myapp-clusterip2.mytest.svc.cluster.local

14 ports:

15 - name: http

16 port: 80

17 targetPort: 80

18 ---

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

20apiVersion: v1

21kind: Service

22metadata:

23 name: myapp-clusterip2-externalname

24 namespace: mytest

25spec:

26 type: ExternalName

27 externalName: myapp-clusterip1.myns.svc.cluster.local

28 ports:

29 - name: http

30 port: 80

31 targetPort: 80

 

运行yaml文件

1 [root@k8s-master cross_ns]# kubectl apply -f svc_ExternalName_visit.yaml

2 [root@k8s-master cross_ns]#

3 [root@k8s-master cross_ns]# kubectl get svc -A -o wide | grep -E '(ExternalName)|(NAME)'

4 NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR

5 myns myapp-clusterip1-externalname ExternalName <none> myapp-clusterip2.mytest.svc.cluster.local 80/TCP 28s <none>

6 mytest myapp-clusterip2-externalname ExternalName <none> myapp-clusterip1.myns.svc.cluster.local 80/TCP 28s <none>

 

pod跨名称空间namespace与Service通信

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

 1 [root@k8s-master cross_ns]# kubectl get svc -A -o wide | grep -E '(my)|(NAME)'

2 NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR

3 myns myapp-clusterip1 ClusterIP 10.100.61.11 <none> 80/TCP 62m app=myapp,release=v1

4 myns myapp-clusterip1-externalname ExternalName <none> myapp-clusterip2.mytest.svc.cluster.local 80/TCP 84s <none>

5 mytest myapp-clusterip2 ClusterIP 10.100.201.103 <none> 80/TCP 62m app=myapp,release=v2

6 mytest myapp-clusterip2-externalname ExternalName <none> myapp-clusterip1.myns.svc.cluster.local 80/TCP 84s <none>

7 [root@k8s-master cross_ns]#

8 [root@k8s-master cross_ns]# kubectl get pod -A -o wide | grep -E '(my)|(NAME)'

9NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

10 myns myapp-deploy1-5b9d78576c-wfw4n 1/1 Running 0 62m 10.244.2.136 k8s-node02 <none> <none>

11 myns myapp-deploy1-5b9d78576c-zsfjl 1/1 Running 0 62m 10.244.3.193 k8s-node01 <none> <none>

12 mytest myapp-deploy2-dc8f96497-nnkqn 1/1 Running 0 62m 10.244.3.194 k8s-node01 <none> <none>

13 mytest myapp-deploy2-dc8f96497-w47dt 1/1 Running 0 62m 10.244.2.137 k8s-node02 <none> <none>

 

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

 1 [root@k8s-master cross_ns]# kubectl exec -it -n myns myapp-deploy1-5b9d78576c-wfw4n sh

2 / # cd /root/

3### 如下说明在同一名称空间下,通信无问题

4 ~ # ping myapp-clusterip1

5 PING myapp-clusterip1 (10.100.61.11): 56 data bytes

664 bytes from 10.100.61.11: seq=0 ttl=64time=0.057 ms

764 bytes from 10.100.61.11: seq=1 ttl=64time=0.071 ms

8………………

9 ~ #

10 ~ # wget myapp-clusterip1 -O myns.html

11 Connecting to myapp-clusterip1 (10.100.61.11:80)

12 myns.html 100%

13 ~ #

14 ~ # cat myns.html

15 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

16

17### 如下说明通过Service externalname类型,实现了Pod跨namespace名称空间与Service访问

18 ~ # ping myapp-clusterip1-externalname

19 PING myapp-clusterip1-externalname (10.100.201.103): 56 data bytes

2064 bytes from 10.100.201.103: seq=0 ttl=64time=0.050 ms

2164 bytes from 10.100.201.103: seq=1 ttl=64time=0.311 ms

22………………

23 ~ #

24 ~ # wget myapp-clusterip1-externalname -O mytest.html

25 Connecting to myapp-clusterip1-externalname (10.100.201.103:80)

26 mytest.html 100%

27 ~ #

28 ~ # cat mytest.html

29 Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

 

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

 1 [root@k8s-master cross_ns]# kubectl exec -it -n mytest myapp-deploy2-dc8f96497-w47dt sh

2 / # cd /root/

3### 如下说明在同一名称空间下,通信无问题

4 ~ # ping myapp-clusterip2

5 PING myapp-clusterip2 (10.100.201.103): 56 data bytes

664 bytes from 10.100.201.103: seq=0 ttl=64time=0.087 ms

764 bytes from 10.100.201.103: seq=1 ttl=64time=0.073 ms

8………………

9 ~ #

10 ~ # wget myapp-clusterip2 -O mytest.html

11 Connecting to myapp-clusterip2 (10.100.201.103:80)

12 mytest.html 100%

13 ~ #

14 ~ # cat mytest.html

15 Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

16

17### 如下说明通过Service externalname类型,实现了Pod跨namespace名称空间与Service访问

18 ~ # ping myapp-clusterip2-externalname

19 PING myapp-clusterip2-externalname (10.100.61.11): 56 data bytes

2064 bytes from 10.100.61.11: seq=0 ttl=64time=0.089 ms

2164 bytes from 10.100.61.11: seq=1 ttl=64time=0.071 ms

22………………

23 ~ #

24 ~ # wget myapp-clusterip2-externalname -O myns.html

25 Connecting to myapp-clusterip2-externalname (10.100.61.11:80)

26 myns.html 100%

27 ~ #

28 ~ # cat myns.html

29 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

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

 

完毕!

 

 


 

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

 

以上是 Kubernetes m6S之Pod跨namespace名称空间访问Service服务 的全部内容, 来源链接: utcz.com/a/48398.html

回到顶部