應用部署在k8s上,首先想到的是應用k8s的預設service模式配置。
應用通過service向集群內部(clusterip)和集群外部(nodeport)暴露服務。k8s中的其他應用通過kube-dns提供的dns解析功能,訪問servicename:port即可訪問service後面的pod的服務。這需要兩個應用服務之間的互動不需要記錄對方的hostname或者ip,例如,假如應用服務通過socket連線到另乙個應用服務,並通過記錄他的ip或者hostname,以便下次連線時作為驗證對方。這樣的話會出現servicename:port與podname:port或者podip:port不符。
解決servicename:port與podname:port或者podip:port不符的問題,可以把被驗證的應用使用hostnetwork。
應用與宿主機共享網路空間,也就是k8s節點的ip,埠占用與宿主機一樣。這樣應用的ip就是宿主機的ip,與另乙個應用的連線也不經過service ip這一層。另乙個應用仍然採用kubernetes的pod網路模型,為使使用hostnetwork的應用能對其他應用的service name進行dns解析,需要設定引數hostnetwork: true和dnspolicy: clusterfirstwithhostnet。
該配置的缺點:應用的網路與宿主機一樣,需保證應用需要監聽的網路埠在宿主機上沒有被占用。並且無法使用容器漂移,動態伸縮特性。
解決servicename:port與podname:port或者podip:port不符的問題,還有一種方法,就是把被驗證的應用配置使用headless service。headless service即是把service type為clusterip的service配置spec.clusterip為none,這樣的話就不會為其分配serviceip,kube-dns解析servicename:port就會變成podip:port。在把servicename配置和pod的hostname一樣,這樣的kube-dns解析servicename:port就與podhostname:port一樣。達到了獲得實際podip的目的。相比hostnetwork配置,這個配置沒有它所具有的缺點。
上面提到headless service可以解決servicename:port與podname:port或者podip:port不符的問題。這是針對乙個應用pod在service後面,另乙個應用pod在service的前面。現在假設同乙個service後面的pod之間需要獲悉對方的hostname或者podip進行通訊,怎麼辦?例如,storm的worker元件之間需要通過hostname通訊,我們想要能快速伸縮worker元件,因此把所有的worker放到同乙個service後面。
一種解決辦法就是使用statefulset加headless service配置,這種配置kube-dns可以解析
podname.servicename.namespacename.svc.cluster.local對應到podip。在同乙個statefulset的pod的podname都是podname-0,podname-1,podname-2等數字遞增的命名。對於podname-0可以解析
podname-1.servicename.namespacename.svc.cluster.local到podname-1的podip。
在podname-0中使用命令
nslookup podname-1
會解析podname-1.namespacename.svc.cluster.local。因此需要我們修改/etc/resolv.conf
檔案 在search 後面加上 servicename.namespacename.svc.cluster.local,這樣就達到了解析到
podname-1.servicename.namespacename.svc.cluster.local的目的。
具體做法就是在statefulset的pod配置中加入lifecycle的poststart配置
lifecycle:
poststart:
exec:
command:
- /bin/sh
- -c
- >
if [ -z
"$(grep servicename /etc/resolv.conf)" ]; then
sed "s/^search \([^ ]\+\)/search servicename.\1 \1/" /etc/resolv.conf > /etc/resolv.conf
.new
; cat /etc/resolv.conf
.new > /etc/resolv.conf
; rm /etc/resolv.conf
.new
; fi;
至此,headless service後面的statefulset的pod之間可以相互通訊了。 應用在k8s上執行的幾種網路模式
應用部署在k8s上,首先想到的是應用k8s的預設service模式配置。應用通過service向集群內部 clusterip 和集群外部 nodeport 暴露服務。k8s中的其他 應用通過kube dns提供的dns解析功能,訪問servicename port即可訪問service後面的pod的...
k8s 執行應用
kubect建立deployment deployment 建立replicaset 根據replicaset 建立pod 命名方式 relicaset 的命名方式 deployment名稱 隨機數 pod命名方式 relicaset 隨機數 1 通過kubetcl 建立 kubectl run n...
k8s的回滾應用
預設配置下,kubernetes 只會保留最近的幾個 revision,可以在 deployment 配置檔案中通過revisionhistorylimit屬性增加 revision 數量。下面實踐回滾功能。應用有如下三個配置檔案httpd.v1.yml,httpd.v2.yml和httpd.v3....