为ELB Ingress配置HTTPS证书
Ingress支持配置TLS证书,以HTTPS协议的方式对外提供安全服务。
当前支持使用配置在集群中的TLS类型的密钥证书,以及ELB服务中的证书。
同一个ELB实例的同一个端口配置HTTPS时,需要选择一样的证书。
使用TLS类型的密钥证书
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- Ingress支持使用kubernetes.io/tls和IngressTLS两种TLS密钥类型,此处以IngressTLS类型为例,详情请参见创建密钥。kubernetes.io/tls类型的密钥示例及说明请参见TLS Secret。
执行如下命令,创建名为“ingress-test-secret.yaml”的YAML文件,此处文件名可自定义。
vi ingress-test-secret.yaml
YAML文件配置如下:apiVersion: v1 data: tls.crt: LS0******tLS0tCg== tls.key: LS0tL******0tLS0K kind: Secret metadata: annotations: description: test for ingressTLS secrets name: ingress-test-secret namespace: default type: IngressTLS
此处tls.crt和tls.key为示例,请获取真实的证书和密钥进行替换。tls.crt和tls.key的值为Base64编码后的内容。
- 创建密钥。
kubectl create -f ingress-test-secret.yaml
回显如下,表明密钥已创建。
secret/ingress-test-secret created
查看已创建的密钥。
kubectl get secrets
回显如下,表明密钥创建成功。
NAME TYPE DATA AGE ingress-test-secret IngressTLS 2 13s
- 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。
vi ingress-test.yaml
默认安全策略选择(kubernetes.io/elb.tls-ciphers-policy)仅在1.17.17及以上版本的集群中支持。
以自动创建关联ELB为例,YAML文件配置如下:
1.21及以下版本集群:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/elb.class: performance kubernetes.io/ingress.class: cce kubernetes.io/elb.port: '443' kubernetes.io/elb.autocreate: '{ "type": "public", "bandwidth_name": "cce-bandwidth-******", "bandwidth_chargemode": "bandwidth", "bandwidth_size": 5, "bandwidth_sharetype": "PER", "eip_type": "5_bgp", "available_zone": [ "" ], "elb_virsubnet_ids":["b4bf8152-6c36-4c3b-9f74-2229f8e640c9"], "l7_flavor_name": "L7_flavor.elb.s1.small" }' kubernetes.io/elb.tls-ciphers-policy: tls-1-2 spec: tls: - secretName: ingress-test-secret rules: - host: foo.bar.com http: paths: - path: '/' backend: serviceName: <your_service_name> #替换为您的目标服务名称 servicePort: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
1.23及以上版本集群:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/elb.class: performance kubernetes.io/elb.port: '443' kubernetes.io/elb.autocreate: '{ "type": "public", "bandwidth_name": "cce-bandwidth-******", "bandwidth_chargemode": "bandwidth", "bandwidth_size": 5, "bandwidth_sharetype": "PER", "eip_type": "5_bgp", "available_zone": [ "" ], "elb_virsubnet_ids":["b4bf8152-6c36-4c3b-9f74-2229f8e640c9"], "l7_flavor_name": "L7_flavor.elb.s1.small" }' kubernetes.io/elb.tls-ciphers-policy: tls-1-2 spec: tls: - secretName: ingress-test-secret rules: - host: foo.bar.com http: paths: - path: '/' backend: service: name: <your_service_name> #替换为您的目标服务名称 port: number: 8080 #替换为您的目标服务端口 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce
表1 关键参数说明 参数
是否必填
参数类型
描述
kubernetes.io/elb.tls-ciphers-policy
否
String
默认值为“tls-1-2”,为监听器使用的默认安全策略,仅在HTTPS协议下生效。
取值范围:
- tls-1-0
- tls-1-1
- tls-1-2
- tls-1-2-strict
各安全策略使用的加密套件列表详细参见表2。
tls
否
Array of strings
HTTPS协议时,需添加此字段用于指定密钥证书。
该字段支持添加多项独立的域名和证书,详见为ELB Ingress配置服务器名称指示(SNI)。
secretName
否
String
HTTPS协议时添加,配置为创建的密钥证书名称。
表2 tls_ciphers_policy取值说明 安全策略
支持的TLS版本类型
使用的加密套件列表
tls-1-0
TLS 1.2
TLS 1.1
TLS 1.0
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-SHA:AES256-SHA
tls-1-1
TLS 1.2
TLS 1.1
tls-1-2
TLS 1.2
tls-1-2-strict
TLS 1.2
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384
- 创建Ingress。
kubectl create -f ingress-test.yaml
回显如下,表示Ingress服务已创建。
ingress/ingress-test created
查看已创建的Ingress。
kubectl get ingress
回显如下,表示Ingress服务创建成功,工作负载可访问。
NAME HOSTS ADDRESS PORTS AGE ingress-test * 121.**.**.** 80 10s
- 访问工作负载(例如Nginx工作负载),在浏览器中输入安全访问地址https://121.**.**.**:443进行验证。
其中,121.**.**.**为统一负载均衡实例的IP地址。
使用ELB服务中的证书
使用ELB服务中的证书,可以通过指定kubernetes.io/elb.tls-certificate-ids这个annotations实现。
- 当同时指定annotation中已有证书和IngressTLS时,使用ELB服务中的证书。
- CCE不校验ELB服务中的证书是否有效,只校验证书是否存在。
- 仅v1.19.16-r2、v1.21.5-r0、v1.23.3-r0及以上版本的集群支持使用ELB服务中的证书。
1.21及以下版本集群:
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-test annotations: kubernetes.io/ingress.class: cce kubernetes.io/elb.port: '443' kubernetes.io/elb.id: 0b9a6c4d-bd8b-45cc-bfc8-ff0f9da54e95 kubernetes.io/elb.class: union kubernetes.io/elb.tls-certificate-ids: 058cc023690d48a3867ad69dbe9cd6e5,b98382b1f01c473286653afd1ed9ab63 spec: rules: - host: '' http: paths: - path: '/' backend: serviceName: <your_service_name> #替换为您的目标服务名称 servicePort: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-test namespace: default annotations: kubernetes.io/elb.port: '443' kubernetes.io/elb.id: 0b9a6c4d-bd8b-45cc-bfc8-ff0f9da54e95 kubernetes.io/elb.class: union kubernetes.io/elb.tls-certificate-ids: 058cc023690d48a3867ad69dbe9cd6e5,b98382b1f01c473286653afd1ed9ab63 spec: rules: - host: '' http: paths: - path: '/' backend: service: name: <your_service_name> #替换为您的目标服务名称 port: number: 8080 #替换为您的目标服务端口 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: cce
参数 |
参数类型 |
描述 |
---|---|---|
kubernetes.io/elb.tls-certificate-ids |
String |
ELB服务中的证书ID列表,不同ID间使用英文逗号隔开,列表长度大于等于1。列表中的首个ID为服务器证书,其余ID为SNI证书(SNI证书中必须带有域名)。 如果无法根据客户端请求的域名查找到对应的SNI证书,则默认返回服务器证书。 获取方法:在CCE控制台,单击顶部的“服务列表 > 网络 > 弹性负载均衡”,并选择“证书管理”。在列表中复制对应证书名称下的ID即可。 |