开发手册 欢迎您!
软件开发者资料库

Kubernetes(K8s) service(服务)

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的wonhero_service的服务。

apiVersion: v1kind: Servicemetadata:   name: wonhero_servicespec:   ports:   - port: 8080   targetPort: 31999

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

apiVersion: v1kind: Servicemetadata:   name: wonhero_servicespec:   selector:      application: "My Application"    ports:   - port: 8080   targetPort: 31999

需要手动创建一个endpoint,

apiVersion: v1kind: Endpointsmetadata:   name: Tutorial_point_servicesubnets:   address:      "ip": "192.168.31.41"   ports:      - port: 8080

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

3)多端口服务

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

apiVersion: v1kind: Servicemetadata:   name: Tutorial_point_servicespec:   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: v1kind: Servicemetadata:  name: my-service  namespace: prodspec:  type: ExternalName  externalName: my.database.example.com

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

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

apiVersion: v1kind: Servicemetadata:  name: my-servicespec:  selector:    app: MyApp  ports:    - name: http      protocol: TCP      port: 80      targetPort: 9376  externalIPs:    - 80.11.12.10