k8s實踐 - 如何優雅地給kong網關配置證書和插件。


前言

從去年上半年微服務項目上線以來,一直使用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模塊》,請繼續關注。

最后

如果有什么疑問和見解,歡迎評論區交流。
轉載請告知作者授權,並在明顯位置給出出處及鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM