通过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: 80LB直连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