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

我們如何在 Yahoo! JAPAN 大規模架構及運行 OpenStack 上的 Kubernetes

編輯註:今天的文章是由 Yahoo! JAPAN 的基礎架構工程團隊所撰寫,內容關於他們如何在 Kubernetes 上執行 OpenStack。本文已取得許可進行翻譯和編輯以符合語境 -- 原文發布於 Yahoo! JAPAN 工程部落格。 

簡介
這篇文章概述了 Yahoo! JAPAN 如何在 Google 和 Solinea 的協助下,為在 OpenStack 上執行的 Kubernetes 建置「一鍵式」程式碼部署自動化工具鏈。 

我們也將涵蓋確保生產環境就緒的基本安全性、網路、儲存和效能需求。 

最後,我們將討論用於建置 CI/CD 管道的生態系統工具、作為 VM/裸機部署平台的 Kubernetes,以及 Kubernetes 架構的概述,以協助您設計和部署自己的叢集。 

前言
自我們公司在 2012 年開始使用 OpenStack 以來,我們的內部環境已快速變化。我們使用 OpenStack 實現了硬體虛擬化的最初目標。然而,由於雲端和容器技術的進步,我們需要能夠在各種平台上啟動服務。這篇文章將提供我們將在 OpenStack 上執行的應用程式移植到 Kubernetes 的範例。

程式碼生命週期
此專案的目標是從一個應用程式碼為所有需要的平台建立映像檔,並將這些映像檔部署到每個平台上。例如,當程式碼在程式碼登錄檔中變更時,裸機映像檔、Docker 容器和 VM 映像檔會由 CI(持續整合)工具建立,推送到我們的映像檔登錄檔中,然後部署到每個基礎架構平台。

我們在 CICD 管道中使用以下產品

功能產品
程式碼登錄檔GitHub 企業版
CI 工具Jenkins
映像檔登錄檔Artifactory
錯誤追蹤系統JIRA
部署裸機平台OpenStack Ironic
部署 VM 平台OpenStack
部署容器平台Kubernetes

映像檔建立。下圖顯示每個映像檔建立工作流程。

VM 映像檔建立 :

  1. 1.將程式碼推送到 GitHub
  2. 2.hook 到 Jenkins master
  3. 3.在 Jenkins slave 啟動工作 
  4. 4.checkout Packer repository
  5. 5.執行服務工作
  6. 6.透過建置腳本執行 Packer
  7. 7.Packer 啟動 VM 以用於 OpenStack Glance 
  8. 8.設定 VM 並安裝所需的應用程式
  9. 9.建立快照並註冊到 Glance 10.10.從 Glance 下載新建立的映像檔 11.11.將映像檔上傳到 Artifactory

裸機映像檔建立

  1. 1.將程式碼推送到 GitHub
  2. 2.hook 到 Jenkins master
  3. 3.在 Jenkins slave 啟動工作 
  4. 4.checkout Packer repository
  5. 5.執行服務工作
  6. 6.透過建置腳本下載基本裸機映像檔
  7. 7.建置腳本執行 diskimage-builder 與 Packer 以建立裸機映像檔
  8. 8.將新建立的映像檔上傳到 Glance
  9. 9.將映像檔上傳到 Artifactory

容器映像檔建立

  1. 1.將程式碼推送到 GitHub
  2. 2.hook 到 Jenkins master
  3. 3.在 Jenkins slave 啟動工作 
  4. 4.checkout Dockerfile repository
  5. 5.執行服務工作
  6. 6.從 Artifactory 下載基本 docker 映像檔
  7. 7.如果在 Artifactory 中找不到 docker 映像檔,則從 Docker Hub 下載
  8. 8.執行 docker build 並建立映像檔 
  9. 9.將映像檔上傳到 Artifactory

平台架構。

讓我們專注於容器工作流程,以逐步了解我們如何使用 Kubernetes 作為部署平台。此平台架構如下所示。

功能產品
基礎架構服務OpenStack
容器主機CentOS
容器叢集管理員Kubernetes
容器網路Project Calico
容器引擎Docker
容器登錄檔Artifactory
服務登錄檔etcd
原始碼管理GitHub 企業版
CI 工具Jenkins
基礎架構佈建Terraform
記錄Fluentd、Elasticsearch、Kibana
指標Heapster、Influxdb、Grafana
服務監控Prometheus

我們將 CentOS 用於容器主機 (OpenStack 執行個體),並安裝 Docker、Kubernetes、Calico、etcd 等等。當然,可以在 Kubernetes 上執行各種容器應用程式。事實上,我們將 OpenStack 作為其中一個應用程式執行。沒錯,OpenStack on Kubernetes on 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 廣播用於內部服務負載平衡(從叢集內部存取服務)的叢集 IP,這可以從叢集外部在第 4 層啟用外部負載平衡。

服務探索

透過使用 SkyDNS 外掛程式,可以在 Kubernetes 上進行服務探索。這作為叢集內部服務提供,可在叢集中存取,例如 ClusterIP。透過 BGP 廣播 ClusterIP,名稱解析可從叢集外部運作。透過結合映像檔建立工作流程和 Kubernetes,我們建置了以下工具鏈,使其易於從程式碼推送部署。

摘要

總而言之,透過結合映像檔建立工作流程和 Kubernetes,Yahoo! JAPAN 在 GoogleSolinea 的協助下,成功建置了一個自動化工具鏈,使其易於從程式碼推送部署,同時考量到多租戶、authn/authz、儲存、網路、服務探索以及生產環境部署所需的其他必要因素。我們希望您發現用於建置 CI/CD 管道的生態系統工具、作為 VM/裸機部署平台的 Kubernetes,以及 Kubernetes 架構的概述,有助於您設計和部署自己的叢集。感謝所有協助此專案的人員。--Matsuya Norifumi、Ichikawa Hirotaka、Miyamoto Masaharu 和 Kinoshita Yuta。 這篇文章已取得許可進行翻譯和編輯以符合語境 -- 原文發布於 Yahoo! JAPAN 工程部落格,這是 Kubernetes 系列文章之一。