通过YAML创建LoadBalancer_Service
本文档会详细介绍如何在CCE下创建类型是LoadBalancer的Service。
注意 1:以下Annotation对1.16.3以下版本集群可能不生效,辛苦工单联系管理员处理
注意 2:一个LoadBalancer Service只能使用一个BLB,一个BLB也只能被一个LoadBalancer Service使用,不建议复用 BLB
Kubernetes官方教程:Services
快速开始
当用户创建类型是LoadBalancer的Service,默认情况下,CCE会联动的创建BLB,并为此BLB绑定弹性公网EIP。
以创建一个简单的Nginx为例:
1 kind: Service
2 apiVersion: v1
3 metadata:
4 name: nginx-service
5 spec:
6 selector:
7 app: nginx
8 type: LoadBalancer
9 ports:
10 - name: nginx-port
11 port: 80
12 targetPort: 80
13 protocol: TCP
14 ---
15 apiVersion: apps/v1
16 kind: Deployment
17 metadata:
18 name: nginx-deployment
19 spec:
20 selector:
21 matchLabels:
22 app: nginx
23 replicas: 1
24 template:
25 metadata:
26 labels:
27 app: nginx
28 spec:
29 containers:
30 - name: nginx
31 image: registry.baidubce.com/public/nginx:latest
32 ports:
33 - containerPort: 80
(1)创建
$ kubectl create -f nginx.yaml
(2)查询EIP
IP 8.8.8.8 即为此nginx-service的EIP。
1$ kubectl get svc
2NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3nginx-service 1.1.1.1 8.8.8.8 80:30274/TCP 5m
(3)查询BLB
1$ kubectl get svc nginx-service -o jsonpath={.metadata.annotations}
2map[service.beta.kubernetes.io/cce-load-balancer-id:lb-xxxxxx]
lb-xxxxxx即为此Service的BLB的id。
(4)访问测试
$ curl -i http://8.8.8.8
外部流量策略
CCE提供三种外部流量策略的LoadBalancer Service,本文称其为Cluster模式、Local模式与LB直连Pod模式。
对于Cluster模式的LB Service,当其收到数据包后,负载均衡器将数据包发往集群的某个节点上,进而节点二次转发数据包到集群的某个Pod上。目标Pod的宿主节点和转发数据包的节点可能不是同一个;这种情况数据包的源IP地址会丢失。
对于Local模式的LB Service,当其收到数据包后,负载均衡器将数据包发往部署有目标Pod的节点的上,再由节点转发到自身的Pod上;这种情况数据包的源IP地址不会丢失。
对于LB直连Pod模式的LB Service,当其收到数据包后,负载均衡器直接将数据包发往各个Pod。相比前两种模式,这种模式减少了一次节点转发操作。如果集群的容器网络模式是VPC-ENI模式,则源IP不会丢失;如果集群的容器网络模式是VPC路由模式,如果宿主机安装了ttm模块,源IP地址不会丢失,如果宿主机没有安装ttm模块,源IP地址则会丢失。
在VPC路由网络模式下,三种模式LoadBalancer Service的数据包转发路径如图所示:
在VPC-CNI网络模式下,三种模式LoadBalancer Service的数据包转发路径如图所示:
Cluster模式
如果希望使用Cluster模式的Service,在创建Service时,应指定externalTrafficPolicy: Cluster
。如以下例子所示:
1apiVersion: v1
2kind: Service
3metadata:
4 name: service-example-cluster
5 annotations:
6 prometheus.io/scrape: "true"
7spec:
8 selector:
9 app: nginx
10 type: LoadBalancer
11 externalTrafficPolicy: Cluster
12 sessionAffinity: None
13 ports:
14 - name: nginx
15 protocol: TCP
16 port: 80
17 targetPort: 80
Local模式
如果希望使用Local模式的Service,在创建Service时,应指定externalTrafficPolicy: Local
。如以下例子所示:
1apiVersion: v1
2kind: Service
3metadata:
4 name: service-example-local
5 annotations:
6 prometheus.io/scrape: "true"
7spec:
8 selector:
9 app: nginx
10 type: LoadBalancer
11 externalTrafficPolicy: Local
12 sessionAffinity: None
13 ports:
14 - name: nginx
15 protocol: TCP
16 port: 80
17 targetPort: 80
注意
当kube-proxy组件的代理模式为ipvs
模式时,如果某个Service的externalTrafficPolicy
为Local
且某个节点上没有Service关联的后端Pod时,在该节点上访问该Service的BLB IP地址将会失败。
该问题已经在Kubernetes 1.24版本中修复。相关issue为:https://github.com/kubernetes/kubernetes/pull/97081
LB直连Pod模式
如果希望使用LB直连Pod模式的Service时,在创建Service时,应添加Annotationservice.beta.kubernetes.io/cce-load-balancer-backend-type: "eni"
。如以下例子所示:
更详细的使用说明请参考使用直连 Pod 模式 LoadBalancer Service.md。
1apiVersion: v1
2kind: Service
3metadata:
4 name: service-example-direct
5 annotations:
6 prometheus.io/scrape: "true"
7 service.beta.kubernetes.io/cce-load-balancer-backend-type: "eni"
8spec:
9 selector:
10 app: nginx
11 type: LoadBalancer
12 sessionAffinity: None
13 ports:
14 - name: nginx
15 protocol: TCP
16 port: 80
17 targetPort: 80
使用UDP-Service
修改spec.ports.protocol为UDP即可使用UDP Service的功能,举例如下:
1---
2apiVersion: v1
3kind: Service
4metadata:
5 name: udp-server-demo-svc
6 labels:
7 app: udp-server-demo
8spec:
9 type: LoadBalancer
10 ports:
11 - name: udp-server-demo-port
12 port: 3005
13 targetPort: 3005
14 protocol: UDP
15 selector:
16 app: udp-server-demo
17---
18apiVersion: apps/v1
19kind: Deployment
20metadata:
21 name: udp-server-demo
22 labels:
23 app: udp-server-demo
24spec:
25 replicas: 1
26 selector:
27 matchLabels:
28 app: udp-server-demo
29 template:
30 metadata:
31 labels:
32 app: udp-server-demo
33 spec:
34 containers:
35 - name: udp-server-demo
36 image: hub.baidubce.com/jpaas-public/udp-server-demo:latest
37 ports:
38 - containerPort: 3005
39 protocol: UDP
(1)部署UDP测试服务
1$ kubectl apply -f udp.yaml
(2)UDP Service创建成功
1$ kubectl get svc
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kubernetes ClusterIP 172.16.0.1 <none> 443/TCP 6h
4udp-server-demo-svc LoadBalancer 172.16.122.139 10.10.10.10 3005:31441/UDP 1m
(3)查看服务日志
1$ kubectl logs -f udp-server-demo-6fdf5d796f-h6595
2Received: HealthCheck
3Get Health Check, response OK
4Received: HealthCheck
5Get Health Check, response OK
6Received: HealthCheck
7Get Health Check, response OK
注意
当使用UDP服务时,应用型BLB会使用UDP健康检查字符串对后端进行健康检查,参考文档UDP健康检查介绍
用户需要在应用型BLB上自行配置UDP健康检查字符串,并在后端Pod上正确响应健康检查字符串。