摘要:nginx的常规配置使用ConfigMap,证书和私钥使用secret存储。ConfigMap的数据直接挂载到nginx的配置目录/etc/nginx/conf.d,那么nginx启动时就会从此处读取配置。将证书和私钥也注入到nginx的目录中/etc/ngi
让nginx支持HTTPS,并且将nginx相关的配置数据用ConfigMap和Secret从外部注入。
分析:
nginx的常规配置使用ConfigMap,证书和私钥使用secret存储。ConfigMap的数据直接挂载到nginx的配置目录/etc/nginx/conf.d,那么nginx启动时就会从此处读取配置。将证书和私钥也注入到nginx的目录中/etc/nginx/ssl,那么nginx会从此目录中读取证书和私钥文件。nginx如何知道证书和私钥在哪呢?在ConfigMap的配置中告诉它。这里简化只使用客户端的单向验证,服务端使用自签证书。
第一步:生成私钥server.key
openssl genrsa -out server.key 2048第二步:先创建openssl配置文件openssl.conf,主要用于低版本系统(作者使用的版本比较低,cent os 7)
cat openssl.conf[req]distinguished_name = req_distinguished_namex509_extensions = v3_ca[req_distinguished_name][v3_ca]subjectAltName = DNS:localhost,IP:192.168.234.100,IP:127.0.0.1,IP:::1EOF需要注意的是,作者这里使用了DNS、IP等各种扩展项(注意修改IP地址为自己的),那么后续可以使用上面任一方式访问服务端。
第三步:使用openssl生成证书server.crt
openssl req -new -x509 -days 365 -key server.key -out server.crt \-subj "/C=CN/OU=tech/OU=sec/CN=localhost" \-extensions v3_ca -config openssl.conf生成文件结束!
如果是高版本的openssl,可以一条命令生成:
openssl req -new -x509 -days 365 -key server.key -out server.crt \-subj "/C=CN/OU=tech/OU=sec/CN=localhost" \-addext "subjectAltName=DNS:localhost,IP:192.168.234.100,IP:127.0.0.1,IP:::1"kubectl create secret tls nginx-ssl-secret \--cert=server.crt \--key=server.key \--namespace=default # 根据实际命名空间调整这里需要注意的是使用了tls的创建类型,那么k8s会做一些处理,它将key固定命名为tls.crt、tls.key。
文件名:nginx-https-config.yaml。
ConfigMap主要存放nginx的服务器配置数据,如下:
cat nginx-https-config.yamlapiVersion: v1kind: ConfigMapmetadata:name: nginx-https-confignamespace: defaultdata:default.conf: |server {listen 443 ssl;server_name example.com; # 替换为你的域名# SSL证书配置(对应Secret挂载的路径)ssl_certificate /etc/nginx/ssl/tls.crt;ssl_certificate_key /etc/nginx/ssl/tls.key;# 可选:添加SSL安全配置ssl_protocols TLSv1.2 TLSv1.3;ssl_prefer_server_ciphers on;ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";location / {root /usr/share/nginx/html;index index.html;}}EOF注意数据的key为default.conf,那么后续注入到nginx的时候,也是用这个key名作为文件名。告诉nginx证书和私钥的位置文件名:nginx-https-deployment.yaml。
cat apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-httpsnamespace: defaultspec:replicas: 1selector:matchLabels:app: nginx-httpstemplate:metadata:labels:app: nginx-httpsspec:containers:- name: nginximage: nginx:alpineports:- containerPort: 443 # HTTPS默认端口volumeMounts:- name: ssl-certsmountPath: /etc/nginx/ssl # 证书挂载路径readOnly: true- name: nginx-configmountPath: /etc/nginx/conf.d # Nginx配置文件挂载路径volumes:- name: ssl-certssecret:secretName: nginx-ssl-secret # 引用之前创建的Secret- name: nginx-configconfigMap:name: nginx-https-config # 引用下面创建的ConfigMapEOF分析:
文件名:nginx-https-service.yaml。
cat其中,service暴露端口443,目标Pod端口443,集群外入口30010。这三个接口在前面的网络部分已经有详细说明。
#部署ConfigMapkubectl apply -f nginx-https-config.yaml#部署Podkubectl apply -f nginx-https-deployment.yaml#部署nginxkubectl apply -f nginx-https-service.yaml curl --CAcert ./server.crt \https://192.168.234.100:30010使用https访问绑定根证书,由于是自签,所以server.crt也主是CA。使用集群外访问Pod。kubectl delete -f nginx-https-config.yamlkubectl delete -f nginx-https-deployment.yamlkubectl delete -f nginx-https-service.yamlkubectl delete secret nginx-ssl-secretrm -rf nginx-https-config.yamlrm -rf nginx-https-deployment.yamlrm -rf nginx-https-service.yaml这个例子综合运用了ConfigMap和secret,将配置注入到nginx进行处理。这个例子综合了截止目前所学的所有知识。
来源:恋爱脑一点号