共计 1322 个字符,预计需要花费 4 分钟才能阅读完成。
有时会遇到局部服务在集群内部,比方中间件和存储,想要通过 k8s 集群间接连贯两种形式,一种就是间接通过 IP 地址连贯;另外一种就是把内部地址映射到集群外部作为一个 service 来拜访,这样长处很显著前期如果资源 IP 地址有变更间接在线更新。
看到这,我是想马上间接测试下,创立了一个 service 和 endpoints 如下:
---
apiVersion: v1
kind: Service
metadata:
name: solr-cloud
namespace: yp-test
spec:
ports:
- protocol: TCP
name: solr-port
port: 9090
targetPort: 9090
type: ClusterIP
clusterIP:
---
apiVersion: v1
kind: Endpoints
metadata:
name: solr-cloud
namespace: yp-test
subsets:
- addresses:
- ip: 192.168.11.229
ports:
- port: 9090
kubectl apply -f solr-endpoint.yaml 执行胜利了
而后通过集群外部 pod 来拜访刚刚创立的 service,发现回绝,然而间接申请 IP 是通的。
再 kubectl describe svc,ep solr-cloud -n yp-test 查看如下:
Name: solr-cloud
Namespace: yp-test
Labels: <none>
Annotations: Selector: <none>
Type: ClusterIP
IP: 10.96.78.185
Port: solr-port 9090/TCP
TargetPort: 9090/TCP
Endpoints:
Session Affinity: None
Events: <none>
Name: solr-cloud
Namespace: yp-test
Labels: <none>
Annotations: Subsets:
Addresses: 192.168.11.229
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
<unset> 9090 TCP
Events: <none>
能够发现 Endpoints 为空也就是 endpoints 并没有绑定到外部 service 上。
为何会这样?
后面的配置貌似也没任何问题,通过和官网文档比照,仔细的敌人可能会发现,service 配置里 spec.ports 有个 name(之前写 service 习惯会把 port 再定义个 name).
先去掉这个 name 再从新创立试试
没问题,去掉 name,申请 service 通了。
总结:
serivce 和 endpoints 关联是通过 metadata.name 来关联的,官网文档也是这么说的。集体猜测,那么当有 spec.ports.name 时,endpoints 中端口 ports 进行关联时匹配不了,为了再次验证我的猜测,在 endpoints 中也减少一个一样的 name,后果真就关联上了。所以,咱们创立时肯定要留神些细节,一种就是去掉 spec.ports.name,或者 endpoints 同样减少上 ports.name。