容器化趨勢已勢不可擋,但是在遷移過程中會遇到很多的問題,典型的就是
在遷移過程中不可能將全部的服務一次性的遷移至k8s集群中,一般都會逐步的遷移,這種時候http的服務無所謂,但是遇到rpc的就比較麻煩,我們需要將一部分服務放在集群內,一部分服務放在集群外,這時就需要將注冊中心放在k8s的集群外,可是部署在pod內的應用在注冊RPC服務時,上報的IP都是POD的IP,這個IP是屬於k8s內獨有的類VPC地址,k8s集群外的服務是無法直接與該IP進行通信,所有我們就需要做到,讓應用程序在RPC注冊時上報宿主機IP,然后再利用kube-proxy等進行代理與pod通信。
典型的RPC框架,如Dubbo本身就支持從環境變量中讀取注冊IP進行上報,上報至注冊中心作為通信IP地址,這幾個參數DUBBO_PORT_TO_REGISTRY DUBBO_PORT_TO_BIND DUBBO_IP_TO_REGISTRY,有興趣可直接看下源碼,是直接用的System.getEnv(key);然后我們通過k8s的yaml文件中的env將IP地址注入pod內的系統中,如圖:
但是我們在配置k8s集群的yaml文件時,我們不能將IP地址直接寫死,如果寫死我們在別的node上建立時就比較麻煩,我們需要動態獲取宿主機IP后再進行注入,k8s在1.7之后就可以提供了這些支持,如圖 MY_NODE_IP即為宿主機IP:
具體都支持哪些參數,其實可以結合pod的配置文件看,不過一般在代碼遷移的時候基本就是podIP、NodeIP的比較多,可以看下截圖,這樣配置之后就可以在linux的env中拿到這些變量,然后再在代碼中通過System.getEnv(key)獲取該環境變量配置。
參考官方文檔地址:https://kubernetes.io/zh/docs/tasks/inject-data-application/environment-variable-expose-pod-information/