Kubernetes 基本要素介紹
Kubernetes是在群集中管理跨多臺主機容器化應用的開源系統。
Kubernetes提供了應用部署、調度、更新、維護和擴縮的機制。Kubernetes的一個重要特點是,它可以主動管理的容器,以確保集群的狀態持續匹配用戶的意圖。
Kubernetes使您可以通過擴縮或推出新功能快速響應客戶的需求。它還允許你最大限度使用硬件資源。
Kubernetes是:
-
精益的:輕量級的,簡單,操作方便
-
便攜的:公開的,私有的,混合的多種云方式
-
可擴展的:模塊化,可插拔,插件化,可組合并且可工具化
-
自愈性:自動部署,自動重啟,自動復制
Kubernetes是建立在十五年來谷歌運行大規模生產系統的經驗 ,并結合了來自社區的頂級創意和實踐。
Kubernetes支持Docker和rkt容器,更多的容器類型將在未來予以支持。
在這篇短文里,我們會從基本要素介紹Kubernetes。
讓我們先從基本的組成部分開始。
kubectl
kubectl實用程序可以與Kubernetes集群管理器交互。例如,您可以添加和刪除節點,Pod,復制控制器和服務。你也可以檢查它們的狀態,等等。
欲了解更多信息,請參閱文檔( http://kubernetes.io/docs/user-guide/kubectl/kubectl/ )。
集群
群集是一組物理機或虛擬機(或兩者)與使用Kubernetes運行應用程序等基礎資源的總和。
在下圖中,我們可以看到一組不同種類的用戶指定的容器都整齊地并自動打包成Kubernetes可用節點。
我們可以使用cluster-info命令獲取集群的基本信息。
下面是例子:
$ kubectl cluster-info Kubernetes master is running at http://172.19.17.99:8080 Kube-dns is running at http://172.19.17.99:8080/api/v1/proxy/namespaces/kube-system/services/kube-dns KubeUI is running at http://172.19.17.99:8080/api/v1/proxy/namespaces/kube-system/services/kube-ui
控制面板
Kubernetes控制面板被分成多個組件。這些組件協同工作以提供集群的統一視圖。
ETCD
所有的持久狀態數據存儲在etcd集群中。它提供了一種分布式的方式來可靠地存儲配置數據。
主服務
主服務是一套主要的Kubernetes控制服務,通常運行在一臺服務器上。如果需要高可用性,可在負載均衡器之后運行多臺服務器。
主服務包括以下幾個部分:
-
API服務器是整個群集的中央管理點,并允許管理員配置Kubernetes工作負載和組織單元。 API服務器還負責確保etcd并部署容器的服務細節是一致的。換句話說,API服務器驗證并配置(通過命令)pod,服務,和復制控制器的數據。它還分配pod到服務節點和同步pod的配置信息。
-
controller manager服務處理由獨立的復制任務定義的復制過程。這些操作的細節將寫入etcd,其中controller manager監視寫入過程。當發現配置更改,controller manager讀取的信息,并實現了滿足所需狀態的復制過程,例如應用組的擴縮容。
-
換句話說,controller manager監視etcd中的復制任務并使用API來保證所需的狀態。scheduler分配工作負載遷移到集群中的指定節點。它通過讀取工作量操作要求,分析當前環境執行此過程(即,集群中的各個節點的健康情況和操作細節),然后放置工作量到一個合適節點,或一組節點上。
節點
一個節點(有時稱為工作節點)是運行Kubernetes服務用以調度Pod的一個物理或虛擬機。
節點可以被控制面板管理。
Kubernetes在每個節點上運行的服務包括:
-
kubelet守護進程是每個節點上運行的主要媒介。kubelet守護進程觀察主API服務器,并確保適當的本地容器被啟動,并保證其健康的持續運行。
-
kube-proxy守護進程在每個節點上作為該節點上的簡單網絡代理和負載均衡器而提供服務。
你可以通過下面的命令獲取節點運行情況列表:
$ kubectl get nodes NAME LABELS STATUS 172.19.17.99 kubernetes.io/hostname=172.19.17.99 Ready
配置文件
Kubernetes通過配置文件(稱為manifests),它可以是YAML或JSON格式。
命名空間
命名空間就像一個資源名稱的前綴。命名空間幫助不同的項目,環境(例如,開發和生產),團隊或客戶共享同一個集群。它能夠阻止名稱沖突。
命名空間可以通過配置文件創建。
創建一個命名為 development-ns.yaml 的文件,并寫入以下內容:
kind: "Namespace" apiVersion: "v1" metadata: name: "development" labels: name: "development"
然后可以運行下面的命令創建新的命名空間:
$ kubectl create -f development-ns.yaml namespaces/development
去查看已經存在的命名空間,運行:
$ kubectl get namespaces NAME LABELS STATUS default <none> Active development name=development Active
欲了解更多有關命名空間的內容,請參閱文檔( http://kubernetes.io/docs/user-guide/namespaces/ )。
Pod
Pod是一組并置的應用容器,這些容器是共享磁盤卷的。
Pod是可以被創建,調度,并與Kubernetes管理最小部署單元。Pod可以單獨創建。由于Pods沒有受管的生命周期,如果他們進程死掉了,他們將不會重新創建。出于這個原因,建議您使用復制控制器(我們將在后面介紹),即使你創造了單獨的Pod。
所有在Pod的應用使用相同的網絡命名空間,IP地址及端口空間。他們可以找到并互相使用 localhost 溝通。每個Pod有一個與跨網絡的其他物理計算機和容器充分溝通的扁平網絡共享命名空間中的IP地址。
讓我們為一個nginx網絡容器創建一個簡單的Pod定義。
創建一個命名為 nginx.yaml 的文件,并寫入下列內容:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx-server image: nginx ports: - containerPort: 80
在這個文件中:
-
Name 是容器的名稱
-
image 是將要使用的Docker鏡像的名稱
-
containerPort 對外暴露容器的端口,這樣我們可以通過Pod的IP地址與nginx服務器通信
定義在鏡像中的entrypoint默認會被運行。隨著我們的nginx鏡像,該命令運行nginx。
讓我們通過運行下列命令來創建Pod
$ kubectl create -f nginx.yaml pods/nginx
就這么簡單!
你可以通過下列命令檢查創建是否生效:
$ kubectl get pods NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 1m
哦了。這里,我們看見一分鐘之前創建的nginx的Pod了。
我們可以繼續檢查將要運行的Pod的資源狀況:
$ kubectl describe pod nginx Name: nginx Namespace: default Image(s): nginx Node: 172.19.17.99/172.19.17.99 Labels: <none> Status: Running Reason: Message: IP: 10.244.3.2 Replication Controllers: <none> Containers: nginx: Image: nginx State: Running Started: Sat, 29 Aug 2015 18:23:15 +0100 Ready: True Restart Count: 0 Conditions: Type Status Ready True
并且我們可以刪除該Pod:
$ kubectl delete pod nginx pods/nginx
看見了吧,它生效了:
$ kubectl get pods NAME READY STATUS RESTARTS AGE
欲了解更多關于Pod的內容,請參閱文檔( http://kubernetes.io/docs/user-guide/pods/ )。
復制控制器
復制控制器管理Pod的生命周期。它們保證指定數量的Pod在任何給定的時間都在運行。他們通過創建或刪除Pod做到這一點。出于這個原因,建議您使用復制控制器,即使你創造了單獨的Pod。
讓我們為我們以前使用nginx的Pod創建復制控制器。
創建 nginxrc.yaml 文件,并寫入:
apiVersion: v1 kind: ReplicationController metadata: name: my-nginx spec: replicas: 1 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
現在創建該文件復制控制器:
$ kubectl create -f nginxrc.yaml replicationcontrollers/my-nginx
我們可以看到有多少副本:
$ kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS my-nginx nginx nginx app=nginx 1
我們可以很容易地擴展Pod:
$ kubectl scale --replicas=3 rc my-nginx
并檢查它是否生效:
$ kubectl get rc CONTROLLER CONTAINER(S) IMAGE(S) SELECTOR REPLICAS my-nginx nginx nginx app=nginx 3
在這里,我們看到在復制控制器將Pod從一個副本擴展為三個副本。
復制控制器將保證特定數量的副本將在任何時候都可以運行。
下圖展示了復制管理器如何工作的:
正如你所看到的,它知道有三個標簽為nginx的Pod。并監視著這些Pod,準備在必要時創建一個。
欲了解更多關于復制控制器的內容,請參閱文檔( http://kubernetes.io/docs/user-guide/replication-controller/ )。
服務
服務為一組Pod提供單一穩定的名稱和地址。他們作為基本負載均衡器而存在。
Pod大多數被設計為長期運行的,但一旦單個進程死亡,Pod也跟著退出。如果Pod退出,復制控制器使用新的Pod替換它。每個Pod都有自己專用的IP地址,這使得容器具有相同的端口,即使他們共享相同的主機。但每次Pod由復制控制器啟動,Pod將獲取一個新的IP地址。
這是服務真正其作用的地方。服務附加到一個復制控制器。每個服務被分配了虛擬IP地址,它保持恒定不變。只要我們知道服務IP地址,服務本身將跟蹤由復制控制器創建的Pod,并將請求分發給它們。
現在讓我們為 my-nginx 復制控制器創建一個服務。
創一個 nginxsvc.yaml 文件,并寫入:
apiVersion: v1 kind: Service metadata: name: nginxsvc labels: app: nginx spec: ports: - port: 80 protocol: TCP selector: app: nginx
現在我們可以運行下列命令創建服務:
$ kubectl create -f nginxsvc.yaml
并檢查其是否工作:
$ kubectl get svc nginxsvc NAME LABELS SELECTOR IP(S) PORT(S) nginxsvc app=nginx app=nginx 10.100.168.74 80/TCP
因為在Kubernetes群集中的每個節點都運行一個kube-proxy,它監視Kubernetes API服務器的添加和刪除動作。對于每一個新的服務,kube-proxy打開本地節點上的(隨機選擇)端口。到該端口的任何連接被代理到對應后端一個Pod中。
下圖展示了 nginxsvc 如何工作的:
正如你所看到的,進入HTTP端口80的請求在到達 nginxsvc 服務后被代理到三個 nginx 的Pod中的一個上。
欲了解更多關于服務的內容,請參閱文檔( http://kubernetes.io/docs/user-guide/services/ )。
標簽
標簽用于組織和選擇基于鍵值對的對象組。
它們被用于每一個Kubernetes組件。例如:復制控制器使用他們做服務發現。
讓我們看看標簽如何運用在鏈接復制控制器my-nginx和 nginxsvc 服務。
my-nginx 復制控制器配置包括如下:
... metadata: labels: app: nginx ...
app 標簽設置給 nginx 。
這種標簽用于我們的 nginxsvc 服務配置:
... selector: app: nginx ...
此標簽用于鏈接服務和復制控制器。
你可以運行下列命令查看服務正在使用那一個選擇器:
$ kubectl get svc nginxsvc NAME LABELS SELECTOR IP(S) PORT(S) nginxsvc app=nginx app=nginx 10.100.168.74 80/TCP
欲了解更多關于標簽的內容,請參閱文檔( http://kubernetes.io/docs/user-guide/labels/ )。
總結
在Kubernetes的短片教程的第一部分,我們看了kubectl,集群,控制面板,命名空間,Pod,服務,復制控制器和標簽。
在第二部分,我們將涉及卷,加密,滾動更新和Helm。
來自: https://www.sdk.cn/news/3350