本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

我們如何在 Yahoo! JAPAN 規模化地在 OpenStack 上架構和執行 Kubernetes

編者按:今天的帖子來自 Yahoo! JAPAN 的基礎設施工程團隊,他們將講述如何在 Kubernetes 上執行 OpenStack。這篇帖子經過許可,已進行翻譯和編輯以適應語境——最初發佈於 Yahoo! JAPAN 工程部落格

引言
這篇帖子概述了 Yahoo! JAPAN 如何在 Google 和 Solinea 的幫助下,構建一個自動化工具鏈,實現“一鍵式”程式碼部署到執行在 OpenStack 上的 Kubernetes。

我們還將介紹基本的安全性、網路、儲存和效能需求,以確保生產就緒。

最後,我們將討論用於構建 CI/CD 管道的生態系統工具、Kubernetes 作為虛擬機器/裸機上的部署平臺,以及 Kubernetes 架構的概述,以幫助您架構和部署自己的叢集。

前言
自我們公司於 2012 年開始使用 OpenStack 以來,我們的內部環境快速變化。我們最初的硬體虛擬化目標已透過 OpenStack 實現。然而,隨著雲計算和容器技術的發展,我們需要在各種平臺上啟動服務的能力。這篇帖子將提供我們將執行在 OpenStack 上的應用程式移植到 Kubernetes 的示例。

編碼生命週期
該專案的目標是從一個應用程式程式碼為所有必需平臺建立映象,並將這些映象部署到每個平臺。例如,當代碼在程式碼註冊中心更改時,CI(持續整合)工具會建立裸機映象、Docker 容器和虛擬機器映象,將其推送到我們的映象註冊中心,然後部署到每個基礎設施平臺。

我們在 CI/CD 管道中使用了以下產品

功能產品
程式碼註冊中心GitHub Enterprise
CI 工具Jenkins
映象註冊中心Artifactory
缺陷跟蹤系統JIRA
部署裸機平臺OpenStack Ironic
部署虛擬機器平臺OpenStack
部署容器平臺Kubernetes

映象建立。每個映象建立工作流程如下圖所示。

虛擬機器映象建立 :

  1. 1. 推送程式碼到 GitHub
  2. 2. 掛接到 Jenkins master
  3. 3. 在 Jenkins slave 上啟動任務
  4. 4. 檢出 Packer 倉庫
  5. 5. 執行服務任務
  6. 6. 透過構建指令碼執行 Packer
  7. 7. Packer 為 OpenStack Glance 啟動虛擬機器
  8. 8. 配置虛擬機器並安裝所需應用程式
  9. 9. 建立快照並註冊到 Glance 10.10. 從 Glance 下載新建立的映象 11.11. 將映象上傳到 Artifactory

裸機映象建立

  1. 1. 推送程式碼到 GitHub
  2. 2. 掛接到 Jenkins master
  3. 3. 在 Jenkins slave 上啟動任務
  4. 4. 檢出 Packer 倉庫
  5. 5. 執行服務任務
  6. 6. 透過構建指令碼下載基礎裸機映象
  7. 7. 構建指令碼使用 Packer 執行 diskimage-builder 以建立裸機映象
  8. 8. 上傳新建立的映象到 Glance
  9. 9. 上傳映象到 Artifactory

容器映象建立

  1. 1. 推送程式碼到 GitHub
  2. 2. 掛接到 Jenkins master
  3. 3. 在 Jenkins slave 上啟動任務
  4. 4. 檢出 Dockerfile 倉庫
  5. 5. 執行服務任務
  6. 6. 從 Artifactory 下載基礎 Docker 映象
  7. 7. 如果 Artifactory 中沒有找到 Docker 映象,則從 Docker Hub 下載
  8. 8. 執行 Docker 構建並建立映象
  9. 9. 上傳映象到 Artifactory

平臺架構。

讓我們關注容器工作流程,詳細說明我們如何使用 Kubernetes 作為部署平臺。該平臺架構如下所示。

功能產品
基礎設施服務OpenStack
容器主機CentOS
容器叢集管理器Kubernetes
容器網路Project Calico
容器引擎Docker
容器註冊中心Artifactory
服務註冊中心etcd
原始碼管理GitHub Enterprise
CI 工具Jenkins
基礎設施供應Terraform
日誌記錄Fluentd、Elasticsearch、Kibana
指標Heapster、Influxdb、Grafana
服務監控Prometheus

我們使用 CentOS 作為容器主機(OpenStack 例項),並安裝 Docker、Kubernetes、Calico、etcd 等。當然,可以在 Kubernetes 上執行各種容器應用程式。實際上,我們將 OpenStack 作為其中一個應用程式執行。沒錯,就是 Kubernetes 上的 OpenStack 執行在 OpenStack 上。我們目前擁有超過 30 個 OpenStack 叢集,這很快就變得難以管理和操作。因此,我們希望建立一個簡單的基礎 OpenStack 叢集,為 Kubernetes 提供所需的基本功能,並使我們的 OpenStack 環境更易於管理。

Kubernetes 架構

讓我更詳細地解釋 Kubernetes 架構。架構圖如下。

|產品 |描述 | |OpenStack Keystone|Kubernetes 身份驗證和授權 | |OpenStack Cinder |Pod 使用的外部卷(多個容器的組合) | |kube-apiserver |透過 REST API 配置和驗證 Pod 或服務等物件(容器中服務訪問的定義)| |kube-scheduler |將 Pod 分配給每個節點 | |kube-controller-manager |執行狀態管理,管理複製控制器 | |kubelet |作為代理在每個節點上執行並管理 Pod | |calico |使用 BGP 實現 Pod 間連線 | |kube-proxy |配置 iptable NAT 表以配置 IP 和負載均衡 (ClusterIP) | |etcd |分散式 KVS 儲存 Kubernetes 和 Calico 資訊 | |etcd-proxy |在每個節點上執行並將客戶端請求傳輸到 etcd 叢集|

租戶隔離 為實現像 OpenStack 這樣的多租戶使用,我們利用 OpenStack Keystone 進行身份驗證和授權。

身份驗證 藉助 Kubernetes 外掛,OpenStack Keystone 可用於身份驗證。透過在啟動 Kubernetes API 伺服器時新增 Keystone 的 authURL,我們可以使用 OpenStack OS_USERNAME 和 OS_PASSWORD 進行身份驗證。 授權 我們目前使用 Kubernetes 授權的 ABAC(基於屬性的訪問控制)模式。我們與諮詢公司 Solinea 合作,他們幫助建立了一個實用程式,將 OpenStack Keystone 使用者和租戶資訊轉換為 Kubernetes JSON 策略檔案,該檔案將 Kubernetes ABAC 使用者和名稱空間資訊對映到 OpenStack 租戶。然後,我們在啟動 Kubernetes API 伺服器時指定該策略檔案。此實用程式還會根據租戶資訊建立名稱空間。這些配置使 Kubernetes 能夠使用 OpenStack Keystone 進行身份驗證,並在授權的名稱空間中操作。 卷和資料永續性 Kubernetes 提供“持久卷”子系統,作為 Pod 的持久儲存。“持久卷”能夠支援雲提供商儲存,透過使用 OpenStack 作為雲提供商,可以利用 OpenStack cinder-volume。 網路 Flannel 和各種網路作為 Kubernetes 的網路模型存在,我們在這個專案中使用了 Project Calico。Yahoo! JAPAN 建議使用純 L3 網路構建資料中心,例如重新分發 ARP 驗證或 IP CLOS 網路,Project Calico 符合這一方向。當我們應用 Flannel 等疊加模型時,無法從 Kubernetes 叢集外部訪問 Pod IP。但 Project Calico 使其成為可能。我們還使用 Project Calico 進行我們稍後描述的負載均衡。

在 Project Calico 中,透過在 Kubernetes 的每個節點上啟動的 BIRD 容器 (OSS 路由軟體) 上執行的 BGP 廣播生產 IP。預設情況下,它只在叢集內廣播。透過設定叢集外部的對等路由器,可以從叢集外部訪問 Pod。 外部服務負載均衡

Kubernetes 有多種外部服務負載均衡器(從叢集外部訪問服務)可供選擇,例如 NodePort、LoadBalancer 和 Ingress。我們沒有找到完全符合我們要求的解決方案。然而,我們找到了一個幾乎符合我們要求的解決方案,即透過 Project Calico BGP 廣播用於內部服務負載均衡(從叢集內部訪問服務)的 Cluster IP,從而實現叢集外部的第 4 層外部負載均衡。

服務發現

透過使用 SkyDNS 附加元件,Kubernetes 可以實現服務發現。這作為叢集內部服務提供,可以在叢集內部像 ClusterIP 一樣訪問。透過 BGP 廣播 ClusterIP,可以從叢集外部進行名稱解析。透過映象建立工作流程和 Kubernetes 的結合,我們構建了以下工具鏈,使程式碼推送和部署變得簡單。

總結

總而言之,透過結合映象建立工作流程和 Kubernetes,Yahoo! JAPAN 在 GoogleSolinea 的幫助下,成功構建了一個自動化工具鏈,該工具鏈使程式碼推送和部署變得簡單,同時考慮了多租戶、身份驗證/授權、儲存、網路、服務發現以及生產部署所需的其他必要因素。我們希望您能從討論中獲得幫助,瞭解用於構建 CI/CD 管道的生態系統工具、Kubernetes 作為虛擬機器/裸機上的部署平臺,以及 Kubernetes 架構的概述,以幫助您架構和部署自己的叢集。感謝所有為該專案提供幫助的人。--Norifumi Matsuya、Hirotaka Ichikawa、Masaharu Miyamoto 和 Yuta Kinoshita。 這篇帖子經過許可,已進行翻譯和編輯以適應語境——最初發佈於 Yahoo! JAPAN 工程部落格,這是關於 Kubernetes 的系列文章之一。