Service
及 Ingress
两种原生资源,分别负责四层和七层的网络接入层配置。传统方案是创建 Ingress 或 LoadBalancer 类型的 Service 来绑定腾讯云负载均衡,将服务对外暴露。此方式将用户流量负载至用户节点的 NodePort 上,再通过 KubeProxy 组件转发到容器网络中,此方案在业务性能和能力方面的支持会有所局限。对比项 | 直连方案 | NodePort 转发 | Local 转发 |
性能 | 无损失 | NAT 转发+节点间转发 | 少量损失 |
Pod 更新 | 接入层后端主动同步更新,更新稳定 | 接入层后端 NodePort 保持不变 | 更新不同步可能导致服务中断 |
集群依赖 | 集群版本及 VPC-CNI 网络要求 | - | - |
业务能力限制 | 最佳 | 无法获取来源 IP,无法进行会话保持 | 有条件的会话保持 |
KubeProxy
在集群中会将用户 NodePort
的流量通过 NAT 的方式转发到集群网络中。存在以下问题:KubeProxy
的转发具有随机性,无法支持会话保持。KubeProxy
的每个 NodePort 具有独立的负载均衡作用,由于负载均衡无法收敛至一处,难以达到全局的负载均衡。KubeProxy
NAT 转发带来的问题。但因为转发的随机性,一个节点上部署多个副本时会话保持依旧无法支持,且在 Local 转发在滚动更新时,容易出现服务的闪断,对业务的滚动更新策略以及停机提出了更高的要求。七层规则数量 | 集群节点数量 | 集群节点数量(更新) | 优化前(秒) | 优化批量调用(秒) | 再优化后端实例查询(秒) | 耗时减少(百分比) |
200 | 1 | 10 | 1313.056 | 227.908 | 31.548 | 97.597% |
200 | 1 | 20 | 1715.053 | 449.795 | 51.248 | 97.011% |
200 | 1 | 30 | 2826.913 | 665.619 | 69.118 | 97.555% |
200 | 1 | 40 | 3373.148 | 861.583 | 90.723 | 97.310% |
200 | 1 | 50 | 4240.311 | 1085.03 | 106.353 | 97.491% |
七层规则数量 | 七层规则数量(更新) | 集群节点数量 | 优化前(秒) | 优化批量调用(秒) | 再优化后端实例查询(秒) | 耗时减少(百分比) |
1 | 100 | 50 | 1631.787 | 451.644 | 68.63 | 95.79% |
1 | 200 | 50 | 3399.833 | 693.207 | 141.004 | 95.85% |
1 | 300 | 50 | 5630.398 | 847.796 | 236.91 | 95.79% |
1 | 400 | 50 | 7562.615 | 1028.75 | 335.674 | 95.56% |
ReadinessGate
,此特性于1.12版本正式发布,主要用于控制 Pod 的状态。
默认情况下,Pod 有 PodScheduled、Initialized 及 ContainersReady 三种 Condition,当状态均为 Ready 时,Pod Ready 即通过了 Condition。但在云原生场景下,Pod 的状态需结合其他因素判断。而 ReadinessGate
提供允许为 Pod 状态判断增加栅栏,由第三方来进行判断与控制,Pod 的状态即可与第三方关联。ReadinessGate
。TKE 接入层组件仅在确认后端绑定成功并且健康检查通过时,通过配置 ReadinessGate
的状态来使 Pod 达到 Ready 的状态,从而推动整个工作负载的滚动更新。MutatingWebhookConfigurations
资源的形式注册至集群即可。集群会在 Pod 创建的时候按照配置的回调路径进行通知,此时可对 Pod 进行创建前的操作,即给 Pod 加上 ReadinessGate
。MutatingWebhookConfigurations
中配置签发请求的 CA,并在服务端配置该 CA 签发的证书。spec.template.metadata.annotations
中声明了 tke.cloud.tencent.com/networks: tke-route-eni
,即表示在工作负载使用 VPC-CNI 弹性网卡模式。apiVersion: apps/v1kind: Deploymentmetadata:labels:app: nginxname: nginx-deployment-enispec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:annotations:tke.cloud.tencent.com/networks: tke-route-enilabels:app: nginxspec:containers:- image: nginx:1.7.9name: nginxports:- containerPort: 80protocol: TCP
metadata.annotations
中声明了 service.cloud.tencent.com/direct-access: "true"
,Service 在同步负载均衡时将采用直连的方式配置访问后端。apiVersion: v1kind: Servicemetadata:annotations:service.cloud.tencent.com/direct-access: "true"labels:app: nginxname: nginx-service-enispec:externalTrafficPolicy: Clusterports:- name: 80-80-noport: 80protocol: TCPtargetPort: 80selector:app: nginxsessionAffinity: Nonetype: LoadBalancer
➜ ~ kubectl apply -f nginx-deployment-eni.yamldeployment.apps/nginx-deployment-eni created➜ ~ kubectl apply -f nginx-service-eni.yamlservice/nginx-service-eni configured➜ ~ kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESnginx-deployment-eni-bb7544db8-6ljkm 1/1 Running 0 24s 172.17.160.191 172.17.0.3 <none> 1/1nginx-deployment-eni-bb7544db8-xqqtv 1/1 Running 0 24s 172.17.160.190 172.17.0.46 <none> 1/1nginx-deployment-eni-bb7544db8-zk2cx 1/1 Running 0 24s 172.17.160.189 172.17.0.9 <none> 1/1➜ ~ kubectl get service -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORkubernetes ClusterIP 10.187.252.1 <none> 443/TCP 6d4h <none>nginx-service-eni LoadBalancer 10.187.254.62 150.158.221.31 80:32693/TCP 6d1h app=nginx
本页内容是否解决了您的问题?