You need to enable JavaScript to run this app.
导航
ALB Ingress 配置 HTTPS 协议
最近更新时间:2024.09.14 10:40:09首次发布时间:2024.06.12 10:18:19

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

证书管理

概述

容器服务 ALB Ingress 支持 2 种证书管理方式:应用型负载均衡和证书中心。其主要区别如下表所示。

对比项应用型负载均衡证书证书中心证书
证书存储方式应用型负载均衡存储。证书中心存储。
证书发现方式通过证书 ID 发现。通过证书 ID 发现。
更换证书方式在应用型负载均控制台上更新证书后,在 VKE 更新 Ingress 资源。在证书中心控制台上更新证书后,在 VKE 更新 Ingress 资源。

说明

邀测·申请试用】:使用证书中心的证书创建 HTTPS 协议的 ALB Ingress 目前处于邀测阶段,如需使用,请联系客户经理。

配置证书

使用应用负载均衡管理证书

您可以在 应用负载均衡控制台 管理证书,上传证书和密钥。详情请参见 证书管理。证书添加完成后,复制已创建好的证书 ID,下文的配置中会使用。
alt

使用证书中心管理证书

您也可以在火山引擎 证书中心 购买或上传证书。详情请参见 创建 SSL 证书上传SSL证书。证书购买或上传完成后,复制证书 ID,下文的配置中会使用。
alt

更换证书

注意

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

更换 ALB Ingress 使用证书的操作步骤如下:

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

配置 ALB Ingress

前提条件

  • 已创建集群,详情请参见 创建集群
  • 已连接集群,详情请参见 连接集群
  • 已完成证书配置,详情请参见 证书管理
  • (可选)如需使用证书中心的证书,请首先登录您的火山引擎账号,然后单击 服务授权,并在弹出的页面中单击 立即授权,完成跨服务授权。

步骤一:创建 ALBInstance

  1. 登录 容器服务控制台
  2. 单击左侧导航栏中的 集群
  3. 在集群列表页面,单击目标集群。
  4. 在左侧导航栏中,选择 工作负载 > 对象浏览器。 单击 使用 Yaml 创建,创建路由规则。指定外部域名和服务的映射关系。
    • 在 类型 下拉菜单中选择 自定义
    • 在 Yaml 配置框内输入 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: "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

  1. 创建完成后,在 对象浏览器 页面,单击 albinstance,进入详情页面,查看创建的 ALBInstance 资源。

步骤二:部署应用和服务

  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

步骤三: 创建 ALB Ingress

  1. 创建路由规则(Ingress)的 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

  2. 执行以下命令,创建 ALB Ingress。
    kubectl apply -f alb-ingress.yaml
    

结果验证

查看配置

  1. 执行以下命令,查看 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参数忽略证书的验证。
  • 在生产环境中使用 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 创建自签名证书

  1. 在本地环境中,访问 OpenSSL 官网,下载并安装 OpenSSL。
  2. 执行以下命令,生成 4096 位的 RSA 私钥。
openssl genrsa -out tls.key 4096

预期结果如下:

Generating RSA private key, 4096 bit long modulus
........+++++
...+++++
e is 65537 (0x10001)
  1. 执行以下命令,使用 RSA 私钥生成证书。
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 # 密码,可以为空
  1. 执行以下命令,使用私钥对证书进行签名,有效期配置为 365 天。
openssl x509 -req -in tls.csr -out tls.crt -signkey tls.key -days 365
  1. 至此,完成创建 HTTPS 加密所需的私钥tls.key和证书tls.crt