把集群外部的服务引入到集群内部中来,实现了集群内部pod和集群外 部的服务进行通信
ExternalName 类型的服务适用于外部服务使用域名的方式,缺点是不 能指定端口
注意:
集群内的Pod会继承Node上的DNS解析规则。所以只 要Node可以访问的服务,Pod中也可以访问到, 这就实现了集群内服务 访问集群外服务
vim externelname.yml
apiVersion: v1
kind: Service
metadata:
name: my-externalname
namespace: default
spec:
type: ExternalName
externalName: www.baidu.com # 对应的外部域名为www.baidu.com
kubectl apply -f externelname.yml
kubectl get svc |grep exter
dig -t A my-externalname.default.svc.cluster.local.@10.68.153.83
kubectl exec -it deploy-nginx-6c9764bb69-7k86s -- /bin/sh
/ # nslookup www.baidu.com
/ # nslookup my-externalname.default.svc.cluster.local
解析此my-externalname.default.svc.cluster.local域名和解析 www.baidu.com是一样的结果
vim ns1-nginx.yml
apiVersion: v1
kind: Namespace
metadata:
name: ns1 # 创建ns1命名空间
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
namespace: ns1 # 属于ns1命名空间
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc1 # 服务名
namespace: ns1 # 属于ns1命名空间
spec:
selector:
app: nginx
clusterIP: None # 无头service
ports:
- port: 80
targetPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: external-svc1
namespace: ns1 # 属于ns1命名空间
spec:
type: ExternalName
externalName: svc2.ns2.svc.cluster.local # 将ns2空间的svc2服务引入到ns1命名空间
kubectl apply -f ns1-nginx.yml
vim ns2-nginx.yml
apiVersion: v1
kind: Namespace
metadata:
name: ns2 # 创建ns2命名空间
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-nginx
namespace: ns2 # 属于ns2命名空间
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: svc2 # 服务名
namespace: ns2 # 属于ns2命名空间
spec:
selector:
app: nginx
clusterIP: None # 无头service
ports:
- port: 80
targetPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: external-svc2
namespace: ns2 # 属于ns2命名空间
spec:
type: ExternalName
externalName: svc1.ns1.svc.cluster.local # 将ns1空间的svc1服务引入到ns2命名空间
kubectl apply -f ns2-nginx.yml
kubectl get pods -n ns1
kubectl exec -it -n ns1 deploy-nginx-6c9764bb69-g5xl8 -- /bin/sh
/ # nslookup svc1
/ # nslookup svc2.ns2.svc.cluster.local
/ # nslookup external-svc1.ns1.svc.cluster.local. # 将 ns2里的svc2服务引到了ns1里的名字,也可以访问
/ # exit
kubectl get pods -o wide -n ns1
kubectl get pods -o wide -n ns2
反之,在ns2命名空间的pod里访问ns1里的service也是OK的(请自行验证)
kubectl get pod -n ns2
kubectl delete pod deploy-nginx-6c9764bb69-mk62x -n ns2
?因为有replicas控制器,所以删除pod会自动拉一个起来
kubectl get pod -o wide -n ns2
pod名称变了,IP也变成了172.20.166.187
kubectl exec -it -n ns1 deploy-nginx-6c9764bb69-g5xl8 -- /bin/sh
/ # ping external-svc1.ns1.svc.cluster.local -c 2
/ # exit
原文:https://blog.51cto.com/u_13760351/2721030