通过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为例:
kind: Service
apiVersion: v1
metadata:
name: nginx-service
spec:
selector:
app: nginx
type: LoadBalancer
ports:
- name: nginx-port
port: 80
targetPort: 80
protocol: TCP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 1
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.baidubce.com/public/nginx:latest
ports:
- containerPort: 80
(1)创建
$ kubectl create -f nginx.yaml
(2)查询EIP
IP 8.8.8.8 即为此nginx-service的EIP。
$ kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service 1.1.1.1 8.8.8.8 80:30274/TCP 5m
(3)查询BLB
$ kubectl get svc nginx-service -o jsonpath={.metadata.annotations}
map[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
。如以下例子所示:
apiVersion: v1
kind: Service
metadata:
name: service-example-cluster
annotations:
prometheus.io/scrape: "true"
spec:
selector:
app: nginx
type: LoadBalancer
externalTrafficPolicy: Cluster
sessionAffinity: None
ports:
- name: nginx
protocol: TCP
port: 80
targetPort: 80
Local模式
如果希望使用Local模式的Service,在创建Service时,应指定externalTrafficPolicy: Local
。如以下例子所示:
apiVersion: v1
kind: Service
metadata:
name: service-example-local
annotations:
prometheus.io/scrape: "true"
spec:
selector:
app: nginx
type: LoadBalancer
externalTrafficPolicy: Local
sessionAffinity: None
ports:
- name: nginx
protocol: TCP
port: 80
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。
apiVersion: v1
kind: Service
metadata:
name: service-example-direct
annotations:
prometheus.io/scrape: "true"
service.beta.kubernetes.io/cce-load-balancer-backend-type: "eni"
spec:
selector:
app: nginx
type: LoadBalancer
sessionAffinity: None
ports:
- name: nginx
protocol: TCP
port: 80
targetPort: 80
使用UDP-Service
修改spec.ports.protocol为UDP即可使用UDP Service的功能,举例如下:
---
apiVersion: v1
kind: Service
metadata:
name: udp-server-demo-svc
labels:
app: udp-server-demo
spec:
type: LoadBalancer
ports:
- name: udp-server-demo-port
port: 3005
targetPort: 3005
protocol: UDP
selector:
app: udp-server-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: udp-server-demo
labels:
app: udp-server-demo
spec:
replicas: 1
selector:
matchLabels:
app: udp-server-demo
template:
metadata:
labels:
app: udp-server-demo
spec:
containers:
- name: udp-server-demo
image: hub.baidubce.com/jpaas-public/udp-server-demo:latest
ports:
- containerPort: 3005
protocol: UDP
(1)部署UDP测试服务
$ kubectl apply -f udp.yaml
(2)UDP Service创建成功
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.16.0.1 <none> 443/TCP 6h
udp-server-demo-svc LoadBalancer 172.16.122.139 10.10.10.10 3005:31441/UDP 1m
(3)查看服务日志
$ kubectl logs -f udp-server-demo-6fdf5d796f-h6595
Received: HealthCheck
Get Health Check, response OK
Received: HealthCheck
Get Health Check, response OK
Received: HealthCheck
Get Health Check, response OK
注意
当使用UDP服务时,应用型BLB会使用UDP健康检查字符串对后端进行健康检查,参考文档UDP健康检查介绍
用户需要在应用型BLB上自行配置UDP健康检查字符串,并在后端Pod上正确响应健康检查字符串。