如需在Knative服务中使用自定义域名,推荐为自定义域名配置一个HTTPS证书,提高数据传输的安全性。Knative支持HTTPS服务访问,将Knative服务安全地映射到自定义域名。
前提条件
已在集群中部署Knative,请参见部署Knative。
步骤一:创建Knative服务
-
登录容器服务管理控制台,在左侧导航栏选择集群列表。
-
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
-
在Knative页面的服务管理页签,选择命名空间为default,然后单击使用模板创建,使用控制台的示例模板创建Knative服务(helloworld-go服务),根据控制台指引完成服务的创建。
服务创建完成后,服务管理页签中显示 helloworld-go 服务状态为成功,默认域名为
helloworld-go.default.example.com。服务访问前,需将访问服务的域名与访问网关进行 Host 绑定。
步骤二:配置HTTPS服务
HTTPS 配置方式取决于网关类型:
-
ALB 网关:证书由 AlbConfig 统一管理,通过 Annotation 开启 TLS,无需手动处理证书文件。
-
Kourier 网关:需手动创建证书 Secret,再通过 DomainMapping 将 Secret 与域名绑定。
ALB
可在ALBConfig中指定证书,并在Knative服务中通过Annotationknative.k8s.alibabacloud/tls: "true"开启TLS访问。示例如下。
在 Knative 服务中添加 TLS Annotation,并在 AlbConfig 中配置 443 监听,即可开启 HTTPS 访问。
-
在 Knative 服务 YAML 中添加
knative.k8s.alibabacloud/tls: "true"Annotation。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: helloworld namespace: default annotations: knative.k8s.alibabacloud/tls: "true" spec: template: spec: containers: - image: registry-vpc.cn-shenzhen.aliyuncs.com/knative-sample/helloworld-go:73fbdd56 # 替换地域为实际使用的地域。 env: - name: TARGET value: "Knative" -
在AlbConfig中添加443监听,例如knative-internet,将 HTTPS 流量引入集群。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: knative-internet spec: config: ... listeners: - port: 443 # 可选项包括 HTTP、HTTPS、QUIC protocol: HTTPS ... -
验证服务可通过 HTTPS 访问。
# 替换 alb-ppcate4ox6******.cn-beijing.alb.aliyuncs.com 为 ALB 网关地址 curl -H "Host: helloworld.knative.top" https://alb-ppcate4ox6******.cn-beijing.alb.aliyuncs.com -k预期输出:
Hello Knative!
Kourier
Kourier 网关不内置证书管理,需先将 TLS 证书以 Secret 形式存入集群,Secret 就绪后再通过 DomainMapping 将域名与证书绑定。
1、创建证书 Secret
以下以 OpenSSL 自签名的HTTPS证书为例。如已有 .pem 格式证书文件,可跳过步骤 1,直接从步骤 2 开始。
自签名证书仅用于测试,生产环境建议使用 CA 签发的证书。
-
通过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 -
将步骤1中的
knativetop-key.pem和knativetop-cert.pem文件内容进行Base64编码。-
将
knativetop-key.pem进行Base64编码。cat knativetop-key.pem | base64预期输出:
a25hdGl2ZXRvcC1r****** -
将
knativetop-cert.pem进行Base64编码。cat knativetop-cert.pem | base64预期输出:
a25hdGl2ZXRvcC1jZ******==
-
-
创建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
2、创建DomainMapping
在Knative 中,DomainMapping 是一个资源对象,用于将一个域名映射到一个或多个Knative服务。
Secret 就绪后,通过 DomainMapping 将自定义域名与 Knative 服务绑定,并引用此前创建的 Secret 启用 TLS 加密。
-
创建
helloworld.knative.top.yaml文件,写入以下 DomainMapping 配置。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 -
将 DomainMapping 应用到集群。
kubectl apply -f helloworld.knative.top.yaml预期输出:
domainmapping.serving.knative.dev/helloworld.knative.top created -
执行以下命令,验证DomainMapping已就绪。
kubectl get domainmapping helloworld.knative.top预期输出:
NAME URL READY REASON helloworld.knative.top https://helloworld.knative.top True -
验证服务可通过自定义域名访问。
# 8.141.XX.XX为 Kourier 网关地址 curl -H "Host: helloworld-go.default.example.com" http://8.141.XX.XX -k预期输出:
Hello Knative!
相关文档
-
可配置探针(Probe),监测Knative服务的健康状态和可用性,请参见在Knative中配置端口探测。
-
如果ECI实例需连接公网,则需绑定EIP,请参见为ECI绑定EIP实现公网访问。