通过Service访问BCI服务
更新时间:2024-09-25
概述
如果您的BCI实例(即BCI Pod)需要通过BLB被外网访问,那么您需要在您的CCE 集群创建LoadBalancer类型的Service,详情见: 通过YAML创建LoadBalancer_Service
操作示例
当用户创建类型是LoadBalancer的Service,默认情况下,CCE集群会联动地创建与之对应的BLB,并为此BLB绑定EIP。
假设创建如下的nginx服务,将该服务调度到BCI上,同时创建一个与该服务对应的k8s LoadBalancer类型的Service。 示例所用nginx.yaml,内容如下:
Plain Text
1kind: Service
2apiVersion: v1
3metadata:
4 name: nginx-service
5spec:
6 selector:
7 app: nginx
8 type: LoadBalancer
9 ports:
10 - name: nginx-port
11 port: 80
12 targetPort: 80
13 protocol: TCP
14---
15apiVersion: apps/v1
16kind: Deployment
17metadata:
18 name: nginx-deployment
19spec:
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: nginx
32 ports:
33 - containerPort: 80
34 nodeSelector:
35 type: "virtual-kubelet"
36 tolerations:
37 - key: "virtual-kubelet.io/provider"
38 operator: "Equal"
39 value: "baidu"
40 effect: "NoSchedule"
- 向CCE集群提交YAML
Plain Text
1$ kubectl create -f nginx.yaml
- 查询该nginx Service绑定的EIP
Plain Text
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
如查询得到,CLUSTER-IP字段为集群内ClusterIP, EXTERNAL-IP为EIP
- 查询该nginx Service绑定的BLB id。
Plain Text
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。
- 通过EIP访问服务。
Plain Text
1$ curl -i http://8.8.8.8
外部流量策略
CCE提供三种外部流量策略的LoadBalancer Service,本文称其为Cluster模式、Local模式与LB直连Pod模式,BCI只支持Cluster模式和LB直连Pod模式。
- Cluster模式的LoadBalancer Service,当其收到数据包后,负载均衡器将数据包发往集群的某个节点上,进而节点二次转发数据包到集群的某个Pod上。目标Pod的宿主节点和转发数据包的节点可能不是同一个;这种情况数据包的源IP地址会丢失。
- LB直连Pod模式的LB Service,当其收到数据包后,负载均衡器直接将数据包发往各个Pod。相比前两种模式,这种模式减少了一次节点转发操作;这种情况数据包的源IP地址不会丢失。
Cluster模式
如果希望使用Cluster模式的Service,在创建Service时,您可以显式指定externalTrafficPolicy: Cluster,因该字段默认值为Cluster,您也可不指定指定,显式指定该字段如以下例子所示:
Plain Text
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
LB直连Pod模式
如果希望使用LB直连Pod模式的Service时,在创建Service时,应添加Annotationservice.beta.kubernetes.io/cce-load-balancer-backend-type: "eni"。如以下例子所示: 注:一个BLB默认最多可挂载Pod数,默认值为200,也可自定义设置,详见设置BLB默认挂载的最大后端数
Plain Text
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