有光的地方就有陰影,每一次創新的到來每每也伴隨着很多的麻煩。容器技術的到來,讓咱們能以更爲便捷的手段封裝和運行應用程序,但按規模化管理容器還充滿挑戰。linux
Kubernetes 是 Google 公司內部爲了解決這一問題誕生的產物,它提供了一個框架來管理容器在整個集羣中的運行方式。它提供的這種服務一般都集中在「編排」中,但也涵蓋了不少領域:容器調度、容器之間的服務發現,跨系統之間的負載平衡、滾動更新/回滾、高可用性等。服務器
今天的文章, 將向你介紹設置 Kubernetes 的基礎知識,並使用基於容器的應用程序進行相關補充。不僅是紙上談兵單純拋出 Kubernetes 的概念, 而是展現這些概念如何在運行 Kubernetes 的簡單示例中進行結合的。架構
Kubernetes 是爲管理 Linux 容器而誕生。可是, 從 Kubernetes 1.5 版本以後, Kubernetes 也開始支持 Windows 服務器容器, 儘管 Kubernetes 控制面必須繼續在 Linux 上運行。不過固然, 藉助虛擬化, 你能夠在任何平臺上開始使用 Kubernetes。app
若是你選擇在本身的硬件或 VM 上運行 Kubernetes, 一般是使用一個附帶 Kubernetes 的 Linux 發行版。這就不須要在給定的分佈上設置 Kubernetes - 不只是下載和安裝過程, 還包括某些配置和管理過程。框架
CoreOS 的發行版之一 Tectonic,幾乎排除了其餘全部東西而專一於容器和 Kubernetes。RancherOS 一樣採用了相似的方法, 一樣自動執行大部分配置。二者均可以安裝在各類環境中: 裸機、亞馬遜 AWS VM、Google 計算引擎、OpenStack 等。微服務
另外一種途徑是在傳統的 Linux 發行版上運行 Kubernetes,儘管這每每會增長管理成本和須要進行相應的人工調試。例如。Red Hat 企業版 Linux 便在其軟件包存儲庫中附帶 Kubernetes ,但即便是 Red Hat 也建議只將其用於測試和實驗。不要嘗試手動地進行拼湊,Red Hat 棧用戶被建議經過 OpenShift PaaS 使用 Kubernetes,而 OpenShift 現在使用 Kubernetes 做爲本身的原生編排器。工具
許多傳統的 Linux 發行版爲配置 Kubernetes 和其餘大型軟件棧提供了特殊的工具。例如,Ubuntu 提供了一個名爲 conjure-up 的工具,它能夠被用來在雲和裸機上部署 Kubernetes 的新興版本。學習
Kubernetes 在許多雲中都是一個標準的發行項目,儘管它可能在 Google Cloud Platform(GCP)上的表現最爲突出。GCP 提供了兩種主要的方式來運行 Kubernetes.最方便和緊密集成的方式是經過 Google Container Engine,它能讓你運行 Kubernetes 的命令行工具來管理已經建立的集羣。測試
或者,你也可使用 Google Compute Engine 來設置一個計算集羣並手動部署 Kubernetes。但這種方法仍須要進一步的優化,但它能實現 Container Engine 沒法實現的的自定義。若是你剛剛開始使用容器技術,請先使用 Container Engine。按部就班地,當你已經初步深刻並但願嘗試一些新東西的時候,好比一個自定義版本的可讓你本身修改的 Kubernetes,這個時候你能夠部署運行 Kubernetes 發行版的虛擬機。優化
Amazon EC2 能對容器進行本地支持,但不能對 Kubernetes 做爲一個容器編排系統的本地支持。在 AWS 上 運行 Kubernetes 就相似於使用 Google Compute Engine:你能夠配置一個計算集羣,而後手動部署 Kubernetes。
許多 Kubernetes 的發行版都有詳細的指令來設置 AWS。例如,CoreOS 的發行版之一 Tectonic,它就包括一個圖形化的安裝程序, 也支持 Terraform 基礎架構的配置工具。另外, Kubernetes kops 工具能夠用於在 AWS 上提供一組通用的虛擬機(一般使用 Debian linux, 也部分支持其餘類型的 Linux)。
Microsoft Azure 經過 Azure Container Service 支持 Kubernetes 。然而,它並非「本地」支持,由於 Kubernetes 只是在 Azure 上的託管服務。相反,Kubernetes經過Azure資源管理器模板進行部署。Azure 也有對其餘容器編排框架的支持,如 Docker Swarm 和 Mesosphere DC / OS,他們的工做方式相同。若是你想要實現徹底控制,就像這裏描述的其餘雲同樣,你能夠隨時在 Azure 虛擬機上安裝以 Kubernetes 爲中心的發行版。
實如今各類環境(雲端或其餘方式)中提供基本的 Kubernetes 集羣的一種快速方法是使用名爲Kubernetes Anywhere 的項目。此腳本適用於 Google Compute Engine,Microsoft Azure 和VMware vSphere(須要 vCenter)。針對不一樣的狀況,它都爲設置提供了必定程度的自動化。
若是你只是在本地環境 (如開發機器) 中運行 Kubernetes , 有幾種方法能夠設置 "恰好足夠" 的 Kubernetes 來知足你的需求。
Kubernetes 開發團隊自己提供的一個 Minikube。運行它, 你會獲得一個部署在你選擇的虛擬主機上的單節點 Kubernetes 集羣。Minikube 有幾個先決條件, 如 kubectl 命令行接口和虛擬化環境,如VirtualBox, 但這些均可以做由爲 MacOS、Linux 和 Windows 的二進制文件提供。
對於 MacOS 上的 CoreOS 用戶, 有 Kubernetes Solo, 它在 CoreOS VM 上運行, 並提供了一個快速管理的狀態欄應用程序。Solo 還包括 Kubernetes 軟件包管理 Helm, 以便由 Kubernetes 封裝的應用程序更容易被得到和設置。
一旦 Kubernetes 開始運行, 就能夠開始部署和管理容器了。你能夠經過利用衆多的基於容器的應用程序 demo 中的一個來輕鬆地進行容器操做。
採起現有的基於容器的應用程序 demo,本身進行配裝,看看它是如何組成的,部署它,而後逐步進行修改,直到它能爲你所用。若是你選擇經過 Minikube 爲你的出發點,你可使用 Hello Minikube 教程在單節點Kubernetes demo 安裝中建立一個 Docker 容器,該容器將一個簡單的 Node.js 應用程序保存在單節點 Kubernetes demo 安裝中。一旦你有了任何想法,均可以在本身的容器中進行交換,也能夠實踐部署。
下一步是部署一個相似於你在生產中使用的示例應用程序, 並熟悉更爲前驅的 Kubernetes 概念, 例如莢 (一個或多個容器, 包括一個應用程序), 服務 (邏輯集的豆莢), 副本集 (提供自我修復的機器故障), 和部署 (應用程序版本控制)。舉個例子, 使用像 WordPress / MySQL 這樣的示例應用程序,你將會看到更多的關於如何將這些片段部署到 Kubernetes 中並讓它們運行的指令。你還將看到生產級的 Kubernetes 應用程序所使用的許多概念的實現細節。你將學習如何設置持久卷以保留應用程序的狀態, 如何經過服務向對方和外部公開 pod, 如何將應用程序密碼和 API 密鑰存儲爲機密文件等。
Weaveworks 便有一個典型的應用程序,Sock Shop,它顯示微服務模式是如何用來在 Kubernetes 上組成一個應用程序的。Sock Shop 對於熟悉基礎技術的人員來講將是最有用的 - Node.js,Go kit 和Spring Boot,但核心原則是超越特定的框架並說明雲原生技術。
若是你瞭解 WordPress / MySQL 應用程序,並想像可能會有一個預先的 Kubernetes 應用程序來知足你的需求,你多是對的。Kubernetes 有一個名爲 Helm 的應用程序能定義系統,它提供了一種封裝,版本和共享 Kubernetes 應用程序的方法。許多流行的應用程序(GitLab,WordPress)和應用程序構建模塊(MySQL,Nginx)均可以經過 Kubeapps 門戶的方式隨時使用的 Helm「圖表」 。
Kubernetes 經過諸如 pod 和服務等強大的抽象概念簡化了容器管理, 同時經過諸如標籤和命名空間等機制提供了大量的靈活性, 能夠用來分隔 pod、服務和部署 (如開發、轉移和生產工做負載)。
若是你採起上述示例之一, 並在多個命名空間中設置不一樣的實例, 則能夠練習對每一個命名空間中的組件進行更改, 而不依賴於其餘。而後, 你可使用部署使這些更新在給定的命名空間中以增量方式跨多個 pod 進行滾動。
除了這些練習以外, 接下來的一大步是學習如何經過管理基礎架構的工具來驅動 Kubernetes 自己。例如, Puppet 中有一個模塊, 用於建立和操做 Kubernetes 中的資源, 而 HashiCorp 的 Terraform 對 Kubernetes 做爲資源的支持也很早就有但也愈來愈多。若是你計劃使用這樣的資源管理器, 請注意, 不一樣的工具可能會給錶帶來大相徑庭的改變。例如, Puppet 和 Terraform 就默認使用可變和不可變的基礎架構。這些想法和行動上的差別能夠決定如何更容易, 或更困難地, 建立你須要的 Kubernetes 設置。