Creating a LoadBalancer-Type Service
This guide provides steps to create a LoadBalancer-type service in CCE.
Kubernetes official tutorial: Services
Quick start
When creating a LoadBalancer-type service, the CCE will automatically generate a BLB and bind an EIP to it by default.
Example: Create a simple Nginx service
1---
2kind: Service
3apiVersion: v1
4metadata:
5 name: nginx-service
6spec:
7 selector:
8 app: nginx
9 type: LoadBalancer
10 ports:
11 - name: nginx-port
12 port: 80
13 targetPort: 80
14 protocol: TCP
15---
16apiVersion: apps/v1beta1
17kind: Deployment
18metadata:
19 name: nginx-deployment
20spec:
21 replicas: 1
22 template:
23 metadata:
24 labels:
25 app: nginx
26 spec:
27 containers:
28 - name: nginx
29 image: nginx
30 ports:
31 - containerPort: 80
(1) Creation
$ kubectl create -f nginx.yaml
(2) Query EIP
The IP 8.8.8.8 is the EIP allocated to this Nginx service.
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) Query BLB
1$ kubectl get svc nginx-service -o jsonpath={.metadata.annotations}
2map[service.beta.kubernetes.io/cce-load-balancer-id:lb-xxxxxx]
lb-xxxxxx is the unique identifier of the BLB associated with this service.
(4) Access test
$ curl -i http://8.8.8.8
Advanced configuration
Fixed EIP
When a service is deleted and recreated, the EIP will change by default. Therefore, dependent services must be updated accordingly. To prevent this, CCE offers a method to fix the EIP for the service.
Solution for fixed EIP:
(1) Pre-purchase an EIP instance on Baidu AI Cloud
(2) When creating the service, set loadBalancerIP to this pre-purchased EIP
(3) After creating the service, the EXTERNAL-IP of the service will be this fixed EIP
(4) When deleting the service, CCE will only unbind the EIP (not release it), so you can reuse the EIP for future service creations
An example is as follows:
1---
2kind: Service
3apiVersion: v1
4metadata:
5 name: nginx-service-eip-with-load-balancer-ip
6spec:
7 selector:
8 app: nginx-eip-with-load-balancer-ip
9 type: LoadBalancer
10 loadBalancerIP: 8.8.8.8
11 ports:
12 - name: nginx-port
13 port: 80
14 targetPort: 80
15 protocol: TCP
16---
17apiVersion: apps/v1beta1
18kind: Deployment
19metadata:
20 name: nginx-deployment-eip-with-load-balancer-ip
21spec:
22 replicas: 1
23 template:
24 metadata:
25 labels:
26 app: nginx-eip-with-load-balancer-ip
27 spec:
28 containers:
29 - name: nginx
30 image: nginx
31 ports:
32 - containerPort: 80
The queried EXTERNAL-IP will be the fixed EIP:
1kubectl get svc nginx-service
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3nginx-service-eip-with-loadBalancerIP LoadBalancer 1.1.1.1 8.8.8.8 80:30601/TCP 1m
No EIP allocation (VPC-internal BLB)
When the user uses:
(1) Set Service.Spec.Type = LoadBalancer
(2) Add the following annotation to the service: service.beta.kubernetes.io/cce-load-balancer-internal-vpc: "true"
An example is as follows:
1---
2kind: Service
3apiVersion: v1
4metadata:
5 name: nginx-service-blb-internal-vpc
6 annotations:
7 service.beta.kubernetes.io/cce-load-balancer-internal-vpc: "true"
8spec:
9 selector:
10 app: nginx-blb-internal-vpc
11 type: LoadBalancer
12 ports:
13 - name: nginx-port
14 port: 80
15 targetPort: 80
16 protocol: TCP
17---
18apiVersion: apps/v1beta1
19kind: Deployment
20metadata:
21 name: nginx-deployment-blb-internal-vpc
22spec:
23 replicas: 1
24 template:
25 metadata:
26 labels:
27 app: nginx-blb-internal-vpc
28 spec:
29 containers:
30 - name: nginx
31 image: nginx
32 ports:
33 - containerPort: 80
The queried EXTERNAL-IP can only be accessed within the VPC:
1kubectl get svc nginx-service
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3nginx-service-blb-internal-vpc LoadBalancer 1.1.1.1 2.2.2.2 80:30601/TCP 1m
Note: This internal BLB works normally only between clusters in the same VPC. When using an internal BLB within the same cluster, issues may occur. It is recommended to use the Service’s ClusterIP directly for intra-cluster access
Custom EIP configuration
Supported EIP configuration types
Prepaid
| Item | Restriction |
|---|---|
| Public network bandwidth | 1-200Mbps,Int |
| Purchase period | [1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 24, 36] (unit: month) |
Postpaid
| Charge type | Public network bandwidth | Cost examples |
|---|---|---|
| Traffic-based billing (ByTraffic) | 1~1000Mbps,Int | Configuration fee: ¥0.00032/minute; traffic fee: ¥0.76/GB |
| Bandwidth-based billing (ByBandwidth) | 1-200Mbps,Int | Configuration fee (example for 1 Mbps): ¥0.00094/minute |
Usage method Set the following annotations when creating the service:
1// Bill type (default: Postpaid; options: Postpaid, Prepaid)
2service.beta.kubernetes.io/cce-elastic-ip-payment-timing:"Postpaid"
3 // Charge type (default: ByTraffic; options: ByTraffic, ByBandwidth)
4service.beta.kubernetes.io/cce-elastic-ip-billing-method:"ByTraffic"
5 // Public network bandwidth (unit: Mbps; default: 1,000 or 200). For Prepaid/bandwidth-type EIPs: Limited to integers between 1 and 200. For traffic-type EIPs: Limited to integers between 1 and 1,000.
6service.beta.kubernetes.io/cce-elastic-ip-bandwidth-in-mbps:"1000"
7 // Duration (required for Prepaid; unit: month; options: [1,2,3,4,5,6,7,8,9,12,24,36]). Invalid for Postpaid
8service.beta.kubernetes.io/cce-elastic-ip-reservation-length:"36"
Postpay example:
1kind: Service
2apiVersion: v1
3metadata:
4 name: nginx-service
5 annotations:
6 service.beta.kubernetes.io/cce-elastic-ip-payment-timing: "Postpaid"
7 service.beta.kubernetes.io/cce-elastic-ip-billing-method: "ByTraffic"
8 service.beta.kubernetes.io/cce-elastic-ip-bandwidth-in-mbps: "200"
9spec:
10 selector:
11 app: nginx
12 type: LoadBalancer
13 ports:
14 - name: http
15 port: 80
16 targetPort: 80
Example: Prepaid EIP configuration (ensure sufficient account balance; otherwise, creation will fail)
1kind: Service
2apiVersion: v1
3metadata:
4 name: nginx-service
5 annotations:
6 service.beta.kubernetes.io/cce-elastic-ip-payment-timing: "Prepaid"
7 service.beta.kubernetes.io/cce-elastic-ip-bandwidth-in-mbps: "10"
8 service.beta.kubernetes.io/cce-elastic-ip-reservation-length:"1"
9spec:
10 selector:
11 app: nginx
12 type: LoadBalancer
13 ports:
14 - name: http
15 port: 80
16 targetPort: 80
Notes Default configuration: Default: Postpaid + traffic-based billing + 1,000 Mbps bandwidth.
Fixed EIP: Updating the configuration of a fixed EIP is not supported via service annotations. Modify it manually in the console.
Updating service EIP configurations (manual annotation editing): Only the public network bandwidth can be updated
Prepay:
(1) For Prepaid EIPs: Automatic renewal is not available (due to EIP API limitations). Renew manually via the console.
(2) For Prepaid EIPs: The charge type does not need to be set
(3) For Prepaid EIPs: Deleting the service will not release the EIP; it will be released only after expiration
UDP-Service
To use UDP for the service, set spec.ports.protocol to UDP. Example steps:
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: extensions/v1beta1
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) Deploy a UDP test service
1$ kubectl apply -f udp.yaml
(2) Verify the UDP Service is created successfully
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) View the service logs
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
Note: According to Baidu AI Cloud Load Balance (BLB) requirements, for services with UDP listeners, BLB will forward traffic to backend pods only if the UDP health check passes. Ensure your backend UDP service responds to the health check string. For details, see: [UDP Health Check Introduction](BLB/Operation guide/General-purpose BLB instance/Creating BLB Ordinary Instance.md#Configure UDP listener)
Specify a subnet for the service’s BLB
To facilitate network resource management, CCE supports specifying a subnet for the BLB when creating the service When the user uses:
(1) Set Service.Spec.Type = LoadBalancer
(2) Add an annotation to the service to specify the subnet ID:, service.beta.kubernetes.io/cce-load-balancer-internal-vpc: "sbn-*"
An example is as follows:
1---
2kind: Service
3apiVersion: v1
4metadata:
5 name: nginx-service-blb-subnet-id
6 annotations:
7 service.beta.kubernetes.io/cce-load-balancer-subnet-id: "sbn-123456"
8spec:
9 selector:
10 app: nginx
11 type: LoadBalancer
12 ports:
13 - name: nginx-port
14 port: 80
15 targetPort: 80
16 protocol: TCP
17---
18apiVersion: apps/v1beta1
19kind: Deployment
20metadata:
21 name: nginx-deployment-blb-subnet-id
22spec:
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
After deploying the service, verify the BLB’s subnet in the BLB page of the Baidu AI Cloud console Note: The subnet can only be specified when creating the service. Adding or modifying this annotation for an existing service is not supported
