原文连接html
有时候须要在集群中使用外部集群的服务。node
经过类型为ExternalName的Service 或 手动设置Endpoints即可实现。nginx
在Service和Pod之间实际上还存在一种资源Endpoints。能够经过 kubectl describe
来查看到git
$ kubectl describe svc/nginx
Name: nginx
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: ClusterIP
IP: 10.96.27.104
Port: web-8080 8080/TCP
TargetPort: 80/TCP
Endpoints: 172.32.0.6:80,172.40.0.6:80
Session Affinity: None
Events: <none>
$ kubectl get endpoints nginx
NAME ENDPOINTS AGE
nginx 172.32.0.6:80,172.40.0.6:80
复制代码
在客户端链接到服务时,服务代理选择Endpoints中存储的IP:PORT中的一个,而后将连接重定向到该位置。github
做为Service与Pod中间的关联层,当Service未定义Pod选择器时,就不会自动建立Endpoints资源,须要手动建立。web
type Endpoints struct { metav1.TypeMeta `json:",inline"` metav1.ObjectMeta `json:"metadata,omitempty"` // 组成服务的Address的集合。 // 每一个地址对应多个端口,其中有部分已经就绪,有部分未就绪。就绪与未就绪的放入不一样的Addresses集合中。 // 不存在某个地址同时存在于Addresses与NotReadyAddreses中。 Subsets []EndpointSubset `json:"subsets,omitempty"` } type EndpointSubset struct { // 已经就绪的地址集。这些终端能够被负载均衡器和客户端正常发现和使用 Addresses []EndpointAddress `json:"addresses,omitempty"` // 未就绪的地址集,可能因为未启动完成、就绪检查失败或者最近的存活检查失败。 NotReadyAddresses []EndpointAddress `json:"notReadyAddresses,omitempty"` // 在地址上可用的端口集 Ports []EndpointPort `json:"ports,omitempty"` } type EndpointAddress struct { // Endpoint的IP地址 IP string `json:"ip"` // Endpoint的主机名 Hostname string `json:"hostname,omitempty"` // 节点主机名,可使得改Endpoints被部署到指定的节点上 NodeName *string `json:"nodeName,omitempty"` // 引用某个对象来提供Endpoint能力,暂不了解 TargetRef *ObjectReference `json:"targetRef,omitempty"` } type EndpointPort struct { // 端口名,必须与Service中定义的ServicePort一致 // 在只有一个端口时为可选项,多个端口则必填 Name string `json:"name,omitempty"` // Endpoint的端口 Port int32 `json:"port"` // IP协议,支持TCP(默认)、UDP和SCTP Protocol Protocol `json:"protocol,omitempty"` } type Protocol string const ( ProtocolTCP Protocol = "TCP" ProtocolUDP Protocol = "UDP" ProtocolSCTP Protocol = "SCTP" ) 复制代码
两种方案实现将外部服务引入集群json
某些状况下,应用系统须要将一个非本集群的服务做为后端服务进行链接,这时候能够经过建立一个无LabelSelector的Service来实现后端
apiVersion: v1 kind: Service metadata: name: external-svc spec: ports: - port: 80 --- apiVersion: v1 kind: Endpoints metadata: name: external-svc subsets: - addresses: - ip: 47.95.148.6 ports: - port: 80 复制代码
$ kubectl run -it --rm --generator=run-pod/v1 busybox --image=busybox /bin/sh If you don't see a command prompt, try pressing enter. / # wget external-svc Connecting to external-svc (10.96.138.102:80) saving to 'index.html' index.html 100% |*******************************| 613 0:00:00 ETA 'index.html' saved 复制代码
建立一个类型为ExternalName的服务,并配置externalName字段,便可实现。api
此类服务仅在DNS级别为服务建立了简单的CNAME记录。所以链接此服务将会直接链接到外部的服务,彻底绕过代理。 因此此类服务也不会有集群IP。bash
apiVersion: v1 kind: Service metadata: name: external-name-svc spec: type: ExternalName externalName: ali.cdnnnn.com ports: - port: 80 复制代码
# work @ ali in ~/k8s [20:05:42] $ kubectl run -it --rm --generator=run-pod/v1 busybox --image=busybox /bin/sh If you don't see a command prompt, try pressing enter. / # wget external-name-svc Connecting to external-name-svc (47.95.148.6:80) saving to 'index.html' index.html 100% |***********************************************| 613 0:00:00 ETA 'index.html' saved 复制代码