天天看點

Consul部署【在kubernetes叢集中部署】

需要一個kubernetes叢集,叢集各節點中提前準備好consul鏡像【版本:1.6.0】

建立k8s-consul-service.yaml服務,注意我們使用的是statefulset類型,是以service中clusterip選擇為none【headless service】,這樣statefulset中所有pod都可以通過dns映射互相找到

statefulset是為了解決有狀态服務的問題(對應deployments和replicasets是為無狀态服務而設計),其應用場景包括 穩定的持久化存儲,即pod重新排程後還是能通路到相同的持久化資料,基于pvc來實作 穩定的網絡标志,即pod重新排程後其podname和hostname不變,基于headless service(即沒有cluster ip的service)來實作 有序部署,有序擴充,即pod是有順序的,在部署或者擴充的時候要依據定義的順序依次依次進行(即從0到n-1,在下一個pod運作之前所有之前的pod必須都是running和ready狀态),基于init containers來實作 有序收縮,有序删除(即從n-1到0) 從上面的應用場景可以發現,statefulset由以下幾個部分組成: 用于定義網絡标志(dns domain)的headless service 用于建立persistentvolumes的volumeclaimtemplates 定義具體應用的statefulset statefulset中每個pod的dns格式為<code>statefulsetname-{0..n-1}.servicename.namespace.svc.cluster.local</code>,其中 <code>servicename</code>為headless service的名字 <code>0..n-1</code>為pod所在的序号,從0開始到n-1 <code>statefulsetname</code>為statefulset的名字 <code>namespace</code>為服務所在的namespace,headless servic和statefulset必須在相同的namespace <code>.cluster.local</code>為cluster domain

建立k8s-consul-statefulset.yaml

注意其中-retry-join=consul-0.consul.$(namespace).svc.cluster.local就是基于statefulset特性
*************測試一下******************: 第一步:使用指令代建立主機端口映射

第二步:注意這個8500位址隻能本機通路,使用curl指令繼續測試

不用擔心,以上結果是正确的,因為通過浏覽器通路的話,127.0.0.1:8500會自動跳轉到<code>http://127.0.0.1:8500/ui/dc1/services</code>預設ui展示界面,由于curl無法模拟浏覽器互動跳轉行為,是以顯示以上内容永久重定向.

建立nginx-ingress代理,供外部通路,建立k8s-consul-nginx-ingress.yaml

注意其中的域名consul.deri.com,通路的機器hosts中需要加入ip 域名 之後才能通路!
Consul部署【在kubernetes叢集中部署】

遇到的問題

問題一: [warn] memberlist: failed to resolve consul-2.consul.default.svc.cluster.local: lookup consul-2.consul.default.svc.cluster.local on 10.96.0.10:53: no such host 這是dns解析出現問題,排除coredns狀态,通過nslookup指令測試,發現并無問題。 解決辦法: 使用指令kubectl delete pod consul-0 consul-1 consul-2删除建立statefulset時自動建立的pod,讓k8s自動再建立新的consul-0 consul-1 consul-2 pod,發現問題不見了,猜測原因可能是部署k8s的主控端性能太差,dns服務處理太慢導緻。

繼續閱讀