背景和目的
在现代 Web 开发中,使用 HTTPS 加密协议进行通信是非常必要的,这不仅能够保护网站/应用的安全性,还可以提升用户体验和满意度。而在 Kubernetes 中,如果我们需要搭建一个使用 HTTPS 的 Web 服务,那么我们就需要对 Kubernetes 进行一些配置。
本文将介绍如何在 Kubernetes 中配置 HTTPS,假设我们已经有以下环境:
- 一个可用的 Kubernetes 集群(可使用 minikube)
- 一个已经存在的 Web 应用
步骤
步骤一:生成 SSL 证书
SSL 证书可以通过一些在线服务来申请,比如 Let's Encrypt 或 CloudFlare。这些服务可以提供免费的证书,所以我们只需要提供一些必要的信息(比如域名等)就可以获得证书。
在本文中,我们将使用 openssl 工具手动生成一个自签名的 SSL 证书,运行以下命令:
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /path/to/tls.key -out /path/to/tls.crt
其中,-x509
表示我们生成的是一个自签名的证书;-nodes
表示我们不使用加密进程;-days
表示有效期为 365 天,也可以根据需要自行更改;-newkey rsa:2048
表示使用 2048 位的 RSA 密钥;-keyout
和 -out
分别表示私钥和证书保存路径及文件名。
步骤二:生成 Kubernetes 的 SSL 证书
生成 Kubernetes 的 SSL 证书需要在 Kubernetes 集群外部进行,可以在集群外的主机上运行以下命令:
$ openssl genrsa -out kubernetes.key 2048 $ openssl req -new -key kubernetes.key -out kubernetes.csr
这两个命令将在当前目录下生成私钥文件 kubernetes.key
和证书请求文件 kubernetes.csr
。
然后,我们还需要创建一个 openssl.cnf
文件,该文件用于指定证书扩展。运行以下命令:
-- -------------------- ---- ------- - --- ----- ------------ ----- -------------- - ------ -------------------- -------- ---------------- - -------- -------- - --------------- ----------------- --------------- -------------- - --------------- ----------------------- --------------------------- ----------------------------------------- ------------- -------------- ----------------- ---
其中,subjectAltName
表示证书可用的 IP 地址和 DNS 名称,需要根据实际情况进行修改。
最后,我们使用以下命令将证书请求文件和私钥文件生成 Kubernetes 证书:
$ openssl x509 -req -in kubernetes.csr -CA /path/to/tls.crt -CAkey /path/to/tls.key -CAcreateserial -out kubernetes.crt -days 365 -extensions v3_req -extfile openssl.cnf
其中,-CA
和 -CAkey
表示使用前面生成的自签名证书;-CAcreateserial
表示创建一个序列号文件;-days
表示证书有效期,需要与前面生成的自签名证书保持一致;-extensions
和 -extfile
指明证书的扩展信息。
步骤三:创建 Secret 对象
在 Kubernetes 中,我们可以使用 Secret 对象存储证书和私钥,然后将这些信息传递给 Web 应用。
运行以下命令创建 Secret 对象:
$ kubectl create secret tls tls-secret --key /path/to/kubernetes.key --cert /path/to/kubernetes.crt
其中,tls-secret
表示 Secret 对象的名称,--key
和 --cert
分别表示私钥和证书的路径和文件名。
步骤四:通过 Ingress 进行 HTTPS 配置
在 Kubernetes 中,Ingress 是一种将外部请求路由到集群内部服务的方式。我们可以通过 Ingress 配置 HTTPS。
如果我们使用的是 nginx Ingress,那么可以通过以下方式创建 Ingress:
-- -------------------- ---- ------- ----------- ------------------ ----- ------- --------- ----- ---------- ------------ ----------------------------------------- ------ -------------------------------------------- ------ ----- ---- - ----------- ---------- ------ - ----- ----------- ----- ------ - ----- - -------- ------------ ------------------ ------------ --
其中,tls
表示将使用的 Secret 对象名称;rules
表示 Ingress 的规则,包括域名和后端服务;nginx.ingress.kubernetes.io/ssl-redirect
和 nginx.ingress.kubernetes.io/ssl-passthrough
分别表示开启强制 HTTPS 和 TLS 代理传输。
如果我们使用的是 Traefik Ingress,则可以通过以下方式创建 Ingress:
-- -------------------- ---- ------- ----------- ------------------ ----- ------- --------- ----- ---------- ------------ ---------------------------- ------- --------------------------- --------------- ---------------------- ------------------ ------------------------------------- ----- ------------- ---- --------------- ------ ----- ---- - ----------- ---------- ------ - ----- ----------- ----- ------ - ----- - -------- ------------ ------------------ ------------ --
可见,在 Traefik 中 HTTPS 配置较为复杂,需要指定很多参数。
步骤五:测试 HTTPS 配置
最后,我们可以使用浏览器或命令行工具(比如 curl)访问 Web 应用的 HTTPS 地址,来测试是否配置成功。
浏览器访问方法:
https://example.com/
命令行访问方法:
$ curl --insecure https://example.com
其中,--insecure
表示禁用 SSL 认证校验。
总结
本文介绍了如何在 Kubernetes 中配置 HTTPS,包括生成 SSL 证书、生成 Kubernetes 的 SSL 证书、创建 Secret 对象、通过 Ingress 进行 HTTPS 配置以及测试 HTTPS 配置。通过本文的学习,读者可以了解 Kubernetes 中的 HTTPS 配置方法,并能在实际项目中进行应用。
参考文献
示例代码
本文所有代码均可以在 GitHub Repository 中获得。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/646b0531968c7c53b0a77441