如何在 Apache APISIX Ingress Controller 中使用 Cert Manager 管理证书

云原生实验室

共 8284字,需浏览 17分钟

 ·

2021-11-05 11:09


Apache APISIX Ingress Controller 是一款以 Apache APISIX 作为数据面的 Kubernetes Ingress Controller 开源工具,目前已经更新到 v1.3 版本,实现了如证书管理、负载均衡、金丝雀发布等功能。

Apache APISIX Ingress Controller V1.3 版本更新说明[1]

长久以来,证书管理都不是一件简单的事情,虽然 Apache APISIX Ingress Controller 支持从 Kubernetes Secrets 资源中提取证书、私钥并转换为 Apache APISIX 可识别的 SSL 对象,但这只是整个证书管理链中的一部分,证书的颁发、轮转、吊销逻辑依然需要管理员执行,尤其当证书数量比较多时,工作量往往并不小,因而会占用管理员不少的时间。Cert Manager 是一款致力于在 Kubernetes 平台上简化证书管理的软件,它支持对接许多不同的证书源,如 Let’s Encrypt 和 HashiCorp Vault。

Cert Manager 使用说明[2]

如果你在使用 Apache APISIX Ingress Controller 时,遇到了证书管理的麻烦,那么使用 Cert Manager 将会是一个不错的选择,本文将介绍如何通过 Cert Manager 来创建证书并对接到 Apache APISIX Ingress Controller。

步骤一:环境准备

如果你希望按照本文的指导进行实际的操作,请确保以下环境和工具已准备就绪:

  1. 准备一个可用的 Kubernetes 集群,开发环境中,你可以使用 Kind 和 Minikube
  2. 安装 kubectl[3]
  3. 安装 helm v3[4]

请注意,下文所有的操作都将在 ingress-apisix 命名空间中执行,因此需要先创建该命名空间:

$ kubectl create namespace ingress-apisix

步骤二:安装 Apache APISIX Ingress Controller

我们可以通过 Helm 来安装 Apache APISIX Ingress Controller,包括数据面的 Apache APISIX 和 etcd 集群。

$ helm repo add apisix https://charts.apiseven.com
$ helm repo update
$ helm install apisix apisix/apisix --set gateway.tls.enabled=true --set ingress-controller.enabled=true --namespace ingress-apisix

详细安装介绍可参考文档[5]

步骤三:安装 Cert Manager

通过 Helm 来安装 Cert Manager,详细的安装介绍可参考文档[6]

$ helm install cert-manager jetstack/cert-manager --namespace ingress-apisix  --set prometheus.enabled=false --set installCRDs=true

安装完毕后请等待一会后查看组件的运行状态,确保所有组件都已正常运行,你可以通过如下命令进行查看。

$ kubectl get all -n ingress-apisix

返回结果如下所示,表示所有组件都已正常运行。

$ kubectl get all -n ingress-apisix
NAME                                             READY   STATUS        RESTARTS   AGE
pod/apisix-5d99956d88-j68sj                      1/1     Running       0          63s
pod/apisix-69459554d4-btnwn                      0/1     Terminating   0          57m
pod/apisix-etcd-0                                1/1     Running       0          57m
pod/apisix-etcd-1                                1/1     Running       0          57m
pod/apisix-etcd-2                                0/1     Running       0          50s
pod/apisix-ingress-controller-7b5c767cc7-j62hb   1/1     Running       0          55m
pod/cert-manager-5ffd4f6c89-q9f7m                1/1     Running       0          45m
pod/cert-manager-cainjector-748dc889c5-nrvkh     1/1     Running       0          45m
pod/cert-manager-startupapicheck-kmgxf           0/1     Completed     0          45m
pod/cert-manager-webhook-bc964d98b-mkjj7         1/1     Running       0          45m

NAME                                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/apisix-admin                ClusterIP   10.96.16.25             9180/TCP                     57m
service/apisix-etcd                 ClusterIP   10.96.232.251           2379/TCP,2380/TCP            57m
service/apisix-etcd-headless        ClusterIP   None                    2379/TCP,2380/TCP            57m
service/apisix-gateway              NodePort    10.96.118.75            80:32039/TCP,443:30107/TCP   57m
service/apisix-ingress-controller   ClusterIP   10.96.13.76             80/TCP                       57m
service/cert-manager-webhook        ClusterIP   10.96.182.188           443/TCP                      45m

NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/apisix                      1/1     1            1           57m
deployment.apps/apisix-ingress-controller   1/1     1            1           57m
deployment.apps/cert-manager                1/1     1            1           45m
deployment.apps/cert-manager-cainjector     1/1     1            1           45m
deployment.apps/cert-manager-webhook        1/1     1            1           45m

NAME                                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/apisix-5d99956d88                      1         1         1       63s
replicaset.apps/apisix-69459554d4                      0         0         0       57m
replicaset.apps/apisix-ingress-controller-74c6b5fbdd   0         0         0       57m
replicaset.apps/apisix-ingress-controller-7b5c767cc7   1         1         1       55m
replicaset.apps/apisix-ingress-controller-7d58db957c   0         0         0       55m
replicaset.apps/cert-manager-5ffd4f6c89                1         1         1       45m
replicaset.apps/cert-manager-cainjector-748dc889c5     1         1         1       45m
replicaset.apps/cert-manager-webhook-bc964d98b         1         1         1       45m

NAME                           READY   AGE
statefulset.apps/apisix-etcd   2/3     57m

NAME                                     COMPLETIONS   DURATION   AGE
job.batch/cert-manager-startupapicheck   1/1           6m24s      45m

Kubernetes Controller Manager 的机制决定了 Pod 名称会有所不同。

步骤四:申请证书并测试

首先我们需要配置证书颁发对象,并创建自签名证书颁发者。

# issuer.yaml
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: issuer  
  namespace: ingress-apisix
spec:
  selfSigned: {}
$ kubectl apply -f issuer.yaml

请注意,自签名颁发对象不推荐使用在生产环境中!更多证书颁发对象的配置请参考文档[7]

其次为域名 httpbin.org 创建一张证书。

# httpbin-cert.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: httpbin
  namespace: ingress-apisix
spec:
  secretName: httpbin
  duration: 2160h # 90d
  renewBefore: 360h # 15d
  subject:
    organizations:
      - foo
  commonName: httpbin.org
  isCA: false
  privateKey:
    algorithm: RSA
    encoding: PKCS1
    size: 2048
  usages:
    - server auth
  dnsNames:
    - "httpbin.org"
    - "*.httpbin.org" 
  issuerRef:
  name: issuer
  kind: Issuer
  group: cert-manager.io
$ kubectl apply -f httpbin-cert.yaml

然后查看对应 Secrets 是否已经被创建。

$ kubectl get secrets -n ingress-apisix httpbin
NAME      TYPE                DATA   AGE
httpbin   kubernetes.io/tls   3      2m5s

此时该 Secrets 对象的创建事件已经被 Apache APISIX Ingress Controller 捕获到,我们将尝试访问 Apache APISIX Ingress Controller 来验证证书是否生效,首先我们需要创建额外的路由对象。

# 创建后端
$ kubectl run httpbin --image kennethreitz/httpbin --namespace ingress-apisix
$ kubectl expose pod httpbin -n ingress-apisix --port 80
# 定义 ApisixTls 对象
apiVersion: apisix.apache.org/v1
kind: ApisixTls
metadata:
  name: httpbin
  namespace: ingress-apisix
spec:
  hosts:
  - httpbin.org
  secret:
    name: httpbin
    namespace: ingress-apisix
---
# 定义访问后端的路由
apiVersion: apisix.apache.org/v2beta1
kind: ApisixRoute
metadata:
  name: httpbin 
  namespace: ingress-apisix
spec:
  http:
  - name: httpbin
    match:
      paths:
      - /*
      hosts:
      - httpbin.org
    backends:
    - serviceName: httpbin
      servicePort: 80

接着我们访问服务 apisix-gateway 。注意,默认情况下该服务的类型为 NodePort,你可以根据需要修改其类型,比如你的 Kubernetes 集群是云厂商托管的,则可以考虑将其修改为 LoadBalancer 类型,以获取一个外部可达的 IP。

这里我们通过端口转发的方式将服务映射到本地,从而进行访问。

$ kubectl port-forward -n ingress-apisix svc/apisix-gateway 8443:443
$ curl https://httpbin.org:8443/json --resolve 'httpbin.org:8443:127.0.0.1' -sk
{
  "slideshow": { 
    "author""Yours Truly",
    "date""date of publication",
    "slides": [
      { 
        "title""Wake up to WonderWidgets!",
        "type""all"      
      },
      {
        "items": [
          "Why WonderWidgets are great",
          "Who buys WonderWidgets"
        ],
        "title""Overview",
        "type""all"
      }
    ],
    "title""Sample Slide Show"
  }
}

经过上述操作,可以看到访问成功,说明证书已经生效。注意,由于证书是自签名的,这里需要加上 -k 选项来忽略证书的校验。

此外,如果你想要轮转证书,删除 httpbin 这一 Secret 对象即可,Cert Manager 会立刻创建一个新的 httpbin  Secret 对象,并且包含新的证书。

总结

本文主要讲解了如何利用 Cert Manager 在 Apache APISIX Ingress Controller 中进行证书的创建和管理。想了解更多关于 Apache APISIX Ingress 的介绍与内容,可参考 blog[8] 或者参与 Apache APISIX  Ingress 项目每两周举行的线上讨论,分享当下项目进度、最佳实践及设计思路等多个话题,具体详情可查看 issue[9]

引用链接

[1]

Apache APISIX Ingress Controller V1.3 版本更新说明: https://github.com/apache/apisix-ingress-controller/blob/master/CHANGELOG.md#130

[2]

Cert Manager 使用说明: https://cert-manager.io/docs/

[3]

安装 kubectl: https://kubernetes.io/docs/tasks/tools/

[4]

安装 helm v3: https://helm.sh/

[5]

文档: https://github.com/apache/apisix-helm-chart/blob/master/charts/apisix/README.md

[6]

文档: https://cert-manager.io/docs/installation/

[7]

文档: https://cert-manager.io/docs/configuration/

[8]

blog: https://apisix.apache.org/zh/blog/2021/10/09/apisix-ingress-techblog

[9]

issue: https://github.com/apache/apisix-ingress-controller/issues/614


你可能还喜欢

点击下方图片即可阅读

Earthly 一个更加强大的镜像构建工具

云原生是一种信仰 🤘

关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!



点击 "阅读原文" 获取更好的阅读体验!


发现朋友圈变“安静”了吗?

浏览 48
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报