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模塊》,請繼續關注。

最後

若是有什麼疑問和看法,歡迎評論區交流。
轉載請告知做者受權,並在明顯位置給出出處及連接

相關文章
相關標籤/搜索