通过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,内容如下:
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: nginx
ports:
- containerPort: 80
nodeSelector:
type: "virtual-kubelet"
tolerations:
- key: "virtual-kubelet.io/provider"
operator: "Equal"
value: "baidu"
effect: "NoSchedule"
- 向CCE集群提交YAML
$ kubectl create -f nginx.yaml
- 查询该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
如查询得到,CLUSTER-IP字段为集群内ClusterIP, EXTERNAL-IP为EIP
- 查询该nginx Service绑定的BLB id。
$ 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。
- 通过EIP访问服务。
$ 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,您也可不指定指定,显式指定该字段如以下例子所示:
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
LB直连Pod模式
如果希望使用LB直连Pod模式的Service时,在创建Service时,应添加Annotationservice.beta.kubernetes.io/cce-load-balancer-backend-type: "eni"。如以下例子所示: 注:一个BLB默认最多可挂载Pod数,默认值为200,也可自定义设置,详见设置BLB默认挂载的最大后端数
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