k8s实践 - 如何优雅地给kong网关配置证书和插件。

前言

从去年上半年微服务项目上线以来,一直使用kong做为微服务API网关,整个项目彻底部署于k8s,一路走来,对于k8s,对于kong,经历了一个从无到有,从0到1的过程,也遇到过了一些坎坷,今天准备分享一些实际的当心得和经验,本篇将尽可能作到短小精干,但愿能让你们一目了然。nginx

在开始部署kongk8s环境中时,做者就思考过一些运维问题,以下:shell

  1. kong做为一个杰出的高性能微服务API网关,可使用lua脚本编写强大的插件来扩展它的功能,在这种状况下,插件可能会随着版本而变更,如何优雅地升级它呢?
  2. 为了让kong支持https,须要给它配置SSL 证书,那么当证书到期后,如何优雅地升级它呢?

备注:固然还有不少其余的问题,不过与今天的主题不符,后面再继续分享。后端

若是部署的时候都能预先考虑好这些问题,那么当问题来临的时候,就能够驾轻就熟地处理好它。api

讨论方案

方案1

将插件和证书直接打包进镜像里app

当须要升级时,制做新镜像,而后使用新镜像替换掉旧镜像便可。运维

方案2

将插件和证书放置到k8s的配置字典中微服务

当须要升级时,只需更新ConfigMap的配置信息,而后重启kong便可。性能

从上面能够看到,方案一经过升级整个网关的方式达到升级插件或证书的目的,不知足最小化升级风险的要求,粒度偏大,生产环境通常不会采用这种方式;而方案二将插件和证书做为配置信息,真正作到最小化升级,因此采用方案二进行实践lua

备注:方案一你们能够下去本身实践。插件

实践方案

实践此方案前,请确保已经将kong完整地部署到k8s中,这不是本篇的重点。

1、准备工做

将插件拷贝了k8s的master机器的/root/api-supported-versions目录下:

备注:这个插件返回后端目前支持的版本列表。

将证书拷贝了k8s的master机器的/root/certs目录下:

2、在k8s中建立配置信息

  • 建立证书

    因为证书属于机密信息,故建立为secret,命令以下:

    kubectl -n [命名空间] delete secret kong-certs;
    kubectl -n [命名空间] create secret generic kong-certs --from-file=/root/certs;

    浏览结果:

  • 建立插件

    插件信息建立为ConfigMap,命令以下:

    kubectl -n [命名空间] delete configmap kong-api-supported-versions;
    kubectl -n [命名空间] create configmap kong-api-supported-versions \
    --from-file=/root/api-supported-versions

    浏览结果:

3、给kong.deployment.yml打补丁

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    metadata:
      labels:
        app: kong
        release: gateway
    spec:
      containers:
      - env:
        # 证书名称与文件夹名称保持一直便可。
        - name: KONG_SSL_CERT
          value: /certs/[证书名称].crt
        - name: KONG_SSL_CERT_KEY
          value: /certs/[密钥名称].key
        - name: KONG_PLUGINS
          # 这里很重要:不要忘记添加插件名称。
          value: bundled,api-supported-versions
        image: kong:0.14.0
        imagePullPolicy: IfNotPresent
        name: kong
        ports:
        - containerPort: 80
          name: proxy
          protocol: TCP
        - containerPort: 443
          name: proxy-ssl
          protocol: TCP
        volumeMounts:
        - mountPath: /certs
          name: kong-certs
        # 插件目录为/usr/local/share/lua/5.1/kong/plugins,这个也是kong规定的目录。
        - mountPath: /usr/local/share/lua/5.1/kong/plugins/api-supported-versions/handler.lua
          name: handler-lua
          subPath: handler.lua
        - mountPath: /usr/local/share/lua/5.1/kong/plugins/api-supported-versions/schema.lua
          name: schema-lua
          subPath: schema.lua
      volumes:
      - name: kong-certs
        secret:
          defaultMode: 420
          secretName: kong-certs
      - configMap:
          defaultMode: 420
          items:
          - key: handler.lua
            path: handler.lua
          name: api-supported-versions
        name: handler-lua
      - configMap:
          defaultMode: 420
          items:
          - key: schema.lua
            path: schema.lua
          name: api-supported-versions
        name: schema-lua

请注意,为了简要,而且说明主题,上面仅为补丁部分脚本,你须要参考它,而后修改kong的部署资源文件,最后执行kubectl -n [命名空间] apply -f [kong部署资源文件名称.yml]才能完成打补丁。

4、如何升级证书和插件

从新建立k8s的配置信息,而后重启kong就好了,完美知足方案二所诉远景。

总结

本篇先讨论了,如何优雅地给k8s环境的kong部署插件和证书的方案,而后一步步实践整个方案,若是你以为本篇文章对您有帮助的话,感谢您的【推荐】,也能够【关注我】,我会按期的在博客分关于k8s的运维实践。
下一篇,做者会分享《k8s实践,如何给kong自定义nginx模块》,请继续关注。

最后

若是有什么疑问和看法,欢迎评论区交流。
转载请告知做者受权,并在明显位置给出出处及连接

相关文章
相关标签/搜索