如何在Kubernetes里配置Ingress TLS证书
注意: SSL和TLS是一样的,SSL是旧的版本,TLS是新版本的SSL。
注意: SSL和TLS是一样的,SSL是旧的版本,TLS是新版本的SSL。
1.前提条件
有一个正常工作的ingress controller。
2.获取kubernetes ingress SSL/TLS证书
对于ingress TSL的基本要求是有TSL/SSL证书,可以通过下面几种方法获得证书。
2.1 自签名的证书:用自己的CA(证书颁发机构)来创建和签名TLS证书。这种方法非常适合开发环境,可以把根证书分享给团队,方便浏览器信任自签名的证书。
2.2 购买一个TLS证书:从浏览器和操作系统信任的知名CA(证书颁发机构)购买TLS证书。
2.3 使用Letsencrpt证书:Letsencrpt是一家非盈利的可信证书颁发机构,他们提供免费的TLS证书。
每个TLS证书都有一个过期日期。所以必须在证书过期前,进行证书的更新。比如Letsencrpt的证书每3个月就过期。
3.ingress TLS/SSL是如何工作的?
把TLS加到ingress里是非常简单的:
3.1 用server.crt证书和server.key私钥文件创建一个kubernetes sercet
3.2 将TLS值添加到ingress里,其中确切的主机名用来生成和TLS证书匹配的cert
SSL是由ingress controller来处理的,而不是ingress。也就是说,当你把TLS证书作为kubernetes sercet添加到ingress里面时,ingress controller就能获取到它,并使其变为自己的配置信息。
比如,在Nginx控制器里,SSL证书是由nginx.conf动态地处理:
ssl_certificate_by_lua_block {
certificate.call()
}
下图介绍了ingress TLS的工作流程:
4.配置ingress TLS/SSL证书
4.1 部署一个测试应用
首先,我们部署一个样例应用,用这个应用来测试ingress TLS。
创建一个dev的namespcae
kubectl create -n dev
把下面的yaml文件另存为hello-app.yaml,它包括了一个depolyment和service对象
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
namespace: dev
spec:
selector:
matchLabels:
app: hello
replicas: 2
template:
metadata:
labels:
app: hello
spec:
containers:
- name: hello
image: "gcr.io/google-samples/hello-app:2.0"
---
apiVersion: v1
kind: Service
metadata:
name: hello-service
namespace: dev
labels:
app: hello
spec:
type: ClusterIP
selector:
app: hello
ports:
- port: 80
targetPort: 8080
protocol: TCP
部署这个测试应用
kubectl apply -f hello-app.yaml
4.2 创建kubernetes TLS sercet
注意:这里假设你已经有了来自证书颁发机构,或者你自己公司的或者自签名的server.crt和server.key文件
把SSL证书作为kubernetes sercet添加到kubernetes里面。这样,ingress的TLS就能引用SSL证书了。
在dev的namespace里,我们用server.crt和server.key文件创建一个TLS类型的kubernetes sercet。注意,hello app也在dev的namespace里。
在server.crt和server.key文件所在的路径下执行下面的kubectl命令,hello-app-tls可以是任意的名字。
kubectl create secret tls hello-app-tls \
--namespace dev \
--key server.key \
--cert server.crt
下面是同样作用的yaml文件,不过需要将crt和key文件内容添加进去。
apiVersion: v1
kind: Secret
metadata:
name: hello-app-tls
namespace: dev
type: kubernetes.io/tls
data:
server.crt: |
<crt contents here>
server.key: |
<private key contents here>
4.3 把TLS添加到ingress
ingress需要和部署的测试应用在同一个namespace里面。所以,在dev的namespace里面创建样例ingress。
把下面的yaml文件另存为ingress.yaml,用hostname替换demo.hello.com。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-app-ingress
namespace: dev
spec:
ingressClassName: nginx
tls:
- hosts:
- demo.mlopshub.com
secretName: hello-app-tls
rules:
- host: "demo.mlopshub.com"
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-service
port:
number: 80
在上面的yaml文件里,添加了主机名为demo.hello.com和之前创建的tls secret的TLS block。我已经用demo.hello.com域名创建了自签名的TLS证书。
在TLS代码块里的host值应该要和rules代码块里的host值匹配。
4.4 验证ingress TLS
通过curl命令和浏览器来验证ingress TLS。
在CLI中,用你的domain来运行下面的curl命令
curl https://demo.hello.com -kv
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)