生产环境对外的服务一般需要配置HTTPS协议,使用Ingress也可以非常方便地添加HTTPS的证书。下面进行添加HTTPS证书演示:
1.使用Openssl生成一个证书
[root@k8s-master01 ~]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginx.test.com"
上面参数说明:
openssl: OpenSSL是一个开源的加密工具库,用于进行加密、解密和生成证书等操作req: 命令选项,用于执行证书请求相关的操作-x509: 命令选项,表示生成自签名的X.509证书,而不是创建证书签署请求(CSR)-nodes: 命令选项,表示在生成私钥时不加密密钥。这样生成的私钥文件不会有密码保护,这在Nginx中使用TLS证书时很常见,因为Nginx需要使用未加密的私钥-days 365: 命令选项,设置证书的有效期为365天,即一年-newkey rsa:2048: 命令选项,表示同时生成一个新的RSA 2048位的私钥-keyout tls.key: 命令选项,指定生成的私钥保存在名为tls.key的文件中-out tls.crt: 命令选项,指定生成的自签名证书保存在名为tls.crt的文件中-subj "/CN=nginx.test.com": 命令选项,设置证书的主题(Subject),其中包含了证书的通用名称(Common Name,简称CN)。这里将通用名称设置为nginx.test.com,这意味着该证书将用于nginx.test.com域名
生成tls.crt和tls.key文件
[root@k8s-master01 ~]# ls
tls.crt tls.key
2.创建tls类型的secret
[root@k8s-master01 ~]# kubectl create secret tls ca-secret --cert=tls.crt --key=tls.key -n study-ingress
[root@k8s-master01 ~]# kubectl get secret -n study-ingress
NAME TYPE DATA AGE
ca-secret kubernetes.io/tls 2 6s
default-token-5r4cf kubernetes.io/service-account-token 3 3h47m
3.配置 Ingress 添加 TLS 配置
[root@k8s-master01 ~]# vim ingress-ssl.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
creationTimestamp: null
name: nginx-ingress
namespace: study-ingress
# annotations:
# kubernetes.io/ingress.class: nginx
spec:
ingressClassName: nginx # for k8s >= 1.22+
rules:
- host: nginx.test.com
http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- nginx.test.com
secretName: ca-secret
上面参数说明:
- hosts:证书所授权的域名列表
- secretName:证书的Secret名字
说明:1.22+版本的k8s需要配置ingressClassName
4.更新该Ingress
[root@k8s-master01 ~]# kubectl apply -f ingress-ssl.yaml
5.使用curl进行测试,域名已经被重定向到 https
[root@k8s-master01 ~]# curl -H "Host:nginx.test.com" 192.168.1.35 -I
HTTP/1.1 308 Permanent Redirect
Date: Sun, 30 Jul 2023 12:46:45 GMT
Content-Type: text/html
Content-Length: 164
Connection: keep-alive
Location: https://nginx.test.com
打开浏览器,输入nginx.test.com查看到被重定向到 https://nginx.test.com
