容器服務ACK集群支持多種應用訪問的形式,最常見的形式如<SLB-Instance-IP>:<Port>
、<NodeIP>:<NodePort>
和域名訪問等。ACK集群默認不支持HTTPS訪問,如果您希望能夠通過HTTPS進行應用的訪問,容器服務ACK和阿里云負載均衡服務為您提供安全的HTTPS訪問。本文通過實際案例演示的HTTPS訪問配置,幫助您在容器服務ACK中配置自己的證書。
前提條件
創(chuàng)建集群的服務器證書,包括公鑰證書和私鑰。
您可以通過執(zhí)行以下命令填寫證書信息,快速創(chuàng)建集群的服務器證書。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt
輸出:
Generating a 2048 bit RSA private key .......+++ .......+++ writing new private key to 'tls.key' ----- 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 State or Province Name (full name) []:zhejiang Locality Name (eg, city) []:hangzhou Organization Name (eg, company) []:alibaba Organizational Unit Name (eg, section) []:test Common Name (eg, fully qualified host name) []:foo.bar.com # 注意,您需要正確配置域名 Email Address []:te**@alibaba.com
創(chuàng)建的證書以及私鑰文件會保存在當前目錄下的tls.crt和tls.key文件中。
您也可以選擇購買阿里云簽發(fā)證書。具體操作,請參見選擇阿里云簽發(fā)證書。
背景信息
根據訪問的方式不同,當前可以分為兩種配置證書的方式:
在前端SLB上配置證書。
在Ingress中配置證書。
在SLB上配置HTTPS證書
該方式具有如下特點:
優(yōu)點:證書配置在SLB上,為應用外部訪問的入口,在集群內部進行應用的訪問仍依然使HTTP訪問方式。
缺點:需要維護較多的域名與IP地址的對應關系。
適用場景:應用不使用Ingress暴露訪問方式,通過LoadBalancer類型的Service進行應用訪問的暴露。
準備工作:
您已在該ACK集群中創(chuàng)建一個Nginx應用,該應用采用LoadBalancer類型的服務(Service)對外提供訪問。更多信息,請參見創(chuàng)建無狀態(tài)工作負載Deployment。
示例:
登錄容器服務管理控制臺。
在控制臺左側導航欄,單擊集群。
在集群列表頁面,單擊目標集群名稱或者目標集群右側操作列下的詳情。
在集群管理頁左側導航欄,選擇 。
選擇集群的命名空間和服務,單擊外部端點,您可通過
<SLB IP>:<Port>
的方式訪問該應用。登錄負載均衡管理控制臺。
配置SSL證書。
如果您是通過命令方式創(chuàng)建集群的服務器證書,您需要使用前提條件中創(chuàng)建的公鑰證書和私鑰上傳非阿里云簽發(fā)證書。具體操作,請參見上傳非阿里云簽發(fā)證書。
如果您是通過購買方式獲取阿里云簽發(fā)證書,請?zhí)^此步驟。關于創(chuàng)建阿里云簽發(fā)證書的操作,請參見選擇阿里云簽發(fā)證書。
在證書列表中,找到目標證書名稱下面的證書ID。
在容器服務管理控制臺的服務列表中,找到之前創(chuàng)建的服務,單擊右側操作列下的更新。
在更新服務對話框中的注解區(qū)域,添加以下兩個注解內容。
注解
名稱
值
注解一
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port
https:443
注解二
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id
${YOUR_CERT_ID}
說明將${YOUR_CERT_ID}替換成步驟7配置SSL證書生成的證書ID。
您還可以使用YAML方式添加注解內容,完整YAML示例如下:
apiVersion:v1 kind:Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port:"https:443" service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id:"${YOUR_CERT_ID}" name:nginx namespace:default spec: ports: - name:https port:443 protocol:TCP targetPort:80 - name:http port:80 protocol:TCP targetPort:80 selector: run:nginx type:LoadBalancer
說明HTTPS的443端口對應的targetPort端口需要配置成HTTP的端口80。
訪問HTTPS的Nginx應用,在瀏覽器中輸入
https://<slb-instance-ip>
并進行訪問。
在Ingress上配置證書
該方法具有以下特點:
優(yōu)點:無需改動SLB的配置。每一個應用都可以通過Ingress管理自己的證書,互不干擾。
適用場景:每個應用都需要單獨的證書進行訪問,或者集群中存在需要證書才能訪問的應用。
準備工作:
您已在該Kubernetes集群中創(chuàng)建一個Tomcat應用,該應用的服務(Service)采用ClusterIP的方式提供訪問。本例中準備使用Ingress對外提供HTTPS訪問服務。更多信息,請參見創(chuàng)建無狀態(tài)工作負載Deployment。
示例:
根據前提條件中準備好的證書執(zhí)行以下命令創(chuàng)建Secret。
說明在這里需要正確配置域名,否則后續(xù)通過HTTPS訪問會有問題。
kubectl create secret tls secret-https --key tls.key --cert tls.crt
登錄容器服務管理控制臺。
在控制臺左側導航欄,單擊集群。
在集群列表頁面,單擊目標集群名稱或者目標集群右側操作列下的詳情。
在集群管理頁左側導航欄,選擇 。
在路由頁面,單擊頁面右上角的創(chuàng)建Ingress。
在創(chuàng)建路由對話框中,配置可HTTPS訪問的路由,完成后單擊確定。
更多詳細的路由配置信息,請參見創(chuàng)建路由(Ingress)。本例中進行如下配置。
名稱:輸入該路由的名稱。
域名:即是前面配置的正確域名,與SSL證書中配置的保持一致。
服務名稱:選擇Tomcat應用對應的Service,端口為8080。
TLS配置:開啟TLS后,選擇已創(chuàng)建的保密字典。
您也可采用YAML文件的方式創(chuàng)建路由(Ingress),本例對應的YAML示例文件如下。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tomcat-https spec: tls: - hosts: - foo.bar.com secretName: secret-https rules: - host: foo.bar.com http: paths: - path: / backend: serviceName: tomcat-svc servicePort: 8080
返回路由列表,查看創(chuàng)建的路由(Ingress),本例中域名為
foo.bar.com
,并查看端點和域名,您也可進入路由詳情頁進行查看。說明本例中以
foo.bar.com
作為測試域名,您需要在hosts文件中創(chuàng)建一條記錄。47.110.119.203 foo.bar.com #其中IP地址即是路由的端點。
在瀏覽器中訪問
https://foo.bar.com
。說明由于創(chuàng)建了TLS證書訪問,所以要用HTTPS來進行域名訪問,針對該應用,本例以
foo.bar.com
為示例,在本地進行解析。在具體使用場景中,請使用備案過的域名。