热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

k8spod跨namespace访问service

###1、场景需求场景需求:Kubernetes的三个Service(ServiceA0、serviceA1、ServiceB)和对应的Pod(PodA0、podA1、PodB)分

###


1、场景需求

场景需求:
Kubernetes的三个Service(ServiceA0、serviceA1、ServiceB)和对应的Pod(PodA0、podA1、PodB)分别属于不同的namespace名称空间,
现需要PodA0、podA1跨namespace并通过servic实现访问PodB。如何实现?
说明:这里是指通过Service的Name进行通信访问,而不是通过Service的IP【因因为每次重启Service,NAME不会改变,而IP是会改变的】。
注释:此方法多用于 不同namespase01、namespace02、namespace03下pod 访问namespace04中的中间件服务(多对一)

 


2、主机配置简介

服务器名称(hostname)   系统版本     配置     服务器IP      
k8s
-master     CentOS7.5 2C/4G/20G 192.168.2.140
k8s
-node01     CentOS7.5 2C/4G/20G 192.168.2.141
k8s
-node02     CentOS7.5 2C/4G/20G 192.168.2.142

3、创建test-namespace-A命名空间、service、pod的yaml文件

[root@k8s-master service-pod-yarm]# pwd
/root/k8s_yarm/service-pod-yarm
[root@k8s
-master service-pod-yarm]#
[root@k8s
-master service-pod-yarm]# cat deply_service_service-pod-A0.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
-namespace-A
---
apiVersion: apps
/v1
kind: Deployment
metadata:
name: pod
-A0
namespace: test-namespace-A
spec:
replicas: 1

selector:
matchLabels:
app: test
-A0
release: v1
template:
metadata:
labels:
app: test
-A0
release: v1
spec:
containers:
- name: test-A0
image: registry.cn
-beijing.aliyuncs.com/google_registry/nginx:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort:
80
---
apiVersion: v1
kind: Service
metadata:
name: service
-A0-svc
namespace: test-namespace-A
spec:
type: ClusterIP # 默认类型
selector:
app: test
-A0
release: v1
ports:
- name: http
port:
80
targetPort:
80
#
==================================================================================
#
==================================================================================
[root@k8s
-master service-pod-yarm]# cat deply_service_service-pod-A1.yaml
apiVersion: apps
/v1
kind: Deployment
metadata:
name: pod
-A1
namespace: test-namespace-A
spec:
replicas: 1

selector:
matchLabels:
app: test
-A1
release: v2
template:
metadata:
labels:
app: test
-A1
release: v2
spec:
containers:
- name: test-A1
image: registry.cn
-beijing.aliyuncs.com/google_registry/nginx:v2
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort:
80
---
apiVersion: v1
kind: Service
metadata:
name: service
-A1-svc
namespace: test-namespace-A
spec:
type: ClusterIP # 默认类型
selector:
app: test
-A1
release: v2
ports:
- name: http
port:
80
targetPort:
80

4、创建test-namespace-B命名空间、service、pod的yaml文件

[root@k8s-master service-pod-yarm]# pwd
/root/k8s_yarm/service-pod-yarm
[root@k8s
-master service-pod-yarm]#
[root@k8s
-master service-pod-yarm]# cat deply_service_service-pod-B0.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test
-namespace-B
---
apiVersion: apps
/v1
kind: Deployment
metadata:
name: pod
-B0
namespace: test-namespace-B
spec:
replicas: 1

selector:
matchLabels:
app: test
-B0
release: v1
template:
metadata:
labels:
app: test
-B0
release: v1
spec:
containers:
- name: test-B0
image: registry.cn
-beijing.aliyuncs.com/google_registry/test:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort:
80
---
apiVersion: v1
kind: Service
metadata:
name: service
-B0-svc
namespace: test-namespace-B
spec:
type: ClusterIP # 默认类型
selector:
app: test
-B0
release: v1
ports:
- name: http
port:
80
targetPort:
80

5、运行yarm文件

kubectl apply -f deply_service_service-pod-A0.yaml
kubectl apply
-f deply_service_service-pod-A1.yaml
kubectl apply
-f deply_service_service-pod-B0.yaml

6、查看上述部署2个命名空间下 service、pod

[root@k8s-master service-pod-yarm]# kubectl get pod,svc -A -o wide|grep -E "(test-namespace-A)|(test-namespace-B)|(NAMESPACE)"
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-namespace-A pod/pod-A0-5b9d78576c-wfw4n 1/1 Running 0 41m 10.244.2.136 k8s-node02
test
-namespace-A pod/pod-A1-5b9d78576c-zsfjl 1/1 Running 0 41m 10.244.2.193 k8s-node01
test
-namespace-B pod/pod-B0-dc8f96497-nnkqn 1/1 Running 0 41m 10.244.3.194 k8s-node01
NAMESPACE NAME      TYPE CLUSTER
-IP EXTERNAL-IP PORT(S) AGE SELECTOR
test
-namespace-A service/service-A0-svc ClusterIP 10.100.61.11 80/TCP 41m app=test-A0,release=v1
test
-namespace-A service/service-A1-svc ClusterIP 10.100.61.141 80/TCP 41m app=test-A1,release=v1
test
-namespace-B service/service-B0-svc ClusterIP 10.100.201.103 80/TCP 41m app=test-B0,release=v2

 7、测试同命名空间下pod 访问service(注:此处测试pod跨namespace无法访问service)


 7.1、进入ns名称空间下的一个Pod容器,测试在同一名称空间下,通信无问题


[root@k8s
-master service-pod-yarm]# kubectl exec -it -n test-namespace-A pod-A0-5b9d78576c-wfw4n /bin/bash
/ # ping service-A0-svc -c 2
PING service
-A0 (10.100.61.11): 56 data bytes
64 bytes from 10.100.61.11: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 10.100.61.11: icmp_seq=2 ttl=64 time=0.035 ms
--- service-A0.test-namespace-A.svc.cluster.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min
/avg/max/mdev = 0.033/0.034/0.035/0.001 ms
/ # curl -I service-A0-svc
HTTP
/1.1 200 OK
Date: Tue,
07 Dec 2021 11:20:52 GMT
Content
-Language: zh-CN
Content
-Type: text/html;charset=utf-8
Content
-Length: 16735
/ # ######################################################################
/ # ping service-A1-svc -c 2
PING service
-A1 (10.100.61.141): 56 data bytes
64 bytes from 10.100.61.141: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 10.100.61.141: icmp_seq=2 ttl=64 time=0.035 ms
--- service-A1.test-namespace-A.svc.cluster.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min
/avg/max/mdev = 0.033/0.034/0.035/0.001 ms
/ # curl -I service-A1-svc
HTTP
/1.1 200 OK
Date: Tue,
07 Dec 2021 11:21:54 GMT
Content
-Language: zh-CN
Content
-Type: text/html;charset=utf-8
Content
-Length: 16735

7.2、进入ns名称空间下的一个Pod容器,测试在不同一名称空间下通信(pod无法跨namespace访问service)

[root@k8s-master service-pod-yarm]# kubectl exec -it -n test-namespace-A pod-A0-5b9d78576c-wfw4n /bin/bash
/ # ping dservice-B0-svc
ping: service
-B0-svc : Name or service not known
/ # curl dservice-B0-svc
curl: (
6) Could not resolve host: service-B0-svc

8、实现跨namespace与Service通信

通过Service的ExternalName类型即可实现跨namespace名称空间与Service通信。
Service域名格式:$(service name).$(
namespace).svc.cluster.local,其中 cluster.local 为指定的集群的域名

8.1、创建ExternalName类型service的yaml文件【实现 test-namespace-A 名称空间的pod,访问 test-namespace-B 名称空间的Service:service-B0-svc】

[root@k8s-master service-pod-yarm]# pwd
/root/k8s_yarm/service-pod-yarm
[root@k8s-master service-pod-yarm]# cat svc_ExternalName_visit.yaml 
apiVersion: v1
kind: Service
metadata:
name: access
-ping-test-namespace-B-svc
namespace: test-namespace-A
spec:
type: ExternalName
externalName: service
-B0-svc.test-namespace-B.svc.cluster.local
ports:
- name: http
port:
80
targetPort:
80

8.2、运行yarm文件

kubectl apply -fsvc_ExternalName_visit.yaml

9、查看此时2个命名空间svc,pod

[root@k8s-master service-pod-yarm]# kubectl get pod,svc -A -o wide|grep -E "(test-namespace-A)|(test-namespace-B)|(NAMESPACE)"
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test
-namespace-A pod/pod-A0-5b9d78576c-wfw4n 1/1 Running 0 41m 10.244.2.136 k8s-node02
test
-namespace-A pod/pod-A1-5b9d78576c-zsfjl 1/1 Running 0 41m 10.244.2.193 k8s-node01
test
-namespace-B pod/pod-B0-dc8f96497-nnkqn 1/1 Running 0 41m 10.244.3.194 k8s-node01
NAMESPACE NAME TYPE CLUSTER
-IP EXTERNAL-IP PORT(S) AGE SELECTOR
test
-namespace-A service/service-A0-svc ClusterIP 10.100.61.11 80/TCP 41m app=test-A0,release=v1
test
-namespace-A service/service-A1-svc ClusterIP 10.100.61.141 80/TCP 41m app=test-A1,release=v1
test
-namespace-B service/service-B0-svc ClusterIP 10.100.201.103 80/TCP 41m app=test-B0,release=v2
test
-namespace-A service/access-ping-test-namespace-B-svc ExternalName service-B0-svc.test-namespace-B.svc.cluster.local 92m

10、测试pod跨namespace 访问service(可以跨namespace访问)

[root@k8s-master service-pod-yarm]# kubectl exec -it -n test-namespace-A pod-A0-5b9d78576c-wfw4n /bin/bash
/ # ping service-B0-svc.test-namespace-B.svc.cluster.local -c 2
PING service
-A0 (10.100.61.11): 56 data bytes
64 bytes from 10.100.61.11: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 10.100.61.11: icmp_seq=2 ttl=64 time=0.035 ms
--- service-A0.test-namespace-A.svc.cluster.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min
/avg/max/mdev = 0.033/0.034/0.035/0.001 ms
/ # curl -I service-B0-svc.test-namespace-B.svc.cluster.local
HTTP
/1.1 200 OK
Date: Tue,
07 Dec 2021 11:20:52 GMT
Content
-Language: zh-CN
Content
-Type: text/html;charset=utf-8
Content
-Length: 16735
[root@k8s
-master service-pod-yarm]# kubectl exec -it -n test-namespace-A pod-A1-5b9d78576c-zsfjl /bin/bash
/ # ping service-B0-svc.test-namespace-B.svc.cluster.local -c 2
PING service
-A0 (10.100.61.11): 56 data bytes
64 bytes from 10.100.61.11: icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from 10.100.61.11: icmp_seq=2 ttl=64 time=0.035 ms
--- service-A0.test-namespace-A.svc.cluster.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min
/avg/max/mdev = 0.033/0.034/0.035/0.001 ms
/ # curl -I service-B0-svc.test-namespace-B.svc.cluster.local
HTTP
/1.1 200 OK
Date: Tue,
07 Dec 2021 11:20:52 GMT
Content
-Language: zh-CN
Content
-Type: text/html;charset=utf-8
Content
-Length: 16735

11、附加:

如果想要
命名空间test
-namespace-B下pod-B0-dc8f96497-nnkqn访问
命名空间test
-namespace-A下所有servcie
需要在test
-namespace-B命名空间下
创建两个不同ExternalName类型的svc
示例创建service的yarm文件:
[root@k8s-master service-pod-yarm]# vim svc_ExternalName_B0_to_A_visit.yaml
apiVersion: v1
kind: Service
metadata:
name: access
-B0-to-A0-svc
namespace: test-namespace-B
spec:
type: ExternalName
externalName: service
-A0-svc.test-namespace-A.svc.cluster.local
ports:
- name: http
port:
80
targetPort:
80
---
apiVersion: v1
kind: Service
metadata:
name: access
-B0-to-A1-svc
namespace: test-namespace-B
spec:
type: ExternalName
externalName: service
-A1-svc.test-namespace-A.svc.cluster.local
ports:
- name: http
port:
80
targetPort:
80

 

###



推荐阅读
  • Windows环境下部署Kubernetes Dashboard指南
    本指南详细介绍了如何在Windows系统中部署Kubernetes Dashboard,包括下载最新配置文件、修改服务类型以支持NodePort访问、下载所需镜像并启动Dashboard服务等步骤。 ... [详细]
  • Ralph的Kubernetes进阶之旅:集群架构与对象解析
    本文深入探讨了Kubernetes集群的架构和核心对象,详细介绍了Pod、Service、Volume等基本组件,以及更高层次的抽象如Deployment、StatefulSet等,帮助读者全面理解Kubernetes的工作原理。 ... [详细]
  • 深入探讨配置文件的管理与优化
    尽管配置文件的重要性不言而喻,但其管理和安全性问题却常被忽视。本文将详细讨论配置文件的不同管理策略及其优缺点。 ... [详细]
  • 本文深入探讨了Kubernetes中Pod的基础概念及其分类,旨在帮助读者更好地理解和利用这一核心组件。通过详细的解析,我们将了解Pod如何作为最小的部署单元在Kubernetes集群中工作。 ... [详细]
  • Kubernetes 实践指南:初次体验
    本文介绍了如何通过官方提供的简易示例,快速上手 Kubernetes (K8S),并深入理解其核心概念和操作流程。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 本文介绍了如何解决Docker在启动过程中遇到的‘无法删除默认桥网络:网桥具有活动端点’的问题,提供了详细的步骤和补充说明。 ... [详细]
  • ServiceStack与Swagger的无缝集成指南
    本文详细介绍了如何在ServiceStack项目中集成Swagger,以实现API文档的自动生成和在线测试。通过本指南,您将了解从配置到部署的完整流程,并掌握如何优化API接口的开发和维护。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • 本文详细介绍如何使用Samba软件配置CIFS文件共享服务,涵盖安装、配置、权限管理及多用户挂载等关键步骤。通过具体示例和命令行操作,帮助读者快速搭建并优化Samba服务器。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 该平台旨在为大型企业提供一个高效、灵活且可扩展的分布式微服务架构解决方案。它采用模块化、微服务化和热部署的设计理念,结合当前最先进且无商业限制的主流开源技术,如Spring Cloud、Spring Boot2、MyBatis、OAuth2和Element UI,实现前后端分离的系统管理平台。 ... [详细]
  • 本文详细探讨了JDBC(Java数据库连接)的内部机制,重点分析其作为服务提供者接口(SPI)框架的应用。通过类图和代码示例,展示了JDBC如何注册驱动程序、建立数据库连接以及执行SQL查询的过程。 ... [详细]
  • Kubernetes与Docker cgroup驱动不匹配问题及解决方案
    当Kubernetes (k8s) 的cgroup驱动设置为systemd,而Docker使用的是cgroupfs时,这种不一致性可能导致kubectl命令执行失败。本文将详细介绍如何检查和调整Docker的cgroup驱动以确保与Kubernetes兼容。 ... [详细]
author-avatar
马里奥毛瑞尔小P
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有