Kubernetes 官方提供了 NodePort 类型的 Service,即给所有节点开通一个相同端口用于暴露该 Service。大多云上负载均衡 (Cloud Load Balancer,CLB) 类型 Service 的传统实现也都是基于 NodePort。即 CLB 后端绑定各节点的 NodePort,CLB 接收外界流量,转发到其中一个节点的 NodePort 上,再通过 Kubernetes 内部的负载均衡,使用 iptables 或 ipvs 转发到 Pod。示意图如下:
容器服务 TKE 使用相同的方式实现默认 CLB 类型 Service 与 Ingress,但目前还支持 CLB 直通 Pod 的方式,即 CLB 后端直接绑定 Pod IP + Port,不绑定节点的 NodePort。示意图如下:
通常会使用 CLB 直接绑定 NodePort 此方式来创建云上 Ingress 或 LB 类型的 Service,但此传统 NodePort 实现方式会存在以下问题:
使用 CLB 直通 Pod 的方式不但不会存在传统 NodePort 方式的问题,还具备以下优势:
externalTrafficPolicy: Local
。sessionAffinity
。使用 CLB 直通 Pod 通常有如下场景:
externalTrafficPolicy: Local
的方式。ReadinessGate
特性,该特性在 Kubernetes 1.12 开始支持。VPC-CNI
弹性网卡模式。可参考 确认是否开启弹性网卡 步骤进行确认。
请对应您的实际情况,按照以下步骤进行操作:
tke.cloud.tencent.com/networks: tke-route-eni
该 annotation 来声明使用弹性网卡,并为其中一个容器添加例如 tke.cloud.tencent.com/eni-ip: "1"
的 requests 与 limits。YAML 示例如下: 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
name: nginx
resources:
requests:
tke.cloud.tencent.com/eni-ip: "1"
limits:
tke.cloud.tencent.com/eni-ip: "1"
当使用 CLB 的 Service 暴露服务时,需要声明使用直连模式。步骤如下:
如果通过控制台创建 Service,可以勾选“采用负载均衡直连Pod模式”,详情请参见 创建 Service。如下图所示:
如果通过 YAML 创建 Service,需要为 Service 加上 service.cloud.tencent.com/direct-access: "true"
的 annotation。示例如下:
说明:如何使用 YAML 创建 Service 请参见 创建 Service。
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
当使用 Ingress 暴露服务时,同样也需要声明使用直连模式。步骤如下:
如果通过控制台创建 Ingress,可以勾选“采用负载均衡直连Pod模式”,详情请参见 创建 Ingress。如下图所示:
如果通过 YAML 创建 Ingress,需要为 Ingress 加上 ingress.cloud.tencent.com/direct-access: "true"
的 annotation。示例如下:
说明:如何使用 YAML 创建 Ingress 请参见 创建 Ingress。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
ingress.cloud.tencent.com/direct-access: "true"
kubernetes.io/ingress.class: qcloud
name: test-ingress
namespace: default
spec:
rules:
- http:
paths:
- backend:
serviceName: nginx
servicePort: 80
path: /
本页内容是否解决了您的问题?