Ingress 配置 SSL证书
2020-06-10 by dongnan
开始之前
在《通过 Ingress 访问K8S内部的应用》这篇文章中,SSL终止于K8s
集群外部的负载均衡器,
如果使用的是裸金属
方式部署的K8s
集群没有外部负载均衡可用的。
需要K8s
集群的Ingress
控制器自行完成SSL终止工作,接下来介绍如何为Ingress
(控制器)配置SSL证书。
环境
测试的k8s
集群由一个Master
管理节点、两个Worker
计算节点组成,详细请参考这里。
操作步骤
Secret
首先将SSL证书转换为secret
对象,secret
对象既可以Yaml
文件创建,也可以使用命令行
方式创建。
本次使用的SSL证书,是由GeoTrust
签发的证书,下载时选择Nginx
服务器类型,将会得到两个文件:
demo.pem
,证书文件。demo.key
,证书私钥文件。
从证书文件创建 secret 对象:
kubectl create secret tls demo-ssl-2020 --key demo.key --cert demo.pem
参数说明:
- tls 表示
secret
的类型为TLS
,这与之前的docker-registry
有些不同 。 demo-ssl-2020
是secret
对象的名称。--key
证书私钥文件。--cert
证书文件。
验证
查看创建的 secret 对象:
kubectl describe secrets demo-ssl-2020
Name: demo-ssl-2020
Namespace: default
Labels: <none>
Annotations: <none>
Type: kubernetes.io/tls
Data
====
tls.crt: 4029 bytes
tls.key: 1679 bytes
Ingress
接下来准备 Ingress
对象部分。
Yaml 文档
Yaml 文件如下:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo-sfsp
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "demo"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
nginx.ingress.kubernetes.io/proxy-connect-timeout: "300"
nginx.ingress.kubernetes.io/session-cookie-path: "/"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- hosts:
- sfsp.xyc.com
secretName: demo-ssl-2020 # 这里
rules:
- host: sfsp.xyc.com
http:
paths:
- path: /
backend:
serviceName: sfsp-web-svc
servicePort: 80
注意:
- 配置项
secretName
的值是之前创建的secret
对象。 nginx.ingress.kubernetes.io/ssl-redirect: "true"
表示HTTP
强制跳转HTTPS
。
创建 Ingress
创建 Ingress 对象:
kubectl apply -f demo-ssl-ingress.yaml
验证
在集群外部成功访问项目系统:
url -IL https://sfsp.xyc.com
HTTP/2 200
date: Wed, 10 June 2020 03:17:22 GMT
content-type: text/html; charset=UTF-8
vary: Accept-Encoding
set-cookie: demo=1640747843.821.8271.782330; Expires=Tus, 30-June-20 03:17:22 GMT; Max-Age=172800; Path=/; Secure; HttpOnly