前言

后面 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