Administrator
Administrator
发布于 2025-07-07 / 39 阅读
0
0

Kubernetes中跨命名空间访问服务

在Kubernetes(K8s)中,不同命名空间(namespace)下的服务(Service)通常是隔离的。但有时,我们需要实现跨命名空间的服务访问,例如,当某些中间件服务被放置在一个单独的命名空间中时,业务服务需要访问这些中间件服务。这种跨命名空间访问可以通过使用ExternalName类型的Service来实现

实现跨命名空间访问的方法:

例如:default命名空间下有一个服务app1要访问beijia这个命名空间下的ruoyi-gateway服务,访问方式通常有如下两种

1:指定svc的全域名进行访问:ruoyi-gateway.beijia.svc.cluster.local

[root@k8s-master1-60 endpoints]# kubectl run -it --image busybox:1.28.4 test --restart=Never --rm bin/sh

/ # wget -S ruoyi-gateway.beijia.svc.cluster.local:8080
Connecting to ruoyi-gateway.beijia.svc.cluster.local:8080 (10.109.197.239:8080)
  HTTP/1.1 200 OK
  Content-Type: application/json
  content-length: 34
  connection: close
  
wget: can't open 'index.html': File exists

2:示例通过配置如下service的ExternalName方式来进行访问、配置完成后可通过ruoyi-gateway这个svc名称进行访问。需注意对端开放的端口

[root@k8s-master1-60 endpoints]# cat ExternalName.yaml 
kind: Service
apiVersion: v1
metadata:
  name: ruoyi-gateway
  namespace: default
spec:
  type: ExternalName
  sessionAffinity: None
  externalName: ruoyi-gateway.beijia.svc.cluster.local

[root@k8s-master1-60 endpoints]# kubectl get svc ruoyi-gateway -owide
NAME            TYPE           CLUSTER-IP   EXTERNAL-IP                              PORT(S)    AGE   SELECTOR
ruoyi-gateway   ExternalName   <none>       ruoyi-gateway.beijia.svc.cluster.local   8080/TCP   71m   <none>

[root@k8s-master1-60 endpoints]# kubectl run -it --image busybox:1.28.4 test --restart=Never --rm bin/sh

/ # wget -S ruoyi-gateway:8080
Connecting to ruoyi-gateway:8080 (10.109.197.239:8080)
  HTTP/1.1 200 OK
  Content-Type: application/json
  content-length: 34
  connection: close
  
wget: can't open 'index.html': File exists

3:示例:假设redis、mysql这些服务部署在beijia这个命名空间下,然后default命名空间下的微服务需要连接beijia命名空间下的redis服务、这种场景下配置ExternalName类型的Service就很适合 (跨命名空间访问)

[root@k8s-master1-60 endpoints]# cat ExternalName.yaml 
kind: Service
apiVersion: v1
metadata:
  name: redis
  namespace: default
spec:
  type: ExternalName
  sessionAffinity: None
  #redis.beijia.svc.cluster.local这个配置是redis在集群内的dns全名称
  externalName: redis.beijia.svc.cluster.local
  ports:
  - port: 6379
    name: redis

[root@k8s-master1-60 endpoints]# kubectl get svc redis -owide
NAME    TYPE           CLUSTER-IP   EXTERNAL-IP                      PORT(S)    AGE     SELECTOR
redis   ExternalName   <none>       redis.beijia.svc.cluster.local   6379/TCP   7m20s   <none>

[root@k8s-master1-60 endpoints]# kubectl describe svc redis
Name:              redis
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          <none>
Type:              ExternalName
IP Families:       <none>
IP:                
IPs:               <none>
External Name:     redis.beijia.svc.cluster.local
Port:              redis  6379/TCP
TargetPort:        6379/TCP
Endpoints:         <none>
Session Affinity:  None
Events:            <none>

4:配置完成后程序代码里面的配置直接写redis这个service_name就可以了


评论