K8S读书笔录 - 链接集群外部服务

原文连接html

有时候须要在集群中使用外部集群的服务。node

经过类型为ExternalName的Service 或 手动设置Endpoints即可实现。nginx

什么是Endpoints

在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

Endpoints配置结构

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

  1. 手动配置一个Endpoints并将外部服务加入
  2. 配置外部服务的别名给服务

手动配置服务的Endpoint

某些状况下,应用系统须要将一个非本集群的服务做为后端服务进行链接,这时候能够经过建立一个无LabelSelector的Service来实现后端

outservice.png

  1. 建立一个没有选择器的Service
  2. 为该服务建立Endpoints资源
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 复制代码
相关文章
相关标签/搜索