什么是 HTTPS 超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息,HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP 协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。
为了解决 HTTP 协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议 HTTPS,为了数据传输的安全,HTTPS 在 HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
什么是 Cert-Manager Cert-Manager 是一个云原生证书管理开源项目,用于在 Kubernetes 集群中提供 HTTPS 证书并自动续期,支持 Let’s Encrypt, HashiCorp Vault 这些免费证书的签发。在 Kubernetes 集群中,我们可以通过 Kubernetes Ingress 和 Let’s Encrypt 实现外部服务的自动化 HTTPS。
在 Kubernetes 集群中使用 HTTPS 协议,需要一个证书管理器、一个证书自动签发服务,主要通过 Ingress 来发布 HTTPS 服务,因此需要 Ingress Controller 并进行配置,启用 HTTPS 及其路由。
环境依赖
如果你还不会使用 Helm,可以先阅读「Helm 入门指南」和「利用 Helm 快速部署 Ingress」这两篇文章对 Helm 先做一个基本的了解。
部署 Cert-Manager
1. 使用 Helm 安装 Cert-Manager
$ kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.7/deploy/manifests/00-crds.yaml
$ kubectl create namespace cert-manager
$ kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
$ helm repo add jetstack https://charts.jetstack.io
$ helm repo update
$ helm install \ --name cert-manager \ --namespace cert-manager \ --version v0.7.0 \ jetstack/cert-manager
$ kubectl get pods --namespace cert-managerNAME READY STATUS RESTARTS AGEcert-manager-5658b7db79-824lt 1/1 Running 0 11hcert-manager-cainjector-768fd47f68-ls6zh 1/1 Running 0 11hcert-manager-webhook-5b4bc6b547-8qk2v 1/1 Running 0 11h
创建 ClusterIssuer
我们需要先创建一个签发机构,Cert-Manager 给我们提供了 Issuer 和 ClusterIssuer 这两种用于创建签发机构的自定义资源对象,Issuer 只能用来签发自己所在 Namespace 下的证书,ClusterIssuer 可以签发任意 Namespace 下的证书,这里以 ClusterIssuer 为例创建一个签发机构:
$ cat issuer.yaml apiVersion: certmanager.k8s.io/v1alpha1kind: ClusterIssuermetadata: name: letsencrypt-prodspec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: xxxx@126.com privateKeySecretRef: name: letsencrypt-prod http01: {}
说明:
$ kubectl apply -f issuer.yaml
$ kubectl get clusterissuerNAME AGEletsencrypt-prod 11m
创建 Certificate
有了签发机构,接下来我们就可以生成免费证书了,Cert-Manager 给我们提供了 Certificate 这个用于生成证书的自定义资源对象,它必须局限在某一个 Namespace 下,证书最终会在这个 Namespace 下以 Secret 的资源对象存储,创建一个 Certificate 对象:
$ cat cert.yaml apiVersion: certmanager.k8s.io/v1alpha1kind: Certificatemetadata: name: dashboard-imroc-io namespace: istio-systemspec: secretName: dashboard-imroc-io issuerRef: name: letsencrypt-prod kind: ClusterIssuer dnsNames: - istio.kiali.com acme: config: - http01: ingressClass: traefik domains: - istio.kiali.com
说明:
$ kubectl apply -f cert.yaml
$ kubectl get secret -n istio-system | grep dashboard-imroc-iodashboard-imroc-io kubernetes.io/tls 3 2m32s
测试 Ingress 使用 HTTPS
$ cat test-nginx.yaml apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: my-nginxspec: replicas: 1 template: metadata: labels: run: my-nginx spec: containers: - name: my-nginx image: nginx ports: - containerPort: 443---apiVersion: v1kind: Servicemetadata: name: my-nginx labels: app: my-nginxspec: ports: - port: 443 protocol: TCP name: https selector: run: my-nginx---apiVersion: extensions/v1beta1kind: Ingressmetadata: name: my-nginx annotations: kubernetes.io/ingress.class: "traefik" kubernetes.io/tls-acme: "true" certmanager.k8s.io/cluster-issuer: "letsencrypt-prod"spec: rules: - host: test.nginx.com http: paths: - backend: serviceName: my-nginx servicePort: 443 path: / tls: - secretName: dashboard-imroc-io hosts: - test.nginx.com
需要注意的是上面我们添加的两个 annotations 非常重要,这个将告诉 Cert Manager 去生成证书,然后由于我们这里要使用 HTTPS,所以我们需要添加一个 TLS 证书,而证书就是通过 k8sui-tls 这个 Secret 对象来提供的,要注意的是这个 Secret 对象并不是我们手动创建的,而是 Cert Manager 自动创建的证书对应的对应。然后直接创建这个资源对象即可:
$ kubectl apply -f test-nginx.yaml
创建完成后隔一会儿我们可以看到会多出现一个随机名称的 Ingress 对象,这个 Ingress 对象就是用来专门验证证书的:
$ kubectl get ingress -n istio-systemNAME HOSTS ADDRESS PORTS AGEcm-acme-http-solver-z562f test.nginx.com 80 62s
我们可以通过 Traefik 的 Dashboard 可以观察到这一变化,验证成功后,这个 Ingress 对象也自动删除了:
这个时候我们可以去 describe 下我们的 Ingress 对象,查看有无报错。
$ kubectl describe ingress my-nginx
同样我们可以去查看 Cert Manager 的 Pod 日志信息:
$ kubectl logs -f cert-manager-5658b7db79-824lt --namespace cert-manager
最后,我们来打开浏览器使用 HTTPS 访问服务。
到这里我们就完成了使用 Let’s Encrypt 实现 Kubernetes Ingress 自动化 HTTPS。
参考资料