Kubernetes(简称K8S) 是Google开源的分布式的容器管理平台,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。本文主要介绍Kubernetes(K8s) service(服务)。

1、Kubernetes service

服务可以定义为一组分组的逻辑集合。它可以被定义为pod顶部的一个抽象,它提供了一个IP地址和DNS名称,通过这个名称可以访问pod。使用Service,可以很容易地管理负载均衡配置。它帮助pod很容易扩缩容。

service是Kubernetes中的一个REST对象,它的定义可以发布到Kubernetes主服务器上的Kubernetes apiServer来创建一个新实例。

2、创建service(服务)

1)没有选择器service

创建一个名为不使用selector的cjavapy_service的服务。

apiVersion: v1
kind: Service
metadata:
   name: cjavapy_service
spec:
   ports:
   - port: 8080
   targetPort: 31999

2)使用selector的服务配置文件

apiVersion: v1
kind: Service
metadata:
   name: cjavapy_service
spec:
   selector:
      application: "My Application" 
   ports:
   - port: 8080
   targetPort: 31999

需要手动创建一个endpoint,

apiVersion: v1
kind: Endpoints
metadata:
   name: Tutorial_point_service
subnets:
   address:
      "ip": "192.168.31.41"
   ports:
      - port: 8080

创建了一个endpoint,将流量路由到定义为“192.168.168.40:8080”的endpoint。

3)多端口服务

对于某些服务,你需要公开多个端口。 Kubernetes 允许你在 Service 对象上配置多个端口定义。 为服务使用多个端口时,必须提供所有端口名称,以使它们无歧义。

apiVersion: v1
kind: Service
metadata:
   name: Tutorial_point_service
spec:
   selector:
      application: “My Application” -------------------> (Selector)
   ClusterIP: 10.3.0.12
   ports:
      -name: http
      protocol: TCP
      port: 80
      targetPort: 31999
   -name:https
      Protocol: TCP
      Port: 443
      targetPort: 31998

3、服务类型

ClusterIP:用于限制集群内的服务。它在定义的Kubernetes集群中公开服务。

spec:
   type: NodePort
   ports:
   - port: 8080
      nodePort: 31999
      name: NodeportService

NodePort:将在已部署节点的静态端口上公开服务。系统将自动创建一个ClusterIP服务,NodePort服务将路由到该服务。该服务可以在集群外通过NodeIP:nodePort访问。

spec:
   ports:
   - port: 8080
      nodePort: 31999
      name: NodeportService
      clusterIP: 10.20.30.40

LoadBalancer:使使用云提供商的负载均衡器向外部暴露服务。 外部负载均衡器可以将流量路由到自动创建的 NodePort 服务和 ClusterIP 服务上。

{
    "kind": "Service",
    "apiVersion": "v1",
    "metadata": {
        "name": "my-service"
    },
    "spec": {
        "selector": {
            "app": "MyApp"
        },
        "ports": [
            {
                "protocol": "TCP",
                "port": 80,
                "targetPort": 9376,
                "nodePort": 30061
            }
        ],
        "clusterIP": "10.0.171.239",
        "loadBalancerIP": "78.11.24.19",
        "type": "LoadBalancer"
    },
    "status": {
        "loadBalancer": {
            "ingress": [
                {
                    "ip": "146.148.47.155"
                }
            ]
        }
    }

ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com)。 无需创建任何类型代理。类型为 ExternalName 的服务将服务映射到 DNS 名称,而不是典型的选择器,需要使用 kube-dns 1.7 及以上版本或者 CoreDNS 0.0.8 及以上版本才能使用 ExternalName 类型。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

externalIPs:如果外部的 IP 路由到集群中一个或多个 Node 上,Kubernetes Service 会被暴露给这些 externalIPs。 通过外部 IP(作为目的 IP 地址)进入到集群,打到 Service 的端口上的流量, 将会被路由到 Service 的 Endpoint 上。 externalIPs 不会被 Kubernetes 管理,它属于集群管理员的职责范畴。

根据 Service 的规定,externalIPs 可以同任意的 ServiceType 来一起指定。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: MyApp
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 9376
  externalIPs:
    - 80.11.12.10

推荐文档