Kubernetes Service 从逻辑上定义了运行在集群中的一组 Pod,这些 Pod 提供了相同的功能。 当每个 Service 创建时,会被分配一个唯一的 IP 地址(也称为 clusterIP)。 这个 IP 地址与一个 Service 的生命周期绑定在一起,当 Service 存在的时候它也不会改变。 可以配置 Pod 使它与 Service 进行通信,Pod 知道与 Service 通信将被自动地负载均衡到该 Service 中的某些 Pod 上。
一个Pod只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口号提供服务。
要稳定地提供服务需要服务发现和负载均衡能力。服务发现完成的工作,是针对客户端访问的服务,找到对应的后端服务实例。在K8S集群中,客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。
在K8S集群中,微服务的负载均衡是由kube-proxy实现的。kube-proxy是k8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8S的每个节点上都有一个;这一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的kube-proxy就越多,高可用节点也随之增多。与之相比,我们平时在服务器端使用反向代理作负载均衡,还要进一步解决反向代理的高可用问题。

意义

防止Pod失联,服务发现机制
是虚拟对象,建立规则访问pod
提供一组Pod上的应用程序公开为网络服务的抽象方法
Service暴露Pod对外服务的地址,通过Service访问Pod,不需要了解pod的具体地址

创建事例

选择满足选择器的Pod建立关系

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: my-service
  5. spec:
  6. selector:
  7. app: myapp
  8. ports:
  9. - port: 80
  10. targetPort: 9376
  11. protocol: TCP

创建service

kubectl create -f service.yaml

查看正在运行的service

kubectl get svc

使用Service暴露pod服务地址

通过deployment启动多个pod

先创建一个deployment,启动2个Pod,以nginx容器为例

apiVersion: apps/v1
kind: Deployment
metadata:
  name:  my-nginx
spec:
  selector:
    matchLabels:
      run: my-nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name:  my-nginx
        image:  nginx
        resources:
          requests:
            cpu: 500m
            memory: 100Mi
        ports:
        - containerPort:  80

创建

kubectl create -f nginx-deployment.yaml

重启服务

在 k8s v1.15 版本之后,通过 kubectl rollout restart 命令来滚动重启pod:

kubectl rollout restart deployment your_deployment_name

创建 service与pod构建关联

通过selector 与 pod的labels 进行对应,targetPort也要与上面创建pod的容器端口进行对应
Service要先于Pod创建,Pod的环境变量才能写入,也就是说 先创建Service再创建Deployment时就能创建环境变量
当需要访问集群内特定的pod再这样做

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
spec:
  selector:
    run: my-nginx
  type: ClusterIP
  ports:
  - name: my-nginx
    port: 80
    targetPort: 80

创建service

kubectl create -f nginx-service.yaml

查看service内的pod映射情况

kubectl describe svc my-nginx

image.png
目前service已经构建成功 但外网还无法访问,只能通过内网访问,通过curl命令访问内网ip可以看到nginx默认首页的html

curl 10.1.236.153

想要对外开放访问就要配置反向代理

Service常用类型

Service常用类型有三种

  • ClusterIp:集群内部访问 默认
  • NodePort:对外访问应用使用
  • LoadBalancer:对外访问应用使用,公有云

上面的事例中都没有指定类型,默认都按照ClusterIp的方式创建

NodePort类型

指定NodePort类型 对外暴露端口30001

apiVersion: v1
kind: Service
metadata:
  name: my-nginx
spec:
  selector:
    run: my-nginx
  type: NodePort
  ports:
  - name: my-nginx
    port: 80
    targetPort: 80
    protocol: TCP
    nodePort: 30001