k8s 内部连接集群外部服务
1、EndPoint
k8s服务并不是和pod直接相连的。相反,有一种资源介于两者之间,他就是endpoint。endpoint资源就是暴露一个服务的ip地址和端口的列表。尽管在spec服务中定义了pod选择器,但在重定向传入连接时不会直接使用它。选择器用于构建ip和端口的列表,然后存储在ep中。当客户端连接到服务时,服务代理选择这些ip和端口对中的一个,并将传入连接重定向到在该位置监听的服务器。
如果创建了不包含pod选择器的服务,k8s将不会创建ep资源。
创建不包含pod选择器的svc:
apiVersion: v1 kind: Service metadata: name: external-service spec: ports: - port: 80
手动创建ep:
apiVersion: v1 kind: Endpoints metadata: name: external-service subsets: - addresses: - ip: 11.11.11.11 - ip: 22.22.22.22 ports: - port: 80
服务的名字必须和ep的对象名字相匹配
xxxx@localhost k8s_file % kubectl describe svc external-service Name: external-service Namespace: default Labels: <none> Annotations: <none> Selector: <none> Type: ClusterIP IP Family Policy: SingleStack IP Families: IPv4 IP: 10.102.192.248 IPs: 10.102.192.248 Port: <unset> 80/TCP TargetPort: 80/TCP Endpoints: 11.11.11.11:80,22.22.22.22:80 Session Affinity: None Events: <none>
2、externalName
除了手动配置服务的ep来替代公开外部服务的方法,还有一种更简单的方法,通过fqdn访问外部服务。externalName是实际服务的完全限定域名。
apiVersion: v1 kind: Service metadata: name: external-service spec: type: ExternalName externalName: www.xxx.com ports: - port: 80
可以通过external-service.default.svc.cluster.local 或者同一个ns 通过external-service访问。