为保证公网环境下的通信安全,业务使用 Ingress 暴露到公网时,通常使用 HTTPS 协议通信。本文为您介绍如何使用集群中的 Secret 配置 ALB Ingress 的证书。
说明
【邀测·申请试用】:该功能目前处于邀测阶段。如需使用,请提交申请。
ALB Ingress 支持多种证书管理方式,其主要区别如下表所示。
对比项 | 使用 ALBInstance 配置证书 | 使用 Secret 配置证书 (指定证书 ID) | 使用 Secret 配置证书 (TLS 类型) |
---|---|---|---|
获取证书 | 在证书中心购买,或通过其他途径获取。 | ||
管理证书 | 应用型负载均衡和证书中心。 | 证书中心。 | |
使用证书 | 通过证书 ID 指定。 | 配置 TLS 类型的 Secret,并使用data 字段来指定 Base64 编码的证书和私钥。配置完成后,证书会自动上传并保存在证书中心。 | |
更换证书 | 在应用型负载均衡或证书中心更新证书后,在 VKE 更新 ALBInstance 配置。 | 在应用型负载均衡或证书中心更新证书后,在 VKE 更新 Secret 资源。 | 直接更新 Secret 资源。 |
说明
使用 ALBInstance 配置证书的方法,请参见 ALB Ingress 配置 HTTPS 协议。
说明
更多上传证书的要求,请参见 上传证书。
您可以使用 Secret 指定已经保存在应用型负载均衡服务或证书中心的证书。操作步骤如下:
secret-demo.yaml
代码如下:apiVersion: v1 kind: Secret metadata: name: https-secret-demo type: Opaque data: cert_id: Y2V***== # Base64 编码后的证书 ID cert_source: YWxi # Base64 编码后的证书来源,包括:YWxi(表示 alb)和 Y2VydF9jZW50ZXI=(表示 cert_center,即证书中心)
kubectl apply -f secret-demo.yaml
您可以配置 TLS 类型的 Secret,并使用data
字段来指定 Base64 编码的证书和私钥。证书导入到系统后,会被保存在证书中心。操作步骤如下:
echo -n `cat tls.key` | base64 # 将 tls.key 替换为您的私钥文件
echo -n `cat tls.crt` | base64 # 将 tls.crt 替换为您的证书文件
secret-demo.yaml
代码如下:apiVersion: v1 kind: Secret metadata: name: https-secret-demo type: kubernetes.io/tls data: tls.key: | LS0tLS1CRUdJTiBSU0EgUFJJVkFURS*** # Base64 编码后的 tls.key tls.crt: | LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS*** # Base64 编码后的 tls.crt
kubectl apply -f secret-demo.yaml
apiVersion: loadbalancer.vke.volcengine.com/v1beta1 kind: ALBInstance metadata: name: alb # ALBInstance 资源名称 spec: instance: name: "demo-alb" # ALB 实例名称 zoneMappings: # ALB 实例位于多可用区的子网列表 - subnetId: "subnet-bp12mw1f8k3jg0****" # 子网 ID,用于 ALB 实例在此可用区下的私网 IP 地址分配 addressType: "public" # 负载均衡类型。取值:public(公网类型)、 private(私网类型) eipSpec: isp: "BGP" # 公网负载均衡实例的 EIP 线路类型。取值:BGP bandwidth: 10 # 带宽上限。当 billingType 为 2 时,取值范围为 1~500Mbps;当 billingType 为 3 时,取值范围为 1~200Mbps billingType: 2 # 计费类型。取值:2(按量计费-按带宽上限)、3(按量计费-按实际流量) ipVersion: "ipv4" # IP 版本。取值:ipv4 deleteProtection: "on" # ALB 实例的删除保护功能,on 表示开启,off 表示关闭 listeners: - protocol: "HTTPS" # 监听器的协议 port: 443 # 监听器协议为 HTTPS 时的监听端口
说明
certificateSource
和certificateID
等参数配置证书类型和证书 ID,而是由 Secret 来管理和指定对应的证书。workload-demo.yaml
代码如下:apiVersion: apps/v1 kind: Deployment metadata: name: deployment-demo # 无状态负载名称 namespace: default # 无状态负载所在的命名空间 spec: replicas: 1 # 无状态负载的副本数 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx # 容器名称 image: doc-cn-beijing.cr.volces.com/vke/nginx-demo:v1.0 # 容器镜像地址和 Tag ports: - containerPort: 80 # 容器开放的端口号 --- apiVersion: v1 kind: Service metadata: name: service-demo # 服务名称 spec: selector: app: nginx # 通过标签选择器将服务与后段容器组(Pod)绑定。 ports: - name: rule # 端口映射规则名称 protocol: TCP # 服务协议,支持 TCP 或 UDP port: 80 # 服务端口 nodePort: 30000 # 节点端口,取值范围为 30000~32767 targetPort: 80 # 容器端口,即工作负载对外提供服务的端口号或端口名称,例如:Nginx 开放的默认端口号为 80 type: NodePort # 服务的类型
注意
kubectl apply -f workload-demo.yaml
alb-ingress.yaml
代码如下:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: alb-ingress-demo # 路由规则的名称 namespace: default # 路由规则所属的命名空间 annotations: ingress.vke.volcengine.com/loadbalancer-port: "443" # 监听器端口号 ingress.vke.volcengine.com/loadbalancer-protocol: "https" # 监听器协议。本例中取值为 https spec: ingressClassName: alb # ALB Instance 的资源名称 rules: - host: example.com # 需要对外提供访问的域名 http: paths: - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配) path: / # 请求匹配的路径 backend: service: name: service-demo # 需要对接的服务名称 port: number: 80 # 需要对接服务的端口号 tls: - secretName: https-secret-demo # 默认证书 - hosts: - example.com # (可选)指定需要加密的域名 secretName: https-secret-demo # 通过 Secret 为指定域名配置扩展证书
说明
本例中使用最简单的方式创建 ALB Ingress。更多配置,请参见 通过 kubectl 创建 ALB Ingress。
kubectl apply -f alb-ingress.yaml
如果您选择使用 Secret 导入本地证书,系统会自动将证书上传至证书中心保存。配置完成后,您可以登录证书中心查看对应的证书详情。
集群ID_Secret命名空间_Secret名称_Secret的Hash值
。您可以使用该名称,确认创建证书的集群和 Secret。注意
请勿在证书中心修改对应证书的名称,否则可能导致 ALB Ingress 故障。
执行以下命令,查看 Ingress 配置。
kubectl get ingress
预期返回结果如下,表示 Ingress 服务创建成功,服务可以访问。
NAME CLASS HOSTS ADDRESS PORTS AGE alb-ingress-demmo alb example.com 180.xxx.xxx.xxx 80,443 74s
使用以下命令,通过域名访问服务。
curl -H "Host: example.com" https://180.xxx.xxx.xxx --insecure
注意
-k
或--insecure
参数忽略证书的验证。预期输出如下,表示可以通过域名访问到后端服务。
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>