前言
后面 nginx 都是 http 协定在工作,那么加证书应该如何操作。
更新历史
- 20200701 - 初稿 - 左程立
- 原文地址 - https://blog.zuolinux.com/2020/07/01/nginx-https.html
创立证书
能够网上申请一年收费证书,也能够自建证书。上面自建证书。
下载自建证书脚本
wget -O Makefile https://raw.githubusercontent.com/kubernetes/examples/master/staging/https-nginx/Makefile
创立证书文件
make keys KEY=/tmp/nginx.key CERT=/tmp/nginx.crt
将证书写入到 K8S 的 secret 中
# kubectl create secret tls nginxsecret --key /tmp/nginx.key --cert /tmp/nginx.crtsecret/nginxsecret created
将 nginx 配置写入到 K8S 的 configmap 中
# cat default.confserver { listen 80 default_server; listen [::]:80 default_server ipv6only=on; listen 443 ssl; root /usr/share/nginx/html; index index.html; server_name localhost; ssl_certificate /etc/nginx/ssl/tls.crt; ssl_certificate_key /etc/nginx/ssl/tls.key; location / { try_files $uri $uri/ =404; }}
# kubectl create configmap nginxconfigmap --from-file=default.confconfigmap/nginxconfigmap created
整合后端 Pod 和证书,应用 Service 公布
[root@master01 ~]# cat nginx-app.yaml apiVersion: v1kind: Servicemetadata: name: my-nginx labels: run: my-nginxspec: type: NodePort ports: - port: 8080 targetPort: 80 protocol: TCP name: http - port: 443 protocol: TCP name: https selector: run: my-nginx---apiVersion: apps/v1kind: Deploymentmetadata: name: my-nginxspec: selector: matchLabels: run: my-nginx replicas: 1 template: metadata: labels: run: my-nginx spec: volumes: - name: secret-volume secret: secretName: nginxsecret - name: configmap-volume configMap: name: nginxconfigmap containers: - name: nginxhttps image: bprashanth/nginxhttps:1.0 ports: - containerPort: 443 - containerPort: 80 volumeMounts: - mountPath: /etc/nginx/ssl name: secret-volume - mountPath: /etc/nginx/conf.d name: configmap-volume
[root@master01 ~]# kubectl apply -f nginx-app.yaml service/my-nginx createddeployment.apps/my-nginx created
查看运行状况
[root@master01 ~]# kubectl get service -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORmy-nginx NodePort 192.20.27.173 <none> 8080:32529/TCP,443:32699/TCP 22s run=my-nginx[root@master01 ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESmy-nginx-85fccfd5dc-2pzvw 1/1 Running 0 64s 192.10.205.224 work01 <none> <none>
尝试拜访
[root@master01 ~]# curl -k https://192.20.27.173 <title>Welcome to nginx!</title>
Service 应用 NodePort 进行了端口裸露,所以能够在浏览器中拜访 https://任意节点IP:32699 ,也能够看到证书曾经失效。
因为是自建证书,须要手动疏忽报错。
整合 ingress 和证书
# cat ingress.yamlapiVersion: extensions/v1beta1kind: Ingressmetadata: name: secret-tls-ingress annotations: ingress.kubernetes.io/ssl-redirect: "False"spec: tls: - hosts: - test.com secretName: nginxsecret rules: - host: test.com http: paths: - backend: serviceName: my-nginx servicePort: 80 path: /
# kubectl apply -f ingress.yaml ingress.extensions/secret-tls-ingress created
在后面章节中曾经将 ingress-controller 绑定在了 work01/02 上,所以在集群外绑定 test.com 到 work01 IP 进行测试。
# curl -k https://test.com<title>Welcome to nginx!</title>
能够胜利拜访。
结束语
证书这块次要是把证书文件存入 K8S 的 secret 对象中,而后进行挂载映射。
这样能够实现证书文件和 ingress 的解耦。
能够只在 ingress 中设置证书,后端 nginx 不配置证书。
分割我
微信公众号:zuolinux_com