更新时间:2024-04-25 GMT+08:00

Service配置HTTP/HTTPS协议

约束与限制

  • Service使用HTTP/HTTPS协议仅v1.19.16及以上版本集群支持。
    表1 ELB支持HTTP/HTTPS协议的场景

    ELB类型

    使用场景

    是否支持HTTP/HTTPS协议

    说明

    共享型ELB

    对接已有ELB

    支持

    -

    自动创建ELB

    支持

    -

    独享型ELB

    对接已有ELB

    支持(需使用YAML创建)

    • v1.19.16-r50、v1.21.11-r10、v1.23.9-r10、v1.25.4-r10、v1.27.1-r10以下版本:需要同时支持4层和7层的flavor
    • v1.19.16-r50、v1.21.11-r10、v1.23.9-r10、v1.25.4-r10、v1.27.1-r10及以上版本:需要支持7层的flavor

    自动创建ELB

    支持(需使用YAML创建)

    • v1.19.16-r50、v1.21.11-r10、v1.23.9-r10、v1.25.4-r10、v1.27.1-r10以下版本:需要同时支持4层和7层的flavor
    • v1.19.16-r50、v1.21.11-r10、v1.23.9-r10、v1.25.4-r10、v1.27.1-r10及以上版本:需要支持7层的flavor
  • 请勿将Ingress与使用HTTP/HTTPS的Service对接同一个ELB下的同一个监听器,否则将产生端口冲突。

通过控制台创建

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 在左侧导航栏中选择“服务”,在右上角单击“创建服务”
  3. 设置Service参数。本示例中仅列举使用HTTP/HTTPS协议必选参数,其余参数可根据需求参考创建LoadBalancer类型Service进行设置。

    • Service名称:自定义服务名称,可与工作负载名称保持一致。
    • 访问类型:选择“负载均衡”
    • 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”
    • 负载均衡器:选择弹性负载均衡的类型、创建方式。
      • 类型:“独享型”“共享型”,其中独享型ELB需选择“应用型(HTTP/HTTPS)”“网络型(TCP/UDP)&应用型(HTTP/HTTPS)”,否则监听器端口将无法启用HTTP/HTTPS。
      • 创建方式:本文中以选择已有ELB为例进行说明,关于自动创建的配置参数请参见表1
    • 端口配置:
      • 协议:请选择TCP协议,选择UDP协议将无法使用HTTP/HTTPS。
      • 服务端口:Service使用的端口,端口范围为1-65535。
      • 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。
      • 启用HTTP/HTTPS:设置监听器端口是否开启HTTP/HTTPS。当选择独享型负载均衡器类型时,需包含“应用型(HTTP/HTTPS)”方可支持配置HTTP/HTTPS。
    • 监听器配置:
      • 服务器证书:当监听器端口启用HTTPS时,必须选择一个服务器证书。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书
      • SNI:当监听器端口启用HTTPS时,可以选择是否添加SNI证书。如果需要添加SNI证书,证书中必须包含域名。如果当前无可选证书,需前往弹性负载均衡控制台进行创建,详情请参见创建证书

      当发布多个HTTPS的服务,所有监听器会使用相同的证书配置。

    图1 配置HTTP/HTTPS协议

  4. 单击“确定”,创建Service。

通过kubectl命令行创建

Service使用HTTP/HTTPS协议时,需要添加如下annotation:

  • kubernetes.io/elb.protocol-port: "https:443,http:80"

    protocol-port的取值需要和service的spec.ports字段中的端口对应,格式为protocol:port,port中的端口会匹配service.spec.ports中端口,并将该端口发布成对应的protocol协议。

  • kubernetes.io/elb.cert-id: "17e3b4f4bc40471c86741dc3aa211379"

    cert-id内容为ELB证书管理的证书ID,当protocol-port指定了https协议,ELB监听器的证书会设置为服务器证书,当发布多个HTTPS的服务,会使用同一份证书。

以自动创建独享型ELB为例,配置示例如下,其中关键配置通过红色字体标出:

  • 不同的ELB类型以及集群版本对flavor存在不同的要求,详情请参见表1
  • spec.ports中两个端口需要与kubernetes.io/elb.protocol-port中对应,本例中将443端口、80端口分别发布成HTTPS、HTTP协议。
apiVersion: v1
kind: Service
metadata:
  annotations:
    # 在自动创建ELB参数中指定4层和7层的flavor
    kubernetes.io/elb.autocreate: '
      {
          "type": "public",
          "bandwidth_name": "cce-bandwidth-1634816602057",
          "bandwidth_chargemode": "bandwidth",
          "bandwidth_size": 5,
          "bandwidth_sharetype": "PER",
          "eip_type": "5_bgp",
          "available_zone": [
              ""
          ],
          "l7_flavor_name": "L7_flavor.elb.s2.small",
          "l4_flavor_name": "L4_flavor.elb.s1.medium"
      }'
    kubernetes.io/elb.class: performance  # 独享型ELB
    kubernetes.io/elb.protocol-port: "https:443,http:80"  # HTTP/HTTPS协议及端口号,需要与spec.ports中的端口号对应
    kubernetes.io/elb.cert-id: "17e3b4f4bc40471c86741dc3aa211379"  # ELB服务中的证书ID
  labels:
    app: nginx
    name: test
  name: test
  namespace: default
spec:
  ports:
  - name: cce-service-0
    port: 443
    protocol: TCP
    targetPort: 80
  - name: cce-service-1
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
    version: v1
  sessionAffinity: None
  type: LoadBalancer

使用上面的示例创建Service,在新建的ELB实例中可以看到创建了443端口和80端口的监听器。