为保证公网环境下的通信安全,业务使用 Ingress 暴露到公网时,通常使用 HTTPS 协议通信。本文为您介绍如何配置 HTTPS 协议的 ALB Ingress。
容器服务 ALB Ingress 支持 2 种证书管理方式:应用型负载均衡和证书中心。其主要区别如下表所示。
对比项 | 应用型负载均衡证书 | 证书中心证书 |
---|---|---|
证书存储方式 | 应用型负载均衡存储。 | 证书中心存储。 |
证书发现方式 | 通过证书 ID 发现。 | 通过证书 ID 发现。 |
更换证书方式 | 在应用型负载均控制台上更新证书后,在 VKE 更新 Ingress 资源。 | 在证书中心控制台上更新证书后,在 VKE 更新 Ingress 资源。 |
说明
【邀测·申请试用】:使用证书中心的证书创建 HTTPS 协议的 ALB Ingress 目前处于邀测阶段,如需使用,请联系客户经理。
您可以在 应用负载均衡控制台 管理证书,上传证书和密钥。详情请参见 证书管理。证书添加完成后,复制已创建好的证书 ID,下文的配置中会使用。
您也可以在火山引擎 证书中心 购买或上传证书。详情请参见 创建 SSL 证书、上传SSL证书。证书购买或上传完成后,复制证书 ID,下文的配置中会使用。
注意
ALB Ingress 使用 HTTPS 协议时,若需要更换证书,请勿在 ALB 控制台的监听器页面进行证书替换操作。当 VKE 侧 Ingress 规则发生变化时,会重新将监听器调谐成旧证书,可能引发业务故障。
更换 ALB Ingress 使用证书的操作步骤如下:
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: "cert_center" # 配置证书来源,取值:alb(ALB)、cert_center(证书中心) certificateID: "cert-2wx20lm7uquww7oot********" # 监听器协议为 HTTPS 时默认全域名使用的服务器证书 domainExtensions: - domain: "example.com" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书 certificateSource: "cert_center" # 配置证书来源,取值:alb(ALB)、cert_center(证书中心) certificateID: "cert-2wx20lo6vuww07oot********" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书
说明
更多 ALBInstance 配置,请参见 通过 kubectl 创建 ALB Ingress。
deployment-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: nginx:latest # 容器镜像地址和 Tag ports: - containerPort: 80 # 容器开放的端口号
kubectl apply -f deployment-demo.yaml
deployment-demo.yaml
代码如下: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 service-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 # 需要对接服务的端口号
说明
本例中使用最简单的方式创建 ALB Ingress。更多配置,请参见 通过 kubectl 创建 ALB Ingress。
kubectl apply -f alb-ingress.yaml
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>
openssl genrsa -out tls.key 4096
预期结果如下:
Generating RSA private key, 4096 bit long modulus ........+++++ ...+++++ e is 65537 (0x10001)
openssl req -new -key tls.key -out tls.csr
预期结果如下,需要填写证书的相关信息,包括:国家、地区、组织名称、域名、电子邮件地址等。
You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) []:CN # 2 位国家代码,例如 CN State or Province Name (full name) []:Shanghai # 地区名称,例如 Shanghai Locality Name (eg, city) []:Shanghai # 城市名称,例如 Shanghai Organization Name (eg, company) []:vke # 组织名称 Organizational Unit Name (eg, section) []:vke # 组织中的单位名称 Common Name (eg, fully qualified host name) []:example.com # 该证书对应的域名 Email Address []:user@example.com # 电子邮件地址 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:mypassword # 密码,可以为空
openssl x509 -req -in tls.csr -out tls.crt -signkey tls.key -days 365
tls.key
和证书tls.crt
。