You need to enable JavaScript to run this app.
导航
CLB Ingress 配置 HTTPS 协议
最近更新时间:2024.06.12 10:18:19首次发布时间:2023.12.18 16:28:36

为保证公网环境下的通信安全,业务使用 Ingress 暴露到公网时,通常使用 HTTPS 协议通信。本文为您介绍如何配置 HTTPS 协议的 CLB Ingress。

前提条件

  • 已创建集群。具体操作,请参见 创建集群
  • 已连接集群。具体操作,请参见 连接集群
  • 已在火山引擎 SSL 证书服务 购买或使用 OpenSSL 创建 SSL 证书和密钥。

操作步骤

步骤一:上传 HTTPS 证书

获得 HTTPS 证书后,需要通过负载均衡控制台,将证书和密钥上传。

  1. 登录 负载均衡控制台
  2. 在左侧导航栏单击 证书管理,单击 上传服务器证书。上传公钥证书和私钥证书。
    • server.crtca.crt 文件内容,按顺序复制到 上传服务器证书 页面的 公钥证书 一栏。
    • server.key 文件的复制内容到 私钥证书 一栏。
      alt
  3. 证书添加完成后,复制已创建好的证书 ID。
    alt

步骤二:配置保密字典

  1. 创建 Secret 的 YAML 文件。示例文件clb-secret.yaml代码如下:
apiVersion: v1
kind: Secret
metadata:
  name: demo-https-secret # 保密字典名称
  namespace: default # 保密字典的命名空间
  labels:
    lb.type: clb # 使用标签标记证书的属性,键为 lb.type,值为 clb,表示该证书是 CLB 证书
type: Opaque # 保密字典的类型,本例为 Opaque
data:
  cert_id: Y2VydC*** # CLB 中已上传的证书 ID,需要对原始 ID 进行 Base64 编码
  1. 执行以下命令,创建 Secret。
kubectl apply -f clb-secret.yaml

步骤三:部署应用和服务

  1. 创建工作负载的 YAML 文件。示例文件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 # 容器开放的端口号
  1. 执行以下命令,创建工作负载。
kubectl apply -f deployment-demo.yaml
  1. 创建服务的 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 # 服务的类型

注意

  • 当集群的容器网络模型为 Flannel 时,仅支持关联和选择 NodePort、LoadBalancer 类型的服务。
  • 当集群的容器网络模型为 VPC-CNI 时:
    • 若 Ingress 开启了 直通 Pod 模式,则支持关联和选择 NodePort、LoadBalancer、ClusterIP 类型的服务。
    • 若 Ingress 未开启 直通 Pod 模式,则仅支持关联和选择 NodePort、LoadBalancer 类型的服务。
  1. 执行以下命令,创建服务。
kubectl apply -f service-demo.yaml

步骤四:配置 CLB Ingress

  1. 创建 Ingress 的 YAML 文件。示例文件clb-ingress.yaml代码如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    ingress.vke.volcengine.com/loadbalancer-name: "clb-demo"
    # 配置负载均衡名称
    ingress.vke.volcengine.com/loadbalancer-spec: "small_1"
    # 配置创建负载均衡的规格。small_1:200Mbps、small_2:500Mbps、medium_1:1000Mbps、meidum_2:2000Mbps、large_1:5000Mbps、large_2:10000Mbps
    ingress.vke.volcengine.com/loadbalancer-subnet-id: "subnet-rrhvmyikek1sv0x58***"
    # 配置负载均衡器实例所属的子网
    ingress.vke.volcengine.com/loadbalancer-address-type: "public" 
    # 配置负载均衡类型。取值: public (公网类型)、 private (私网类型)
    ingress.vke.volcengine.com/loadbalancer-bandwidth:  "10" 
    # 配置公网负载均衡实例的 EIP 带宽峰值,取值范围:1~500Mbps
    # 配置负载均衡实例所属 VPC 的子网 ID
    ingress.vke.volcengine.com/loadbalancer-scheduler: "wrr" 
    # 指定调度算法。取值:wrr(加权轮询)、wlc(加权最小连接数)、sh(源地址哈希)
    ingress.vke.volcengine.com/loadbalancer-protocol: "https" 
    # 指定负载均衡实例的监听协议。取值:http 、https
    ingress.vke.volcengine.com/loadbalancer-port: "443" 
    # 指定负载均衡器对外的监听端口,取值范围为 1-65535。http 协议默认监听 80 端口,https 协议默认监听 443 端口
    # 指定 EIP 的共享带宽包
  name: clb-ingress # 自定义路由规则名称
  namespace: default # 指定命名空间
spec:
  ingressClassName: clb # 指定 IngressClass 资源名称
  rules:
  - host: example.com # 需要对外提供访问的域名
    http:
      paths:
      - backend:
          service:
            name: service-demo # 需要对接的服务名称
            port:
              number: 80 # 需要对接服务的端口号
        path: / # 请求匹配的路径
        pathType: Prefix # 路径类型:Exact(精确匹配)/Prefix(前缀匹配)
  tls:
  - host:
    - example.com # (可选)指定需要加密的域名。不配置表示加密所有的域名  
    secretName: demo-https-secret # 指定保密字典的名称
  1. 执行以下命令,创建 Ingress。
kubectl apply -f clb-ingress.yaml

结果验证

查看配置

  1. 执行以下命令,查看 ingress 配置。
kubectl get ingress

预期返回结果如下,表示 Ingress 服务创建成功,服务可以访问。

NAME          CLASS   HOSTS           ADDRESS          PORTS    AGE
clb-ingress   clb     example.com     180.xxx.xxx.xxx   80,443  74s

访问服务

使用以下命令,通过域名访问服务。

curl -H "Host: example.com" https://180.xxx.xxx.xxx --insecure

注意

  • 当您使用自签名证书时,可以使用-k--insecure参数忽略证书的验证。
  • 在生产环境中使用 TLS 证书时,建议您使用官方可信证书。使用自签名证书且忽略证书验证,可能导致您受到中间人攻击。

预期输出如下,表示可以通过域名访问到后端服务。

<!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 创建自签名证书

说明

您可以在火山引擎 SSL 证书服务 购买或使用 OpenSSL 创建 SSL 证书和密钥。本例以使用 OpenSSL 创建证书为例。

  1. 在本地环境中,访问 OpenSSL 官网,下载并安装 OpenSSL。
  2. 执行以下命令,生成公钥和私钥。
openssl genrsa -out server.key 1024 # 生成服务器端私钥
openssl rsa -in server.key -pubout -out server.pem # 生成服务器端公钥
  1. 生成 CA 证书。
openssl genrsa -out ca.key 1024
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
  1. 执行以下命令,生成服务器端证书。得到 server.crtca.crtserver.key 三个文件。
#服务器端需要向 CA 机构申请签名证书,在申请签名证书之前依然是创建自己的 CSR 文件
openssl req -new -key server.key -out server.csr
#向 CA 机构申请证书,签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
openssl x509 -in server.crt -out server.cer -outform der

如何更换 HTTPS 证书

注意

CLB Ingress 使用 HTTPS 协议时,若需要更换证书,请勿在 CLB 控制台的监听器页面进行证书替换操作。当 VKE 侧 Ingress 规则发生变化时,会重新将监听器调谐成旧证书,可能引发业务故障。

当需要更换 CLB 实例的 HTTPS 证书时,需要遵循以下操作步骤:

  1. 登录 负载均衡控制台,并上传新的证书和密钥,详情请参见上文中的步骤一。
  2. 登录 容器服务控制台
  3. 在集群列表页面,单击需要配置路由规则的目标集群。
  4. 在集群管理页面的左侧导航栏中,选择 服务与路由 > 路由规则,在路由规则中选择需要更新 HTTPS 证书的 Ingress 规则,在右侧 操作 列中选择 更新
  5. 监听配置 处,单击 创建密钥
    alt
  6. 配置密钥相关参数,在 服务器证书 下拉菜单中,选择已新的证书。
    alt
  7. 选择新创建的密钥,单击 确定,完成路由规则更新。
    alt
  8. 单击路由规则名称,在路由规则详情页中,选择 事件 页签,可以查看路由规则的调谐成功事件。
    alt
  9. 负载均衡控制台 中,可以查看实例监听器使用的证书详情,确定证书是否更换成功。
    alt