zoukankan      html  css  js  c++  java
  • k8s实践

    前言

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

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

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

    备注:当然还有很多其他的问题,不过与今天的主题不符,后面再继续分享。

    如果部署的时候都能预先考虑好这些问题,那么当问题来临的时候,就可以得心应手地处理好它。

    讨论方案

    方案1

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

    当需要升级时,制作新镜像,然后使用新镜像替换掉旧镜像即可。

    方案2

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

    当需要升级时,只需更新ConfigMap的配置信息,然后重启kong即可。

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

    备注:方案一大家可以下去自己实践。

    实践方案

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

    一、准备工作

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

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

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

    二、在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
      

      浏览结果:

    三、给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]才能完成打补丁。

    四、如何升级证书和插件

    重新创建k8s的配置信息,然后重启kong就行了,完美满足方案二所诉远景。

    总结

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

    最后

    如果有什么疑问和见解,欢迎评论区交流。
    转载请告知作者授权,并在明显位置给出出处及链接

  • 相关阅读:
    高精度模板_C++
    NOIP总结
    HDU2063_过山车_C++
    手写堆_C++
    NOIP2013Day1解题报告
    [ CodeVS冲杯之路 ] P1368
    POJ1002_487-3279_C++
    [ CodeVS冲杯之路 ] P1092
    POJ2376_Cleaning Shifts_C++
    欧几里得距离_曼哈顿距离_切比雪夫距离
  • 原文地址:https://www.cnblogs.com/justmine/p/10358695.html
Copyright © 2011-2022 走看看