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
仍有冲突风险,否则可避免此类风险
type: NodePort
--service-node-port-range
可指定端口分配范围,默认值:30000-32767nodePort
默认从高位开始分配,用户可从低位指定端口
type: LoadBalancer
type: ExternalName
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 每次都能连接到同一个 Podspec.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