所有文档

          容器引擎 CCE

          创建LoadBalancer类型的Service

          本文档会详细介绍如何在CCE下创建类型是LoadBalancer的Service。

          注:以下 annotation 对 1.16.3 以下版本可能不生效,辛苦工单联系管理员处理

          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: nginx
                  ports:
                  - containerPort: 80

          (1)创建

          $ kubectl create -f nginx.yaml

          (2)查询EIP

          IP 8.8.8.8 即为此Nginx的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

          高级配置

          固定EIP

          当用户删除Service并重新创建的时候,EIP会变,这样就需要去更改依赖于此IP的其他所有服务,所以CCE提供一种方式来固定此EIP。

          固定EIP的方案:

          (1)用户预先百度智能云上购买一个EIP实例
          (2)在创建Service时,设置loadBalancerIP为此EIP
          (3)创建Service,此时EXTERNAL-IP即为此EIP
          (4)删除Service,CCE只会解绑此EIP而不会释放此EIP,用户下次还可以继续使用

          示例如下:

          ---
          kind: Service
          apiVersion: v1
          metadata:
            name: nginx-service-eip-with-load-balancer-ip
          spec:
            selector:
              app: nginx-eip-with-load-balancer-ip
            type: LoadBalancer
            loadBalancerIP: 8.8.8.8
            ports:
            - name: nginx-port
              port: 80
              targetPort: 80
              protocol: TCP
          ---
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: nginx-deployment-eip-with-load-balancer-ip
          spec:
            selector:
              matchLabels:
                app: nginx-eip-with-load-balancer-ip
            replicas: 1
            template:
              metadata:
                labels:
                  app: nginx-eip-with-load-balancer-ip
              spec:
                containers:
                - name: nginx
                  image: nginx
                  ports:
                  - containerPort: 80

          这样查到的EXTERNAL-IP即为此EIP:

          kubectl get svc nginx-service
          NAME                                    TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
          nginx-service-eip-with-loadBalancerIP   LoadBalancer   1.1.1.1          8.8.8.8          80:30601/TCP   1m

          不分配EIP(即VPC内BLB)

          用户使用时:
          (1)设置Service.Spec.Type=LoadBalancer
          (2)为Service添加annotations,即service.beta.kubernetes.io/cce-load-balancer-internal-vpc: "true"

          示例如下:

          ---
          kind: Service
          apiVersion: v1
          metadata:
            name: nginx-service-blb-internal-vpc
            annotations:
              service.beta.kubernetes.io/cce-load-balancer-internal-vpc: "true"
          spec:
            selector:
              app: nginx-blb-internal-vpc
            type: LoadBalancer
            ports:
            - name: nginx-port
              port: 80
              targetPort: 80
              protocol: TCP
          ---
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: nginx-deployment-blb-internal-vpc
          spec:
            selector:
              matchLabels:
                app: nginx-blb-internal-vpc
            replicas: 1
            template:
              metadata:
                labels:
                  app: nginx-blb-internal-vpc
              spec:
                containers:
                - name: nginx
                  image: nginx
                  ports:
                  - containerPort: 80

          这样查到的EXTERNAL-IP只能在VPC内访问:

          kubectl get svc nginx-service
          NAME                             TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)        AGE
          nginx-service-blb-internal-vpc   LoadBalancer   1.1.1.1          2.2.2.2          80:30601/TCP   1m

          注:此内网BLB只能在一个VPC内的集群间正常使用;在使用同一个集群内的内网BLB时,会存在问题,建议在同一个集群内直接使用Service的ClusterIP

          自定义EIP配置

          EIP支持配置类型:

          预付费(Prepaid)

          项目 限制
          公网带宽 1-200Mbps,Int
          购买时长 [1,2,3,4,5,6,7,8,9,12,24,36],时间单位,month

          后付费(Postpaid)

          计费方式 公网带宽 费用举例
          按使用流量计费(ByTraffic) 1~200Mbps,Int 配置费用:¥0.00032/分钟;流量费用:¥0.76/GB
          按使用带宽计费(ByBandwidth) 1-200Mbps,Int 配置费用(1Mbps为例):¥0.00094/分钟

          使用方式: 在创建Service时设置相应Annotation如下:

          // 付费方式,默认:Postpaid;可选:Postpaid、Prepaid
          service.beta.kubernetes.io/cce-elastic-ip-payment-timing:"Postpaid"
          // 计费方式,默认:ByTraffic;可选:ByTraffic、ByBandwidth
          service.beta.kubernetes.io/cce-elastic-ip-billing-method:"ByTraffic"
          // 公网带宽,单位为Mbps,默认:100;对于prepay以及bandwidth类型的EIP,限制为为1~200之间的整数,对于traffic类型的EIP,限制为1~200之间的整数。
          service.beta.kubernetes.io/cce-elastic-ip-bandwidth-in-mbps:"100"
          // 对于预付费,必须设置时长,[1,2,3,4,5,6,7,8,9,12,24,36],单位月;对于后付费,此设置无效
          service.beta.kubernetes.io/cce-elastic-ip-reservation-length:"36"

          后付费举例:

          kind: Service
          apiVersion: v1
          metadata:
            name: nginx-service
            annotations:
              service.beta.kubernetes.io/cce-elastic-ip-payment-timing: "Postpaid"
              service.beta.kubernetes.io/cce-elastic-ip-billing-method: "ByTraffic"
              service.beta.kubernetes.io/cce-elastic-ip-bandwidth-in-mbps: "200"
          spec:
            selector:
              app: nginx
            type: LoadBalancer
            ports:
            - name: http
              port: 80
              targetPort: 80

          预付费举例(请确定余额充足,否则会失败):

          kind: Service
          apiVersion: v1
          metadata:
            name: nginx-service
            annotations:
              service.beta.kubernetes.io/cce-elastic-ip-payment-timing: "Prepaid"
              service.beta.kubernetes.io/cce-elastic-ip-bandwidth-in-mbps: "10"
              service.beta.kubernetes.io/cce-elastic-ip-reservation-length:"1"
          spec:
            selector:
              app: nginx
            type: LoadBalancer
            ports:
            - name: http
              port: 80
              targetPort: 80

          说明事项 默认配置: 默认为:后付费+按流量+100M带宽。

          固定EIP: 不支持对固定EIP的配置进行更新,请用户自行到控制台修改。

          用户更新Service EIP的配置(即手动编辑annotation): 支持更新的配置有:公网带宽

          预付费:

          (1)对于预付费,由于EIP API的限制,目前不支持自动续费,需要用户自行到console上续费。

          (2)对于预付费,不需要设置计费方式

          (3)删除Service时,预付费EIP不会释放,到期后才会释放

          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

          注:根据百度云负载均衡BLB的要求,对于监听UDP的服务,一定要通过UDP健康检查,BLB才会把流量转发到后端,所以需要用户的后端UDP服务响应健康检查字符串,详见:UDP健康检查介绍

          为Service的BLB指定子网

          为方便用户管理网络相关资源,支持创建Service时为BLB指定子网 用户使用时:

          (1)设置Service.Spec.Type=LoadBalancer

          (2)为Service添加annotations,指定子网ID,即service.beta.kubernetes.io/cce-load-balancer-subnet-id: "sbn-*"

          示例如下:

          ---
          kind: Service
          apiVersion: v1
          metadata:
            name: nginx-service-blb-subnet-id
            annotations:
              service.beta.kubernetes.io/cce-load-balancer-subnet-id: "sbn-123456"
          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-blb-subnet-id
          spec:
            selector:
              matchLabels:
                app: nginx
            replicas: 1
            template:
              metadata:
                labels:
                  app: nginx
              spec:
                containers:
                - name: nginx
                  image: nginx
                  ports:
                  - containerPort: 80

          部署服务后,可以去百度智能云BLB页面查询创建的BLB所在的子网进行验证 注:仅支持在创建Service时指定子网,不支持创建Service之后编辑Service添加或修改该annotation

          指定 BLB 创建 LB Service

          通过为 Service 添加 annotations,即 service.beta.kubernetes.io/cce-load-balancer-id: "lb-xxxxxxxx",指定 LB 的BLB。 示例如下:

          kind: Service
          apiVersion: v1
          metadata:
            name: nginx-service-blb-assigned-id
            annotations:
              service.beta.kubernetes.io/cce-load-balancer-id: "xxxxxx"
          spec:
            selector:
              app: nginx
            type: LoadBalancer
            ports:
            - name: nginx-port
              port: 80
              targetPort: 80
              protocol: TCP

          删除时不会保留 BLB,如需保留,请使用 删除Service保留BLB 的 annotation

          删除 Service 保留 BLB

          通过为 Service 添加 annotations,即 service.beta.kubernetes.io/cce-load-balancer-reserve-lb: "true", 指定删除 Service 时,保留 BLB。 示例如下:

          kind: Service
          apiVersion: v1
          metadata:
            name: nginx-service-blb-reserve-lb
            annotations:
              service.beta.kubernetes.io/cce-load-balancer-reserve-lb: "true"
          spec:
            selector:
              app: nginx
            type: LoadBalancer
            ports:
            - name: nginx-port
              port: 80
              targetPort: 80
              protocol: TCP
          上一篇
          设置ingress流量转发
          下一篇
          灰度发布