首页 > 其他 > 详细

K8S service (四)

时间:2021-04-21 10:46:01      阅读:24      评论:0      收藏:0      [点我收藏+]
ExternalName

把集群外部的服务引入到集群内部中来,实现了集群内部pod和集群外 部的服务进行通信
ExternalName 类型的服务适用于外部服务使用域名的方式,缺点是不 能指定端口

注意:

集群内的Pod会继承Node上的DNS解析规则。所以只 要Node可以访问的服务,Pod中也可以访问到, 这就实现了集群内服务 访问集群外服务

一、将公网域名引入

1, 编写YAML文件

vim externelname.yml

apiVersion: v1
kind: Service
metadata:
  name: my-externalname
  namespace: default
spec:
  type: ExternalName
  externalName: www.baidu.com                  # 对应的外部域名为www.baidu.com

2, 应用YAML文件

kubectl apply -f externelname.yml
kubectl get svc |grep exter

技术分享图片

3, 查看my-service的dns解析

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是一样的结果

二、不同namespace服务名引入

1, 创建ns1命名空间和相关deploy, pod,service

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

2.创建ns2命名空间和相关deploy, pod,service

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

3, 在ns1命名空间的pod里验证

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的(请自行验证)

4, 验证ns2中的pod的IP变化, ns1中的pod仍然可以使用访问

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

5.回到ns1中的pod验证

kubectl exec -it -n ns1 deploy-nginx-6c9764bb69-g5xl8 -- /bin/sh
/ # ping external-svc1.ns1.svc.cluster.local -c 2
/ # exit

技术分享图片

K8S service (四)

原文:https://blog.51cto.com/u_13760351/2721030

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!