摘要:測(cè)試后,使用來(lái)發(fā)布。部署軟件組件,啟動(dòng)虛擬機(jī),將虛擬機(jī)分類到和節(jié)點(diǎn),然后部署密鑰清單。集群自動(dòng)化集群配置由三個(gè)控制。自簽證書簽署的服務(wù)器端證書和它的密鑰文件。
我們之前聊了把OpenStack跑在K8S上,如何基于Kubernetes在TCP云端創(chuàng)建私有云解決方法,運(yùn)用在生產(chǎn)或在OpenStack啟動(dòng)虛擬化。今天換個(gè)姿勢(shì),我們來(lái)看看如何在OpenStack虛擬機(jī)上運(yùn)行Kubernetes集群。
最近的Austin OpenStack峰會(huì)上,參會(huì)者中對(duì)容器感興趣的人數(shù)之多,讓我印象深刻。幾乎所有跟容器相關(guān)的會(huì)議現(xiàn)在都意識(shí)到了它的優(yōu)點(diǎn)。通過(guò)將應(yīng)用程序容器化,就能夠?qū)⒅鳈C(jī)操作系統(tǒng)虛擬化。這也就意味著,你可以在主機(jī)操作系統(tǒng)中為每個(gè)容器創(chuàng)建隔離環(huán)境,比如文件系統(tǒng),網(wǎng)絡(luò)堆棧和進(jìn)程空間,令容器之間互相可見(jiàn)。此外,容器又是輕量級(jí)、輕便的,不僅僅跨操作系統(tǒng),還可以跨云端。這些功能令開(kāi)發(fā)者可以快速構(gòu)建,部署,運(yùn)輸和擴(kuò)容應(yīng)用程序,而這些動(dòng)作在虛擬機(jī)環(huán)境中是不可能實(shí)現(xiàn)的。
在峰會(huì)上,我有幸將自己參與的一個(gè)對(duì)我們團(tuán)隊(duì)有很大幫助的項(xiàng)目呈現(xiàn)給觀眾們看。可以點(diǎn)擊這里查看我的presentation:這里。
這個(gè)項(xiàng)目是為了在我們的OpenStack Kilo 環(huán)境中建立起一個(gè)自動(dòng)Kubernetes部署。在這篇博客帖中,我會(huì)描述我們的解決方法,并且在Github上面提供代碼回購(gòu)的總覽。你可以利用其中一些代碼來(lái)創(chuàng)建你自己的Kubernetes集群自動(dòng)部署。記住,軟件只在開(kāi)發(fā)環(huán)境被測(cè)試,對(duì)于任何生產(chǎn)部署,都要確認(rèn)你跟往常一樣進(jìn)行了必要的盡職調(diào)查。
首先要回答的問(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=”
在pod層面,Kubernetes提供各種services,比如調(diào)度,副本,自我修復(fù),監(jiān)控,命名/發(fā)現(xiàn),身份識(shí)別,驗(yàn)證授權(quán)等等。Kubernetes也有可以讓開(kāi)發(fā)者寫自己模塊的插件模版,然后在這個(gè)平臺(tái)上面創(chuàng)建services。就像這篇博客寫得,Kubernetes是最先進(jìn)的、可編寫和管理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ō)得通了。
設(shè)置這個(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ā)布版本。
Kubernetes集群Deployment自動(dòng)化集群配置由三個(gè)ansible playbooks控制。你可以點(diǎn)擊這里拉取playbooks,模版和代碼:這里。這三個(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ù)存腳本(這里)用來(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)行playbook:
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所需的證書是通過(guò)將make-ca-cert.sh腳本作為playbook任務(wù)之一來(lái)運(yùn)行生成的。這個(gè)腳本在每個(gè)節(jié)點(diǎn)上的證書目錄中生成了以下證書。這個(gè)在每個(gè)節(jié)點(diǎn)上都有生成,因?yàn)镈ocker daemon也使用相同的服務(wù)器證書來(lái)配置TLS。cert文件目錄值在設(shè)置文件中也是可配置的。
ca.pem——自簽CA證書Server.crt/server.key——簽署的kube服務(wù)器端證書和它的密鑰文件。這個(gè)cert文件也可以被Docker Daemon進(jìn)程用來(lái)確保客戶端安全訪問(wèn)。
cert.pem/key.pem——簽署的客戶端證書和它的密鑰文件。kubectl和docker客戶使用。
在客戶機(jī)上面,你可以在repo里面找到這些certs文件夾。在客戶機(jī)里用convention
在這篇博客帖中,我會(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)控程序防火墻。
暴露Pod Services出于實(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)成員,編寫vip分布流量到節(jié)點(diǎn)端口。這個(gè)方法在以上框圖中已經(jīng)闡述。
服務(wù)發(fā)現(xiàn)可以使用DNS集群add-on服務(wù)實(shí)現(xiàn)完全自動(dòng)化。可以使用skydns-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記錄查找。
結(jié)論我希望這篇博客帖子闡明了如何用Ansible在OpenStack上創(chuàng)建Kubernetes集群。
原文鏈接
(如果需要轉(zhuǎn)載,請(qǐng)聯(lián)系我們哦,尊重知識(shí)產(chǎn)權(quán)人人有責(zé);)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/32454.html
摘要:截至目前,已服務(wù)了上汽集團(tuán)集團(tuán)本部上汽乘用車上汽大通吉安物流賽客出行等余家汽車企業(yè)。經(jīng)過(guò)這一兩年的嘗試及探索,上汽集團(tuán)帆一尚行正式將列為產(chǎn)品線的重要產(chǎn)品,用以支撐整個(gè)容器平臺(tái)的運(yùn)行。最終在平臺(tái)應(yīng)用的層面,上汽集團(tuán)也選擇了進(jìn)行應(yīng)用于落地。 帆一尚行成立于2015年,是上汽集團(tuán)的全資子公司,建設(shè)有上海、南京、鄭州(在建)三個(gè)數(shù)據(jù)中心,擁有超過(guò)4000臺(tái)物理服務(wù)器,10PB的數(shù)據(jù)存儲(chǔ),總面積...
摘要:使用安裝集群本文撰寫時(shí),的分支不穩(wěn)定,請(qǐng)使用版本來(lái)安裝,具體來(lái)說(shuō)就是切換到最新的上。確保每個(gè)都安裝了在每個(gè)上開(kāi)啟,修改,然后重啟。可參考這篇文章執(zhí)行找一臺(tái)服務(wù)器,用來(lái)執(zhí)行,的原理是通過(guò)連接到各個(gè)執(zhí)行命令安裝集群。 GitHub: https://github.com/chanjarste... 使用Kubespray安裝k8s集群 本文撰寫時(shí),Kubespray的master分支不穩(wěn)定...
摘要:使用安裝集群本文撰寫時(shí),的分支不穩(wěn)定,請(qǐng)使用版本來(lái)安裝,具體來(lái)說(shuō)就是切換到最新的上。確保每個(gè)都安裝了在每個(gè)上開(kāi)啟,修改,然后重啟。可參考這篇文章執(zhí)行找一臺(tái)服務(wù)器,用來(lái)執(zhí)行,的原理是通過(guò)連接到各個(gè)執(zhí)行命令安裝集群。 GitHub: https://github.com/chanjarste... 使用Kubespray安裝k8s集群 本文撰寫時(shí),Kubespray的master分支不穩(wěn)定...
摘要:企業(yè)將業(yè)務(wù)遷移到云平臺(tái)的最大好處之一是可以降低工作和運(yùn)營(yíng)成本,其中一個(gè)最重要的因素是云計(jì)算基礎(chǔ)設(shè)施的自動(dòng)化和配置。幸運(yùn)的是,有許多云計(jì)算基礎(chǔ)設(shè)施自動(dòng)化工具可用于幫助加快流程。企業(yè)需要深入了解將工作負(fù)載遷移到公共云的正確步驟,并因此降低成本。云遷移不會(huì)自行發(fā)生,在遷移項(xiàng)目成功之前并不能完成工作和任務(wù)。企業(yè)將業(yè)務(wù)遷移到云平臺(tái)的最大好處之一是可以降低工作和運(yùn)營(yíng)成本,其中一個(gè)最重要的因素是云計(jì)算基礎(chǔ)...
閱讀 3338·2021-11-22 15:22
閱讀 2862·2021-10-12 10:12
閱讀 2156·2021-08-21 14:10
閱讀 3822·2021-08-19 11:13
閱讀 2841·2019-08-30 15:43
閱讀 3223·2019-08-29 16:52
閱讀 438·2019-08-29 16:41
閱讀 1427·2019-08-29 12:53