注意: 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的工作流程:
high-level ingress TLS workflow

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
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐