達觀資料:kubernetes簡介和實戰(上)
在本文中,我們從技術細節上對kubernetes進行簡單運用介紹,利用一些yaml指令碼層面上例項告訴大家kubernetes基本概念。Kubernetes以及它呈現出的程式設計正規化值得你去使用和整合到自己的技術棧中。
一、kubernetes簡單介紹
1.1 kubernetes起源
Kubernetes最初認為是谷歌開源的容器叢集管理系統,是Google多年大規模容器管理技術Borg或Omega的開源版本。準確來說的話,kubernetes更是一個全新的平臺,一個全新的平臺管理工具,它是專門為job和service設計。完全開放,2014年6月開始接受公開的commit,任何人都可以提供意見。由於kubernetes簡化了開發、運維和管理負荷,越來越多的企業開始在生產環境使用,因此kubernetes得到了迅速的發展。
1.2 kubernetes功能
- 基於容器的應用部署、維護和滾動升級
- 負載均衡和服務發現
- 跨機器和跨地區的叢集排程
- 自動伸縮
- 無狀態服務和有狀態服務
- 廣泛的Volume支援
- 外掛機制保證擴充套件性
1.3 kubernetes核心元件
Kubernetes主要由以下幾個核心元件組成:
- etcd儲存了整個叢集的狀態;
- apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;
- controller manager負責維護叢集的狀態,比如故障檢測、自動擴充套件、滾動更新等;
- scheduler負責資源的排程,按照預定的排程策略將Pod排程到相應的機器上;
- kubelet負責維護容器的生命週期,同時也負責Volume(CVI)和網路(CNI)的管理;
- Container runtime負責映象管理以及Pod和容器的真正執行(CRI);
- kube-proxy負責為Service提供cluster內部的服務發現和負載均衡
二、kubernetes環境部署
如果只是為了瞭解kubernetes,可以使用minikube的方式進行單機安裝,minikube實際就是本地建立了一個虛擬機器,裡面運行了kubernetes的一些必要的環境,相當於k8s的服務環境,建立pod,service,deployment等都是在裡面進行建立和管理。在本文中,我使用kubeadm方式安裝kubernetes 1.10.0,具體kubernetes部署步驟:
- 使用kubeadm方式安裝kubernetes 1.10.0
- Kubernetes叢集新增/刪除Node
- Kubernetes Dashboard1.8.3部署
- k8s原生的叢集監控方案(Heapster+InfluxDB+Grafana)
請注意:上述環境只是測試環境,生產環境部署大同小異。
三、kubernetes基本概念
3.1 Container
Container(容器)是一種行動式、輕量級的作業系統級虛擬化技術。 它使用namespace隔離不同的軟體執行環境,並通過映象自包含軟體的執行環境,從而使得容器可以很方便的在任何地方執行。由於容器體積小且啟動快,因此可以在每個容器映象中打包一個應用程式。這種一對一的應用映象關係擁有很多好處。
使用容器,不需要與外部的基礎架構環境繫結,因為每一個應用程式都不需要外部依賴,更不需要與外部的基礎架構環境依賴,完美解決了從開發到生產環境的一致性問題。 容器同樣比虛擬機器更加透明,這有助於監測和管理。 尤其是容器程序的生命週期由基礎設施管理,而不是由容器內的程序對外隱藏時更是如此。最後,每個應用程式用容器封裝,管理容器部署就等同於管理應用程式部署。在Kubernetes必須要使用Pod來管理容器,每個Pod可以包含一個或多個容器。
3.2 Pod
關於Pod的概念主要有以下幾點:
- Pod是kubernetes中你可以建立和部署的最小也是最簡的單位。一個Pod代表著叢集中執行的一個程序
- 在Kubrenetes叢集中Pod的使用方式
- Pod中如何管理多個容器
3.3 理解Pod:
上面已經說了“Pod是kubernetes中你可以建立和部署的最小也是最簡的單位。 一個Pod代表著叢集中執行的一個程序。” Pod中封裝著應用的容器(有的情況下是好幾個容器),儲存、獨立的網路IP,管理容器如何執行的策略選項。
Pod代表著部署的一個單位:kubernetes中應用的一個例項,可能由一個或者多個容器組合在一起共享資源。
請注意:Docker是kubernetes中最常用的容器執行時,但是Pod也支援其他容器執行時。
3.4 Kubrenetes叢集中Pod的兩種使用方式:
1)一個Pod中執行一個容器“每個Pod中一個容器”的模式是最常見的用法。
在這種使用方式中,你可以把Pod想象成是單個容器的封裝,kuberentes管理的是Pod而不是直接管理容器。
實戰:建立一個nginx容器
apiVersion: v1 kind: Pod metadata: name:nginx-test labels: app: web spec: containers: - name:front-end image:nginx:1.7.9 ports: -containerPort: 80
建立Pod: kubectl create -f ./pod1-deployment\ 檢視Pod: kubectl get po 檢視Pod詳細情況: kubectl describe po nginx-test 進入到Pod(容器)內部: kubectl exec -it nginx-test/bin/bash
2)在一個Pod中同時執行多個容器
說明:在一個Pod中同時執行多個容器是一種比較高階的用法。只有當你的容器需要緊密配合協作的時候才考慮用這種模式。
一個Pod中也可以同時封裝幾個需要緊密耦合互相協作的容器,它們之間共享資源。這些在同一個Pod中的容器可以互相協作成為一個service單位——一個容器共享檔案,另一個“sidecar”容器來更新這些檔案。Pod將這些容器的儲存資源作為一個實體來管理。
實戰:在一個pod裡放置兩個容器:nginx與redis
apiVersion: v1 kind: Pod metadata: name: rss-site labels: app: web spec: containers: - name:front-end image:nginx:1.7.9 ports: -containerPort: 80 - name:rss-reader image: redis ports: -containerPort: 88
建立Pod: kubectl create -f ./test-deployment 檢視pod kubectl get po 檢視Pod詳細情況 kubectl describe po rss-site 進入front-end內部: kubectl exec -it rss-site-c front-end /bin/bash 進入rss-reade內部: kubectl exec -it rss-site-c rss-reader /bin/bash 以上是關於Pod的簡單介紹。
四、Node
Node是Pod真正執行的主機,可以物理機,也可以是虛擬機器。為了管理Pod,每個Node節點上至少要執行container runtime(比如docker或者rkt)、kubelet和kube-proxy服務。
五、Namespace
Namespace是對一組資源和物件的抽象集合,比如可以用來將系統內部的物件劃分為不同的專案組或使用者組。常見的pods, services, replication controllers和deployments等都是屬於某一個namespace的(預設是default),而node, persistentVolumes等則不屬於任何namespace。
六、Deployment
我們既然有Pod了,為什麼還要使用Deployment呢?
這是因為實際工作中,我們很少會直接在kubernetes中建立單個Pod。因為Pod的生命週期是短暫的,用後即焚的實體。
Deployment為Pod和ReplicaSet提供了一個宣告式定義(declarative)方法,用來替代以前的ReplicationController來方便的管理應用。
你只需要在Deployment中描述想要的目標狀態是什麼,Deploymentcontroller就會幫你將Pod和ReplicaSet的實際狀態改變到你的目標狀態。
你可以定義一個全新的Deployment來建立ReplicaSet或者刪除已有的Deployment並建立一個新的來替換。
6.1 什麼是複製控制器(ReplicationController,RC)
RC是K8s叢集中最早的保證Pod高可用的API物件。
通過監控執行中的Pod來保證叢集中執行指定數目的Pod副本。指定的數目可以是多個也可以是1個;少於指定數目,RC就會啟動執行新的Pod副本;多於指定數目,RC就會殺死多餘的Pod副本。
即使在指定數目為1的情況下,通過RC執行Pod也比直接執行Pod更明智,因為RC也可以發揮它高可用的能力,保證永遠有1個Pod在執行。
RC是K8s較早期的技術概念,只適用於長期伺服型的業務型別,比如控制小機器人提供高可用的Web服務。
6.2 什麼是副本集(Replica Set,RS)
RS是新一代RC,提供同樣的高可用能力,區別主要在於RS後來居上,能支援更多種類的匹配模式。副本集物件一般不單獨使用,而是作為Deployment的理想狀態引數使用。
6.3 Deployment典型的應用場景
- 定義Deployment來建立Pod和ReplicaSet
- 滾動升級和回滾應用;如果當前狀態不穩定,回滾到之前的Deployment revision。每次回滾都會更新Deployment的revision
- 擴容和縮容,擴容Deployment以滿足更高的負載
- 暫停和繼續Deployment,暫停Deployment來應用PodTemplateSpec的多個修復,然後恢復上線
6.4 實戰Deployment
比如,我們這裡定義一個簡單的nginx應用:
apiVersion:extensions/v1beta1 kind: Deployment metadata: name:nginx-test namespace:test spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: -name: nginx image: nginx:1.7.9 ports: - containerPort: 80 建立deploy kubectl create -f ./nginx-deployment 檢視deploy kubectl get deploy --namespace=test 檢視rs(副本集) kubectl get rs --namespace=test 檢視pods(容器組) kubectl get po --namespace=test
關於Deployment的應用還有很多,如:擴容、縮容、滾動升級、回滾應用等,這裡由於篇幅的問題不再一一介紹。