专栏首页运维之美使用 Cert-Manager 实现 Ingress Https

使用 Cert-Manager 实现 Ingress Https

什么是 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 已安装,且版本最好>2.10
  • 集群必须已经装有 Ingress Controller
  • 外部客户端配置 hosts,IP 指向 Ingress Controller 对外暴露的地址(如果 IP是公网地址并做了域名解析,则无需配置)

如果你还不会使用 Helm,可以先阅读「Helm 入门指南」和「利用 Helm 快速部署 Ingress」这两篇文章对 Helm 先做一个基本的了解。

部署 Cert-Manager

1. 使用 Helm 安装 Cert-Manager

  • 安装 CustomResourceDefinition 资源
$ kubectl apply -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.7/deploy/manifests/00-crds.yaml
  • 创建 Cert-Manager Namespace
$ kubectl create namespace cert-manager
  • 标记 Cert-Manager 命名空间以禁用资源验证
$ kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
  • 添加 Jetstack Helm repository
$ helm repo add jetstack https://charts.jetstack.io
  • 更新本地 Helm Chart Repository
$ helm repo update
  • 使用Helm chart安装cert-manager
$ helm install \  --name cert-manager \  --namespace cert-manager \  --version v0.7.0 \  jetstack/cert-manager
  • 查看 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: {}

说明:

  • metadata.name 是我们创建的签发机构的名称,后面我们创建证书的时候会引用它。
  • spec.acme.email 是你自己的邮箱,证书快过期的时候会有邮件提醒,不过 cert-manager 会利用 acme 协议自动给我们重新颁发证书来续期。
  • spec.acme.server 是 acme 协议的服务端,我们这里用 Let’s Encrypt,这个地址就写死成这样就行。
  • spec.acme.privateKeySecretRef 指示此签发机构的私钥将要存储到哪个 Secret 对象中,名称不重要。
  • spec.acme.http01 这里指示签发机构使用 HTTP-01 的方式进行 acme 协议 (还可以用 DNS 方式,acme 协议的目的是证明这台机器和域名都是属于你的,然后才准许给你颁发证书)。
  • 部署
$ kubectl apply -f issuer.yaml
  • 查看 ClusterIssuer 创建结果
$ 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

说明:

  • spec.secretName 指示证书最终存到哪个 Secret 中。
  • spec.issuerRef.kind 值为 ClusterIssuer 说明签发机构不在本 namespace 下,而是在全局。
  • spec.issuerRef.name 我们创建的签发机构的名称(ClusterIssuer.metadata.name) 。
  • spec.dnsNames 指示该证书的可以用于哪些域名。
  • spec.acme.config.http01.ingressClass 使用 HTTP-01 方式校验该域名和机器时 Cert-Manager 会尝试创建 Ingress 对象来实现该校验,如果指定该值,会给创建的 Ingress 加上 kubernetes.io/ingress.class 这个 annotation,如果我们的 Ingress Controller 是 Traefik Ingress 。Controller,指定这个字段可以让创建的 Ingress 被 Traefik Ingress Controller 处理。
  • spec.acme.config.http01.domains 指示该证书的可以用于哪些域名。
  • 执行部署命令
$ kubectl apply -f cert.yaml
  • 查看 Certificate 创建结果
  • $ kubectl get certificate -n istio-systemNAME AGEdashboard-imroc-io 54s
  • 执行上述步骤,如有问题,可使用如下命令排查原因
  • $ kubectl describe -n istio-system certificate dashboard-imroc-io$ kubectl describe clusterissuer letsencrypt-prod
  • 查看生成的 Secret 结果
$ kubectl get secret -n istio-system | grep dashboard-imroc-iodashboard-imroc-io                              kubernetes.io/tls                     3      2m32s

测试 Ingress 使用 HTTPS

  • 创建一个 Nginx
$ 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。

参考资料

  • 项目地址:https://github.com/jetstack/cert-manager

本文分享自微信公众号 - 运维之美(Hi-Linux),作者:徐超

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为什么别人的代码总是很美,而你的却是很丑,让这款神器来彻底解救你吧!

    如果你想把一小段代码分享到各大社交网站,透过 GitHub Gist 产生链接是个不错的方式。若是要转为精美的图片, Carbon、CodeZen 这类可以将代...

    iMike
  • 学会了这条 Curl 命令实用小技巧,网站故障秒排除!

    curl 命令最常用的参数就是 -I,仅返回头部信息,使用 HEAD 请求,获取的结果如下:

    iMike
  • 你并不在意的 HTTPS 证书吊销机制,或许会给你造成灾难性安全问题!

    偶刷《长安十二时辰》,午睡时,梦到我穿越到了唐朝,在长安城中的靖安司,做了一天的靖安司司丞。当徐宾遇害消失的时候我不在司内,当时的情形我不得而知。

    iMike
  • 如何计算并测量ABAP及Java代码的环复杂度Cyclomatic complexity

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.blog....

    Jerry Wang
  • [Leetcode][python]二叉树的直径

    https://leetcode-cn.com/problems/diameter-of-binary-tree/description/

    后端技术漫谈
  • 清华博士,研究出微信抢到最大红包方法|附技术讲解

    众所周知, 抢红包遵循的一个原则就是“快”: 手快有、手慢无! ? 至于能抢到多少金额的红包 许多人都觉得纯粹靠运气。 但也有人直觉认为: 后抢比先抢的貌似能拿...

    BestSDK
  • “疫苗门”涉事公司官网被黑:不搞你,对不起祖国的花朵

    “疫苗门”风波持续发酵,“疫苗事件”的话题讨论也持续占据微博热搜榜第一。今天早上,涉事公司之一的长生生物科技有限公司官网(http://china.cs-vac...

    FB客服
  • R语言︱SNA-社会关系网络—igraph包(中心度、中心势)(二)

    SNA社会关系网络分析中,关键的就是通过一些指标的衡量来评价网络结构稳定性、集中趋势等。主要有中心度以及中心势两大类指标。

    素质
  • 牛客网 二叉树中和为某一值的路径

    输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在...

  • 任务调度的并行算法

    如果串行是肯定不行的。我们可以考虑并行策略,但是开了并行,怎么能够充分利用资源比较好呢。

    jeanron100

扫码关注云+社区

领取腾讯云代金券