上面我们提到了创建service后,会自动创建对应的endpoint,这里面的关键在于 selector: app: nginx 基于lables标签选择了一组存在这个标签的pod,然而在我们创建svc时,如果没有定义这个selector,那么系统是不会自动创建endpoint的,我们可不可以手动来创建这个endpoint呢?答案是可以的,在生产中,我们可以通过创建不带selector的Service,然后创建同样名称的endpoint,来关联K8s集群以外的服务,这个具体能带给我们运维人员什么好处呢,就是我们可以直接复用K8s上的ingress(这个后面会讲到,现在我们就当它是一个nginx代理),来访问K8s集群以外的服务,省去了自己搭建前面Nginx代理服务器的麻烦
    开始实践测试
    这里我们挑选node-2节点,用python运行一个简易web服务器

    1. [root@node2 ~]# python -m SimpleHTTPServer 9999
    2. Serving HTTP on 0.0.0.0 port 9999 ...

    然后我们用之前学会的方法,来生成svc和endpoint的yaml配置,并修改成如下内容,并保存为mysvc.yaml
    注意Service和Endpoints的名称必须一致

    1. # 注意我这里把两个资源的yaml写在一个文件内,在实际生产中,我们经常会这么做,方便对一个服务的所有资源进行统一管理,不同资源之间用"---"来分隔
    2. apiVersion: v1
    3. kind: Service
    4. metadata:
    5. name: mysvc
    6. namespace: default
    7. spec:
    8. type: ClusterIP
    9. ports:
    10. - port: 80
    11. protocol: TCP
    12. ---
    13. apiVersion: v1
    14. kind: Endpoints
    15. metadata:
    16. name: mysvc
    17. namespace: default
    18. subsets:
    19. - addresses:
    20. - ip: 172.16.123.62
    21. nodeName: 172.16.123.62
    22. ports:
    23. - port: 9999
    24. protocol: TCP
    [root@master1 ~]# kubectl apply -f mysvc.yaml 
    service/mysvc created
    endpoints/mysvc created
    
    [root@master1 ~]# kubectl get svc,endpoints |grep mysvc
    service/mysvc        ClusterIP   10.68.160.126   <none>        80/TCP         26s
    endpoints/mysvc        172.16.123.62:9999                    26s
    
    [root@master1 ~]# curl 10.68.160.126
    mysvc
    # 我们回到node-2节点上,可以看到有一条刚才的访问日志打印出来了
    172.16.123.63 - - [23/Apr/2021 12:35:15] "GET / HTTP/1.1" 200 -