在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 exists2:示例:通过配置如下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 exists3:示例:假设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就可以了
