Service 理解


apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app.kubernetes.io/name: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

port: 入站端口,targetPort:要访问的目标端口

EndpointSlice

  • 会通过以 label (kubernetes.io/service-name: my-service) 的形式,将目标端点链接到 Service
  • 如果包含至少 100 个端点,则创建新的 EndpointSlice,以相同的方式链接到对应的 Service
  • 如果使用的是 Endpoints,会截断 1000 个以上的端点,并设置 annotations endpoints.kubernetes.io/over-capacity: truncated

应用协议

  • SCTP
  • TCP
  • UDP

服务类型

  • ClusterIP (default): available in cluster
  • NodePort: available out of cluster, ClusterIP mode + Virtual IP mapping
  • LoadBalancer: cloud provider
  • ExternalName: for cluster used a dynamic external resource by ip or domain

type: ClusterIP

spec.clusterIP = None,Headless Service,也可以通过此字段指定自己的 IP

避免地址冲突:1. IP 地址分配追踪;2. Service 虚拟 IP 地址段,尽管如此,自己指定如果网段与 k8s 集群 IP 相同, clusterIP 仍有冲突风险,否则可避免此类风险

LoadBalancer

type: NodePort

  • --service-node-port-range 可指定端口分配范围,默认值:30000-32767
  • nodePort 默认从高位开始分配,用户可从低位指定端口

LoadBalancer

type: LoadBalancer

UnlimitedIPVS

LoadBalancer

type: ExternalName

LoadBalancer

Headless Service

clusterIP = None, port 比如与 targetPort 匹配

服务发现

  • 环境变量:${SVCNAME}_SERVICE_HOST:${SVCNAME}_SERVICE_PORT
  • DNS
    • my-service.default.svc.cluster.local
    • _http._tcp.my-service.default.svc.cluster.local,具有 http 端口,协议为 TCP

虚拟 IP 寻址机制

  • 流量策略

    spec.externalTrafficPolicy 控制 kubernetes 如何降流量路由到健康(“Ready”)的后端

Session affinity

  • spec.sessionAffinity 可以使一个特定的 client 每次都能连接到同一个 Pod
  • spec.sessionAffinityConfig.clientIP.timeoutSeconds (default 10800, 3 hours), 来设置 client 连接到同一个 Pod 的最大会话时间

外部 IP

spec.externalIPs 可以指定外部 IP 列表

Ingress

ingress-nginx 实现了 nginx 配置文件的动态加载与更新,解决了频繁更新 nginx 配置重载的问题

ingress-nginx-controller (v1.10.0),需要指定 ingressClassName = nginx

原理

CoreDNS 插件将 svc 对应的名称映射成了 IP,并且将这个 IP 写入到 IPVS 内核模块中,实现 Service 相对稳定的网络标识

ipvsadm -Ln # 查看ip端口转发配置
iptables-save # iptables,ip端口转发配置

# bind-utils
#@10.96.0.10 为 kube-dns的ip
# -t tcp, -u udp
# A 查询域名解析为A的记录
dig -t A my-service.default.svc.cluster.local. @10.96.0.10

# 测试http服务
wget --spider --timeout=1 nginx