TKE基于弹性网卡直连Pod的网络负载均衡 (3)

TKE基于弹性网卡直连Pod的网络负载均衡

KubeProxy的一些设计思考

KubeProxy的缺点也在前文中提到的一样明显。但是基于云上负载均衡、VPC网络的各种特性,我们能给出各种其他更加本地化的接入层方案。但这并不意味着KubeProxy的设计不好或是作用不大。其对集群接入层的设计极具普适性、容错性,基本适用于所有业务场景下的集群,作为一个官方提供的组件这个设计是非常合适的。

新模式使用指引 前置要求

Kubernetes集群版本需要高于 1.12。

集群网络模式必须开启VPC-CNI弹性网卡模式。

直连模式Service使用的工作负载需使用VPC-CNI弹性网卡模式。

控制台操作指引

登录 容器服务控制台。

参考控制台步骤,进入 “新建Service” 页面,根据实际需求设置 Service 参数。

其中,部分关键参数信息需进行如下设置,如下图所示:

TKE基于弹性网卡直连Pod的网络负载均衡

服务访问方式:选择为【提供公网访问】或【VPC内网访问】。

网络模式:勾选【采用负载均衡直连Pod模式】。

Workload绑定:选择【引用Worklocad】,并在弹出窗口中选择 VPC-CNI 模式的后端工作负载。

单击【创建服务】,完成创建。

Kubectl操作指引

Workload示例:nginx-deployment-eni.yaml

注意spec.template.metadata.annotations中声明了tke.cloud.tencent.com/networks: tke-route-eni,在工作负载使用VPC-CNI弹性网卡模式。

apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment-eni
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
annotations:
tke.cloud.tencent.com/networks: tke-route-eni
labels:
app: nginx
spec:
containers:
- image: nginx:1.7.9
name: nginx
ports:
- containerPort: 80
protocol: TCP

- Service示例:nginx-service-eni.yaml > 注意:`metadata.annotations`中声明了`service.cloud.tencent.com/direct-access: "true"`,Service在同步负载均衡时将采用直连的方式配置访问后端。 ```yaml apiVersion: v1 kind: Service metadata: annotations: service.cloud.tencent.com/direct-access: "true" labels: app: nginx name: nginx-service-eni spec: externalTrafficPolicy: Cluster ports: - name: 80-80-no port: 80 protocol: TCP targetPort: 80 selector: app: nginx sessionAffinity: None type: LoadBalancer ``` - 部署以上内容到集群 > 注意:在你的环境你首先需要连接到集群(没有集群的需要先创建集群),可以参考文章尾部的帮助文档配置kubectl连接集群。 ```shell ➜ ~ kubectl apply -f nginx-deployment-eni.yaml deployment.apps/nginx-deployment-eni created ➜ ~ kubectl apply -f nginx-service-eni.yaml service/nginx-service-eni configured ➜ ~ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-eni-bb7544db8-6ljkm 1/1 Running 0 24s 172.17.160.191 172.17.0.3 <none> 1/1 nginx-deployment-eni-bb7544db8-xqqtv 1/1 Running 0 24s 172.17.160.190 172.17.0.46 <none> 1/1 nginx-deployment-eni-bb7544db8-zk2cx 1/1 Running 0 24s 172.17.160.189 172.17.0.9 <none> 1/1 ➜ ~ kubectl get service -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR kubernetes 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 ``` ## 总结 与业界对比, - AWS有类似方案,通过弹性网卡的方式实现了Pod直连。 - GKE(Google Kubernetes Engine)也有类似方案。结合CLB(Google Cloud Load Balancing)的NEG(Network Endpoint Groups)特性实现接入层直连Pod。 现在腾讯云TKE也利用弹性网卡实现了Pod直连的网络模式,现已在腾讯云TKE上线。接下来,我们还计划对这个特性进行更多优化,包括 1. 不依赖VPC-ENI的网络模式,实现普通容器网络下的Pod直连。 2. 支持在Pod删除之前,摘除负载均衡后端。 欢迎大家一起来使用! ## 相关参考 1. [Kubernetes Service介绍](https://kubernetes.io/docs/concepts/services-networking/service) 2. [Kubernetes Ingress介绍](https://kubernetes.io/docs/concepts/services-networking/ingress) 3. [Kubernetes Deployments 滚动更新策略](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy) 4. [Kubernetes Pods ReadinessGate特性](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-readiness-gate) 5. [Kubernetes 通过Local转发获取来源IP](https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip) 6. [TKE容器服务 网络模式选型](https://cloud.tencent.com/document/product/457/41636) 7. [TKE容器服务 VPC-CNI网络模式](https://cloud.tencent.com/document/product/457/34993) 8. [TKE容器服务 配置kubectl并连接集群](https://cloud.tencent.com/document/product/457/32191) 9. [AWS ALB Ingress Controller](https://aws.amazon.com/cn/blogs/opensource/kubernetes-ingress-aws-alb-ingress-controller/) 10. [GKE 通过独立 NEG 配置容器原生负载平衡](https://cloud.google.com/kubernetes-engine/docs/how-to/standalone-neg) >【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!! ![](https://img2020.cnblogs.com/other/2041406/202009/2041406-20200914091252172-200457670.png)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzgfwd.html