上面我们提到了创建service后,会自动创建对应的endpoint,这里面的关键在于 selector: app: nginx 基于lables标签选择了一组存在这个标签的pod,然而在我们创建svc时,如果没有定义这个selector,那么系统是不会自动创建endpoint的,我们可不可以手动来创建这个endpoint呢?答案是可以的,在生产中,我们可以通过创建不带selector的Service,然后创建同样名称的endpoint,来关联K8s集群以外的服务,这个具体能带给我们运维人员什么好处呢,就是我们可以直接复用K8s上的ingress(这个后面会讲到,现在我们就当它是一个nginx代理),来访问K8s集群以外的服务,省去了自己搭建前面Nginx代理服务器的麻烦
开始实践测试
这里我们挑选node-2节点,用python运行一个简易web服务器
[root@node2 ~]# python -m SimpleHTTPServer 9999
Serving HTTP on 0.0.0.0 port 9999 ...
然后我们用之前学会的方法,来生成svc和endpoint的yaml配置,并修改成如下内容,并保存为mysvc.yaml
注意Service和Endpoints的名称必须一致
# 注意我这里把两个资源的yaml写在一个文件内,在实际生产中,我们经常会这么做,方便对一个服务的所有资源进行统一管理,不同资源之间用"---"来分隔
apiVersion: v1
kind: Service
metadata:
name: mysvc
namespace: default
spec:
type: ClusterIP
ports:
- port: 80
protocol: TCP
---
apiVersion: v1
kind: Endpoints
metadata:
name: mysvc
namespace: default
subsets:
- addresses:
- ip: 172.16.123.62
nodeName: 172.16.123.62
ports:
- port: 9999
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 -