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