您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么用Ansible部署Kubernetes集群到OpenStack”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么用Ansible部署Kubernetes集群到OpenStack”吧!
首先要answer的問(wèn)題就是kubernetes和ansible是什么,為什么要選擇他們?
Kubernetes(K8S)是一個(gè)通過(guò)調(diào)用API來(lái)編排和管理Docker容器的平臺(tái)。除了基本的編排功能,它還有持續(xù)驅(qū)動(dòng)控制進(jìn)程的功能,面向用戶指定所需的狀態(tài)。當(dāng)使用這個(gè)平臺(tái)的時(shí)候,你能將你的應(yīng)用程序容器分組到一個(gè)叫pod的組合單元。pod是一個(gè)分享網(wǎng)絡(luò)和存儲(chǔ)的容器組。當(dāng)你創(chuàng)建Docker容器的時(shí)候,默認(rèn)設(shè)置下,每個(gè)容器都會(huì)獲得自己的網(wǎng)絡(luò)命名空間也就是它自己的TCP/IP堆棧。Kubernetes用-net=”<container-name>|<container-id>”設(shè)置到Docker里,以此將所有的pod容器的網(wǎng)絡(luò)空間結(jié)合到一起。這個(gè)設(shè)置令容器可以再次使用另一個(gè)容器的網(wǎng)絡(luò)堆棧。K8S通過(guò)創(chuàng)建一個(gè)pod層面保持容器和它自己的網(wǎng)絡(luò)堆棧來(lái)完成,所有的pod容器被配置來(lái)重新使用保持容器的網(wǎng)絡(luò)空間。
在pod層面,Kubernetes提供各種services,比如調(diào)度,副本,自我修復(fù),監(jiān)控,命名/發(fā)現(xiàn),身份識(shí)別,驗(yàn)證授權(quán)等等。Kubernetes也有可以讓開(kāi)發(fā)者寫(xiě)自己模塊的插件模版,然后在這個(gè)平臺(tái)上面創(chuàng)建services。就像這篇博客寫(xiě)得,Kubernetes是最先進(jìn)的、可編寫(xiě)和管理Docker容器的開(kāi)源平臺(tái)之一。
我們選擇Ansible是因?yàn)樗钱?dāng)下最火、最直接、最容易使用的自動(dòng)化平臺(tái)之一。它運(yùn)行代理較少,在基礎(chǔ)架構(gòu)上使用ssh來(lái)登錄系統(tǒng),執(zhí)行你在playbook文件中描述的策略。這些策略被模式化為一個(gè)yaml格式的任務(wù)清單。在沒(méi)有自動(dòng)化的時(shí)候,這些就是必須由管理員來(lái)執(zhí)行部署基礎(chǔ)設(shè)施軟件的手動(dòng)任務(wù)。
這篇博客帖描述了在OpenStack虛擬機(jī)上面運(yùn)行的Kubernetes集群。一個(gè)K8S集群有一個(gè)master節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)運(yùn)行API server和一套運(yùn)行在pod容器上的worker節(jié)點(diǎn)。設(shè)置使用的是Ansible(>2.0),Ubuntu和Neutron網(wǎng)絡(luò)。測(cè)試后,使用OpenStack kilo來(lái)發(fā)布。Ansible部署K8S軟件組件,啟動(dòng)虛擬機(jī),將虛擬機(jī)分類到master和worker節(jié)點(diǎn),然后部署Kubernetes密鑰清單。我們使用neutron來(lái)給OpenStack虛擬機(jī)和K8S pod容器提供網(wǎng)絡(luò)連接。所有在測(cè)試環(huán)境中的虛擬機(jī)都運(yùn)行Ubuntu 14.04 服務(wù)器操作系統(tǒng)。
下圖展示的是運(yùn)行中的各種軟件組件,以及他們是如何在集群中交互的。我會(huì)把這個(gè)圖表作為資料來(lái)闡述自動(dòng)進(jìn)程,當(dāng)你瀏覽這篇博客的時(shí)候,看到這個(gè)框圖就會(huì)覺(jué)得說(shuō)得通了。
這個(gè)設(shè)置是假設(shè)你已經(jīng)有一個(gè)OpenStack云運(yùn)行核心services,比如Nova,Neutron,Glance和Keystone。你還需要>2.X的ansible版本在一個(gè)有憑證和網(wǎng)絡(luò)連通ssh到計(jì)算節(jié)點(diǎn)和虛擬機(jī)。這個(gè)ansible節(jié)點(diǎn)也需要能夠訪問(wèn)openStack API。我在我的Macbook上面用這些命令安裝了ansible:
sudo easy_install pip
sudo pip install ansible
在你安裝了ansible之后,用命令行:“ansible-version”來(lái)驗(yàn)證它的版本。它應(yīng)該輸出一個(gè)2.X發(fā)布版本。
自動(dòng)化集群配置由三個(gè)ansible playbooks控制。你可以點(diǎn)擊這里拉取playbooks,模版和代碼:https://github.com/naveenjoy/microservices。這三個(gè)playbooks是:
· launch-instances.yml — launches kubernetescluster instances
· deploy-docker.yml — deploys docker onall of the cluster instances
· deploy-kubernetes.yml — deploys kubernetescontrol and worker software components and brings up the cluster
所有的playbooks 從一個(gè)叫做settings.yml的文件中獲取他們輸入變量,這是根據(jù)設(shè)置文件參考的。設(shè)置文件中的節(jié)點(diǎn)代碼字典和他們的原數(shù)據(jù)(也叫做標(biāo)簽)在集群指定節(jié)點(diǎn)的名字,標(biāo)簽在應(yīng)用程序啟動(dòng)的時(shí)候被注入到節(jié)點(diǎn)里面。這些標(biāo)簽在運(yùn)行playbooks的時(shí)候,被云庫(kù)存腳本(https://github.com/naveenjoy/microservices/blob/master/scripts/inventory.py)用來(lái)將節(jié)點(diǎn)分類為master和worker。比如,標(biāo)簽為ansible-_host_groups的節(jié)點(diǎn)是k8s_master會(huì)被分類為master節(jié)點(diǎn),而標(biāo)簽值等于k8s_worker會(huì)被分類為workers。設(shè)置文件也包括名為os_cloud_profile的代碼字典,它給ansible提供nova虛擬機(jī)啟動(dòng)設(shè)置。為了開(kāi)啟實(shí)例,如下運(yùn)行playbook:
ansible-playbook -i hosts launch-instances.yml.
如果一切進(jìn)行順利,你會(huì)看到所有的Nova實(shí)例已經(jīng)在OpenStack云上準(zhǔn)確無(wú)誤地創(chuàng)建好了。這些實(shí)例會(huì)提供底層基礎(chǔ)設(shè)施來(lái)運(yùn)行K8S集群。在增加實(shí)例之后,你可以運(yùn)行剩下的playbooks來(lái)部署Docker和Kubernetes。在playbook運(yùn)行的時(shí)候,使用名為‘inventory.py’庫(kù)存腳本來(lái)分類節(jié)點(diǎn),這樣control和worker組件就會(huì)被部署到正確的虛擬機(jī)上。
按如下所示運(yùn)行playbooks:
ansible-playbook -i scripts/inventory.py deploy-docker.yml
ansible-playbook -i scripts/inventory.py deploy-kubernetes.yml
K8S集群的控制面板包括了API服務(wù)器,調(diào)度器,etcd數(shù)據(jù)庫(kù)和kube controller manager通過(guò)一個(gè)master密鑰清單文件。這個(gè)文件名為master-manifest.j2可以在模版文件夾里面找到。K8S控制面板軟件的版本是由設(shè)置文件決的。這個(gè)名為deploy-kubernetes.yml的playbook是第一次下載和部署kubelet和kube-proxy二進(jìn)制,并且在所有節(jié)點(diǎn)上開(kāi)啟這兩個(gè)services。然后master-manifest模版文件就會(huì)在master節(jié)點(diǎn)上被部署到一個(gè)叫做/etc/kubernetes/manifest的config目錄。這個(gè)目錄被kubelet daemon進(jìn)程監(jiān)視,它開(kāi)啟了所有的提供控制面板services的Docker容器。當(dāng)你使用Docker ps命令的時(shí)候,你會(huì)看到kube-apiserver,kube-controller-manager,etcd和kube-schedules進(jìn)程在master節(jié)點(diǎn)里運(yùn)行在他們自己的容器上。
API服務(wù)器被配置來(lái)使用HTTPS服務(wù)API。SSL所需的證書(shū)是通過(guò)將make-ca-cert.sh腳本作為playbook任務(wù)之一來(lái)運(yùn)行生成的。這個(gè)腳本在每個(gè)節(jié)點(diǎn)上的證書(shū)目錄中生成了以下證書(shū)。這個(gè)在每個(gè)節(jié)點(diǎn)上都有生成,因?yàn)镈ocker daemon也使用相同的服務(wù)器證書(shū)來(lái)配置TLS。cert文件目錄值在設(shè)置文件中也是可配置的。
Server.crt/server.key——簽署的kube服務(wù)器端證書(shū)和它的密鑰文件。這個(gè)cert文件也可以被Docker Daemon進(jìn)程用來(lái)確保客戶端安全訪問(wèn)。
cert.pem/key.pem——簽署的客戶端證書(shū)和它的密鑰文件。kubectl和docker客戶使用。
在客戶機(jī)上面,你可以在repo里面找到這些certs文件夾。在客戶機(jī)里用convention<nodename>.env為每個(gè)節(jié)點(diǎn)都創(chuàng)建了Docker環(huán)境文件。你可以追蹤這個(gè)環(huán)境變量的來(lái)源,然后運(yùn)行Docker客戶端而不是Docker主機(jī)。比如,為了在名為master1的master節(jié)點(diǎn)上運(yùn)行Docker命令,第一步就是執(zhí)行“source master1.env”,然后運(yùn)行命令。同樣,對(duì)于kubectl客戶端來(lái)說(shuō),config文件是由必要的憑證和集群master IP地址來(lái)創(chuàng)建的。Config文件可以在$HOME/.kube/config中找。這樣你可以在集群上的終端窗口運(yùn)行kubectl命令。
在這篇博客帖中,我會(huì)描述如何使用OpenStack neutron service來(lái)連接K8S pods。這跟GCE的設(shè)置有些相似。其實(shí)也可以選擇其他的,比如Flannel,使用UDP封裝在現(xiàn)有租戶neutron中為路由pod創(chuàng)建一個(gè)覆蓋網(wǎng)絡(luò)選項(xiàng)。使用neutron為pod網(wǎng)絡(luò)刪除這個(gè)為容器覆蓋又覆蓋的網(wǎng)絡(luò)構(gòu)架。
要重點(diǎn)注意的是在K8S中每個(gè)pod(也就是一組容器)都有一個(gè)IP地址。這就區(qū)別于在Docker中的網(wǎng)絡(luò)模版,在這里每個(gè)容器有主機(jī)的私有IP地址。為了讓K8S網(wǎng)絡(luò)運(yùn)行起來(lái),pod的IP地址必須是不需要NAT的,可路由的。這也就意味著兩件事情:
a)當(dāng)一個(gè)pod容器與其它pod中的容器交流的時(shí)候,通信必須是直接路由,不需要NAT的。
b)當(dāng)一個(gè)pod容器與虛擬機(jī)的IP地址交流的時(shí)候,通信必須是直接路由,不需要NAT的。
為了完成以上目的,第一步就是,在每個(gè)節(jié)點(diǎn)中名為docker0的默認(rèn)docker橋被一個(gè)名為cbr0的Linux橋所替代??邕^(guò)所有節(jié)點(diǎn),一個(gè)IP模塊被分配給pod網(wǎng)絡(luò),比如說(shuō)/16。這個(gè)模塊被抽象化了,節(jié)點(diǎn)到pod的映射被創(chuàng)建在一個(gè)設(shè)置文件里。在以上圖表中,我把10.1.0.0/16分配給pod網(wǎng)絡(luò),然后創(chuàng)建了以下映射:
node1 : 10.1.1.1/24
node2: 10.1.2.1/24
nodeN: 10.1.n.1/24
create-bridge.sh(create-bridge.sh)腳本創(chuàng)建cbr0,然后使用在設(shè)置文件中定義好的映射來(lái)配置pod子網(wǎng)絡(luò)的IP地址。
第二步就是配置租戶路由器到路由流量,再到pod子網(wǎng)絡(luò)。比如在以上的框圖中,租戶路由器肯定是被配置到路徑中,再配置流量到pod子網(wǎng)絡(luò)10.1.1.0/24,配置到位于private-subnet#1上node#1的以太網(wǎng)絡(luò)地址。同樣的,路徑必須添加在集群中指向每個(gè)節(jié)點(diǎn)的目的站來(lái)路由流量到pod網(wǎng)絡(luò)。使用add_neutron_routes.py腳本完成這個(gè)步驟。
第三步就是添加IP tables規(guī)則到冒充流量,從pod子網(wǎng)絡(luò)到為出站連接的網(wǎng)絡(luò)。這是因?yàn)閚eutron租戶路由器不知道它需要從pod子網(wǎng)絡(luò)SNAT流量。
最后一步就是打開(kāi)在每個(gè)節(jié)點(diǎn)的Linux內(nèi)核上的IP轉(zhuǎn)發(fā),到路徑包,再到網(wǎng)橋容器網(wǎng)絡(luò)。這些任務(wù)都由playbook deploy-kubernetes.yml執(zhí)行的。
運(yùn)行這個(gè)playbook的最終結(jié)果就是,neutron網(wǎng)絡(luò)現(xiàn)在被編程來(lái)進(jìn)行pods到網(wǎng)絡(luò)間的路由通信。
注意:默認(rèn)狀態(tài)下,作為一個(gè)抗欺騙安全措施,neutron在超管理器上安裝iptables防火墻規(guī)則,來(lái)控制流量在虛擬機(jī)端口的來(lái)去。所以,當(dāng)路由流量注入pod網(wǎng)絡(luò)到虛擬機(jī)的端口,它是被超管理器防火墻過(guò)濾過(guò)的。所幸,有一個(gè)叫做AllowedAddressPairs的neutron擴(kuò)展,它允許如pod子網(wǎng)絡(luò)的Havana發(fā)布版本,來(lái)通過(guò)虛擬機(jī)監(jiān)控程序防火墻。
出于實(shí)用性目的,每個(gè)pod必須放在服務(wù)抽象的前面。這個(gè)服務(wù)使用可以連接到pod容器里面運(yùn)行的應(yīng)用程序,來(lái)提供穩(wěn)定的IP地址。這是因?yàn)閜od能夠在任意節(jié)點(diǎn)上被調(diào)度,而且可以從分配好的node_pod_cidr范圍獲取任意IP地址。同樣的,當(dāng)你擴(kuò)展/縮減這些pods來(lái)容納流量變化,或者當(dāng)運(yùn)行失敗的pods通過(guò)平臺(tái)再次創(chuàng)建,他們的IP地址就會(huì)改變。從客戶角度來(lái)看,服務(wù)抽象要確保pods的IP地址保持固定。要重點(diǎn)注意的是,對(duì)于服務(wù)來(lái)說(shuō),CIDR,也就是cluster_cidr,只在每個(gè)節(jié)點(diǎn)本地存活,并不需要被neutron租戶路由器路由。這個(gè)服務(wù)IP流量被K8S用proxy功能(kube-proxy)分布到備份pod,proxy功能通常用iptables在每個(gè)節(jié)點(diǎn)中實(shí)施。
這個(gè)穩(wěn)定的service IP可以用Kubernetes的NodePort性能暴露到外面。節(jié)點(diǎn)端口所做的事情就是,它使用worker節(jié)點(diǎn)的IP地址和一個(gè)高TCP端口31000,來(lái)暴露服務(wù)IP地址和端口到外部。所以如果你分配一個(gè)浮動(dòng)IP到節(jié)點(diǎn),應(yīng)用程序會(huì)在那個(gè)IP和它的節(jié)點(diǎn)IP提供流量。如果你使用一個(gè)neutron負(fù)載平衡器,那就添加worker節(jié)點(diǎn)成員,編寫(xiě)vip分布流量到節(jié)點(diǎn)端口。這個(gè)方法在以上框圖中已經(jīng)闡述。
服務(wù)發(fā)現(xiàn)可以使用DNS集群add-on服務(wù)實(shí)現(xiàn)完全自動(dòng)化??梢允褂胹kydns-manifest和skydns-service來(lái)部署。K8S會(huì)自動(dòng)給每個(gè)在集群中定義的服務(wù)分配一個(gè)DNS名字。所以運(yùn)行在pod里面的程序可以查找集群DNS服務(wù)器來(lái)解決服務(wù)名稱和位置。集群DNS服務(wù)支持A和SRV記錄查找。
感謝各位的閱讀,以上就是“怎么用Ansible部署Kubernetes集群到OpenStack”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么用Ansible部署Kubernetes集群到OpenStack這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。