前言
從去年上半年微服務項目上線以來,一直使用kong
作為微服務API網關,整個項目完全部署於k8s
,一路走來,對於k8s
,對於kong
,經歷了一個從無到有,從0到1的過程,也遇到過了一些坎坷,今天准備分享一些實際的小心得和經驗,本篇將盡量做到短小精干,希望能讓大家一目了然。
在開始部署kong
到k8s
環境中時,作者就思考過一些運維問題,如下:
kong
作為一個傑出的高性能微服務API網關,可以使用lua
腳本編寫強大的插件來擴展它的功能,在這種情況下,插件可能會隨着版本而變動,如何優雅地升級它呢?- 為了讓
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模塊》,請繼續關注。
最后
如果有什么疑問和見解,歡迎評論區交流。
轉載請告知作者授權,並在明顯位置給出出處及鏈接。