跳至主要內容

k8s service

xw大约 2 分钟k8s

概述

在k8s里面,每个Pod都会被分配一个单独的IP地址,但这个IP地址会随着Pod的销毁而消失,重启pod的ip地址会发生变化,此时客户如果访问原先的ip地址则会报错,Service (服务)就是用来解决这个问题的, 对外服务的统一入口,防止pod失联,定义一组pod的访问策略(服务发现、负载均衡)。

分类

  • ClusterIP,默认类型,自动分配一个【仅集群内部】可以访问的虚拟IP。

  • NodePort,对外访问应用使用,在ClusterIP基础上为Service在每台机器上绑定一个端口,就可以通过: ip+NodePort来访问该服务。

  • LoadBalancer,使在NodePort的基础上,借助公有云创建一个外部负载均衡器,并将请求转发到NodePort。

    service与pod关联

service和pod之间是通过 selector.app进行关联的

spec: # 描述
  selector: # 标签选择器,确定当前service代理控制哪些pod
    app: nginx

service端口

apiVersion: apps/v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort # 有配置NodePort,外部可访问k8s中的服务,默认为ClusterIP
  ports:
  - name: nginx
    port: 80  # 服务service的访问端口
    protocol: TCP
    targetPort: 80  # pod端口,映射到容器端口
    nodePort: 30015  # NodePort,通过nodeport类型的service暴露给集群外部访问
  selector:
    app: nginx
  • port,service端口,即k8s中服务之间的访问端口 ,clusterIP:port 是提供给集群内部客户访问service的入口
  • nodePort,容器所在node节点的端口,通过nodeport类型的service暴露给集群节点,外部可以访问的端口
  • targetPort,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器。
  • containerPort,是pod内部容器的端口,targetPort映射到containerPort。

说明:port和nodePort都是service的端口,port暴露给集群内客户访问服务,nodePort暴露给集群外客户访问服务,这两个端口到来的数据都需要经过反向代理kube-proxy流入后端pod的targetPod,从而到达pod中的容器。

示例

nginx:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: dev
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - nodePort: 31111 #对外暴露端口
    port: 80 ## 服务service的访问端口
    name: web
    targetPort: 80 ## pod端口,映射到容器端口
  selector:
    app: nginx
---

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: xw-nginx
  name: xw-nginx
  namespace: dev
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  strategy:
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:1.23.0
        name: nginx
        ports:
          - containerPort: 80 ## 容器端口
        resources: {}
status: {}