为Knative服务配置HTTPS证书访问

如您需要在Knative服务中使用自定义域名,推荐您为自定义域名配置一个HTTPS证书,提高数据传输的安全性。Knative支持通过配置DomainMapping的方式指定HTTPS证书,将Knative服务安全地映射到自定义域名。

前提条件

已在集群中部署Knative,请参见部署Knative

步骤一:创建Knative服务

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Knative

  3. Knative页面的服务管理页签,选择命名空间default,然后单击使用模板创建,选择使用容器控制台的示例模板创建Knative服务(helloworld-go服务),根据控制台指引完成服务的创建。

    image.png

步骤二:创建Secret证书

在Knative中,使用Secret存储和管理敏感信息,例如密钥、密码和证书等。本步骤使用OpenSSL创建一个自签名的HTTPS证书,并将证书和私钥文件编码为Base64格式,然后以Secret的形式存储到集群中。以下以自签名证书为例,介绍如何创建Secret证书。

  1. 执行以下命令,通过OpenSSL创建自签名证书。

    openssl genrsa -out knativetop-key.pem 4096
    openssl req -subj "/CN=helloworld.knative.top" -sha256  -new -key knativetop-key.pem -out knativetop.csr
    echo subjectAltName = DNS:helloworld.knative.top > extfile.cnf
    openssl x509 -req -days 3650 -sha256 -in knativetop.csr -signkey knativetop-key.pem -out knativetop-cert.pem -extfile extfile.cnf

    预期输出:

    Signature ok
    subject=CN = helloworld.knative.top
    Getting Private key
  2. 步骤1中的knativetop-key.pemknativetop-cert.pem文件内容进行Base64编码。

    • 执行以下命令,将knativetop-key.pem进行Base64编码。

      cat knativetop-key.pem | base64

      预期输出:

      a25hdGl2ZXRvcC1r******
    • 执行以下命令,将knativetop-cert.pem进行Base64编码。

      cat knativetop-cert.pem | base64

      预期输出:

      a25hdGl2ZXRvcC1jZ******==
  3. 执行以下命令,创建Secret。

    Secret可以用于Knative服务的TLS配置中,以实现对域名helloworld.knative.top的安全访问。

    kubectl create secret tls secret-tls --key knativetop-key.pem --cert knativetop-cert.pem

    预期输出:

    secret/secret-tls created

步骤三:创建DomainMapping

在Knative 中,DomainMapping是一个资源对象,用于将一个域名映射到一个或多个Knative服务。通过创建DomainMapping,您可以将一个自定义的域名映射到一个Knative服务,使得应用程序可以通过这个域名进行访问。

  1. 执行以下命令,创建helloworld.knative.top.yaml文件。

    vim helloworld.knative.top.yaml
  2. 在vi编辑器中添加以下YAML内容,保存后退出编辑器。

    apiVersion: serving.knative.dev/v1beta1
    kind: DomainMapping
    metadata:
      name: helloworld.knative.top
      namespace: default
    spec:
      ref:
        name: helloworld-go
        kind: Service
        apiVersion: serving.knative.dev/v1
    # tls block specifies the secret to be used
      tls:
        secretName: secret-tls
  3. 执行以下命令,将helloworld.knative.top.yaml中定义的资源应用到Kubernetes集群中。

    kubectl apply -f helloworld.knative.top.yaml

    预期输出:

    domainmapping.serving.knative.dev/helloworld.knative.top created
  4. 执行以下命令,验证DomainMapping。

    kubectl get domainmapping helloworld.knative.top

    预期输出:

    NAME                          URL                                      READY   REASON
    helloworld.knative.top       https://helloworld.knative.top            True

步骤四:访问HTTPS服务

执行以下命令,访问HTTPS服务。

ALB

在AlbConfig中添加443监听,例如knative-internet,配置如下。

apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
  name: knative-internet
spec:
  config:
  ...
  listeners:
    - port: 443
      protocol: HTTPS # protocol的可选项为HTTP、HTTPS、QUIC。
  ...

执行访问:

# alb-ppcate4ox6******.cn-beijing.alb.aliyuncs.com为ALB网关地址。
curl -H "host: helloworld.knative.top" https://alb-ppcate4ox6******.cn-beijing.alb.aliyuncs.com -k

MSE

# 8.141.XX.XX为MSE网关地址。
curl -H "host: helloworld-go.default.example.com" https://8.141.XX.XX -k

ASM

# 8.141.XX.XX为ASM网关地址。
curl -H "host: helloworld-go.default.example.com" http://8.141.XX.XX -k

预期输出:

Hello Knative!

相关文档