内容简介:我们知道在
我们知道 HTTPS 的服务非常安全,Google 现在对非 HTTPS 的服务默认是拒绝的,而且还能避免国内各种乱七八糟的劫持,所以启用 HTTPS 服务是真的非常有必要的。一些正规机构颁发的 CA 证书费用又特别高,不过比较幸运的是也有免费的午餐 - Let's Encrypt ,虽然只有90天的证书有效期,但是我们完全可以在证书失效之前,重新生成证书替换掉。在 Kubernetes 集群中就更方便了,我们可以通过 Kubernetes Ingress 和 Let’s Encrypt 实现外部服务的自动化 HTTPS。
在 Kubernetes 集群中使用 HTTPS 协议,需要一个证书管理器、一个证书自动签发服务,主要通过 Ingress 来发布 HTTPS 服务,因此需要 Ingress Controller 并进行配置,启用 HTTPS 及其路由。
部署
我们这里用来管理 SSL/TLS 证书的组件是 Cert manager ,它对于每一个 ingress endpoint 将会自动创建一个新的证书,当 certificates 过期时还能自动更新,除此之外,Cert manager 也可以和其它的 providers 一起工作,例如 HashiCorp Vault。为了方便我们这里使用 Helm 来部署即可。
如果你对 Helm 还不是很熟悉,可以参考前面我的Helm 系列文章
在使用的时候我们需要配置一个缺省的 cluster issuer ,当部署 Cert manager 的时候,用于支持 kubernetes.io/tls-acme: "true" annotation 来自动化 TLS:
ingressShim.defaultIssuerName=letsencrypt-prod ingressShim.defaultIssuerKind=ClusterIssuer
运行下面的命令部署 Cert manager:
$ helm install --name cert-manager --namespace kube-system --set ingressShim.defaultIssuerName=letsencrypt-prod --set ingressShim.defaultIssuerKind=ClusterIssuer stable/cert-manager NAME: cert-manager LAST DEPLOYED: Wed Dec 5 18:04:56 2018 NAMESPACE: kube-system STATUS: DEPLOYED RESOURCES: ==> v1/ServiceAccount NAME SECRETS AGE cert-manager 1 0s ==> v1beta1/CustomResourceDefinition NAME AGE certificates.certmanager.k8s.io 0s clusterissuers.certmanager.k8s.io 0s issuers.certmanager.k8s.io 0s ==> v1beta1/ClusterRole cert-manager 0s ==> v1beta1/ClusterRoleBinding NAME AGE cert-manager 0s ==> v1beta1/Deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE cert-manager 1 1 1 0 0s ==> v1/Pod(related) NAME READY STATUS RESTARTS AGE cert-manager-dd6856945-9ltk9 0/1 ContainerCreating 0 0s NOTES: cert-manager has been deployed successfully! In order to begin issuing certificates, you will need to set up a ClusterIssuer or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer). More information on the different types of issuers and how to configure them can be found in our documentation: https://cert-manager.readthedocs.io/en/latest/reference/issuers.html For information on how to configure cert-manager to automatically provision Certificates for Ingress resources, take a look at the `ingress-shim` documentation: https://cert-manager.readthedocs.io/en/latest/reference/ingress-shim.html
安装完成后,然后查看 Pod 运行状态:
$ kubectl get pod -n kube-system --selector=app=cert-manager NAME READY STATUS RESTARTS AGE cert-manager-cert-manager-7797579f9-m4dbc 1/1 Running 0 1m
除此之外,安装完成后 Cert manager 还提供了一些 Kubernetes custom resources :
$ kubectl get crd NAME AGE certificates.certmanager.k8s.io 1m clusterissuers.certmanager.k8s.io 1m issuers.certmanager.k8s.io 1m
创建证书签发服务
Cert manager 安装后,接下来需要定义上面的 letsencrypt-prod 这个 cluster issuer ,这里使用上面的 clusterissuers.certmanager.k8s.io 这个 CRD 来定义:(cluster-issuer.yaml)
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: icnych@gmail.com
privateKeySecretRef:
name: letsencrypt-prod
http01: {}
然后直接创建这个 ClusterIssuer 资源:
$ kubectl create -f cluster-issuer.yaml clusterissuer.certmanager.k8s.io "letsencrypt-prod" created $ kubectl get clusterissuer NAME AGE letsencrypt-prod 16s
测试
上面我们已经安装了 Cert manager ,定义了 ClusterIssuer ,接下来我们来配置 HTTPS 去访问我们的 Kubernetes Dashboard 的服务,Dashboard 的部署我们这里就不多说了,直接添加一个 Ingress 资源对象即可:(dashboard-ingress.yaml)
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: kube-ui
namespace: kube-system
annotations:
kubernetes.io/ingress.class: "traefik"
kubernetes.io/tls-acme: "true"
spec:
tls:
- hosts:
- k8sui.qikqiak.com
secretName: k8sui-tls
rules:
- host: k8sui.qikqiak.com
http:
paths:
- path: '/'
backend:
serviceName: kubernetes-dashboard
servicePort: 443
这里需要注意的是上面我们添加的两个 annotations 非常重要,这个将告诉 Cert Manager 去生成证书,然后由于我们这里要使用 HTTPS,所以我们需要添加一个 tls 证书,而证书就是通过 k8sui-tls 这个 Secret 对象来提供的,要注意的是这个 Secret 对象并不是我们手动创建的,而是 Cert Manager 自动创建的证书对应的对应。然后直接创建这个资源对象即可:
$ kubectl create -f dashboard-ingress.yaml
当然如果需要在公网中进行访问,我们还需要将我们这里的域名解析到 Ingress Controller 所在的任意一个节点,或者在本地的 /etc/hosts 中加上映射也是可以的。
创建完成后隔一会儿我们可以看到会多出现一个随机名称的 Ingress 对象,这个 Ingress 对象就是用来专门验证证书的:
$ kubectl get ingress -n kube-system NAME HOSTS ADDRESS PORTS AGE cm-acme-http-solver-hl5sx k8sui.qikqiak.com 80 37s kube-ui k8sui.qikqiak.com 80, 443 41s
我们可以通过 Traefik 的 Dashboard 可以观察到这一变化,验证成功后,这个 Ingress 对象也自动删除了:
这个时候我们可以去 describe 下我们的 Ingress 对象:
$ Name: kube-ui
Namespace: kube-system
Address:
Default backend: default-http-backend:80 (<none>)
TLS:
k8sui-tls terminates k8sui.qikqiak.com
Rules:
Host Path Backends
---- ---- --------
k8sui.qikqiak.com
/ kubernetes-dashboard:443 (10.244.0.31:8443)
Annotations:
kubernetes.io/tls-acme: true
kubernetes.io/ingress.class: traefik
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreateCertificate 13m cert-manager Successfully created Certificate "k8sui-tls"
可以看到最后提示成功创建了 Certificate 对象,同样我们可以通过下面的命令获取:
$ kubectl get certificate -n kube-system NAME AGE k8sui-tls 15m
这个时候 Let’s Encrypt 生成的证书文件就已经创建成功了,内容被添加到了上面 Ingress 中声明的 Secret 对象中:
$ kubectl get secret -n kube-system k8sui-tls kubernetes.io/tls 2 32m
同样我们可以看到 Cert manager 的 Pod 中的日志信息:
$ kubectl logs -f cert-manager-dd6856945-4drmr -n kube-system ...... 1 sync.go:124] Certificate "k8sui-tls" for ingress "kube-ui" already exists I1205 16:27:21.372285 1 sync.go:127] Certificate "k8sui-tls" for ingress "kube-ui" is up to date I1205 16:27:21.372362 1 controller.go:166] ingress-shim controller: Finished processing work item "kube-system/kube-ui" I1205 16:27:23.371967 1 controller.go:181] certificates controller: syncing item 'kube-system/k8sui-tls' I1205 16:27:23.372682 1 sync.go:174] Certificate kube-system/k8sui-tls scheduled for renewal in 1430 hours I1205 16:27:23.372769 1 controller.go:195] certificates controller: Finished processing work item "kube-system/k8sui-tls"
这个时候我们就可以通过 HTTPS 去访问上面我们配置的 Dashboard 的服务了,在浏览器中输入: https://k8sui.qikqiak.com ,就可以看到会跳转到登录界面了,更重要的是浏览器左上角出现了 绿色 的认证小图标了:
需要注意的是 Dashboard 会使用自己自建的证书,所以我们需要在 Traefik 的配置中添加上配置 insecureSkipVerify = true ,不去校验后端的证书服务,否则访问会有问题。如果你使用的是其他的 Ingress Controller,这里配置基本上也是一致的,只需要做相应的修改即可。
到这里我们就完成了使用 Let's Encrypt 实现 Kubernetes Ingress 自动化 HTTPS。
推荐
给大家推荐一个本人精心打造的一个精品课程,现在限时优惠中: 从 Docker 到 Kubernetes 进阶
扫描下面的二维码(或微信搜索 k8s技术圈 )关注我们的微信公众帐号,在微信公众帐号中回复 加群 即可加入到我们的 kubernetes 讨论群里面共同学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- [DevOps]自动化运维基础与自动化监控
- Java自动化——使用Selenium+POI实现Excel自动化批量查单词
- 测者的测试技术手册:自动化的自动化EvoSuite:Maven项目集成EvoSuite实战
- 构建自动化
- 自动化mock
- python自动化学习
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Dive Into Python
Mark Pilgrim / Apress / 2004-11-5 / GBP 31.49
Python is a new and innovative scripting language. It is set to replace Perl as the programming language of choice for shell scripters, and for serious application developers who want a feature-rich, ......一起来看看 《Dive Into Python》 这本书的介绍吧!