Docker kubernetes基礎教程
Docker kubernetes基礎教程
什麼是kubernetes
Kubernetes 這個名字源自希臘語,意思是“舵手”,也是“管理者”,“治理者”和“cybernetic”的源頭。k8s 是Kubernetes的簡稱(用數字『8』替代中間的8個字母『ubernete』)。
對於現代Web服務,使用者希望應用程式7×24全天候可用,開發人員希望每天多次部署這些應用程式的更新版本。
容器化幫助打包軟體以實現這些目標,使應用程式能夠以簡單快速的方式釋出和更新,而無需停機。
Kubernetes可幫助你確保這些容器化應用程式隨時隨地執行,並幫助它們找到工作所需的資源和工具。
Kubernetes是一個可用於生產環境的開源平臺,它的設計結合了Google在容器編排方面積累的豐富經驗和社群中的最佳創意。
建立叢集
————————
k8s協調一個高度可用的計算機叢集,這些計算機被連線起來工作,就好像是一個單獨的單元。
k8s以更有效的方式自動化跨叢集分發和排程應用程式容器。
1個k8s叢集由以下2部分組成:
master:協調叢集
nodes:執行應用程式的work節點
啟動(僅google互動教程)
minikube start
檢視版本
kubectl version
獲取nodes
kubectl get nodes
部署應用
————————
當你運行了k8s叢集,你就可以在上面部署容器化的應用程式。具體來說,你需要建立k8s Deployment 配置。
Deployment會指示k8s如何建立、更新你的應用程式。當你建立了1個Deployment, k8s master會把應用程式例項分配到不同的Node。
應用程式例項建立後,k8s Deployment控制器會持續進行監控這些例項,一旦例項所在的節點宕機或者被刪除,k8s Deployment控制器就換換掉它。這其實提供了一種自我故障修復和維護的機制。
部署應用
kubectl run kubernetes-bootcamp –image= ofollow,noindex" target="_blank">gcr.io/google-samples/kubernetes-bootcamp:v1 –port=8080
獲取Deploy情況
kubectl get deployments
開啟proxy(對外暴露服務)
kubectl proxy
獲取pods列表
kubectl get pods
訪問服務(POD_NAME來自於上一步)
curl https://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/
探索應用
————————
Pods和Nodes
pods:
pod是k8s的1個抽象概念,代表1組docker應用程式例項和他們共享的資源(儲存,網路及埠等),舉例來說,一個pod可以是下面這2個container組成:
1.1個nodejs應用container
2.1個上述nodejs應用提供資料的container
pods是k8s的原子單位,當我們在k8s上部署應用時,部署程式會建立內建container的Pods(而不是直接建立container),每個pod都會繫結到Nodes,當節點故障時,相同的pods會遷移到叢集中的其他Nodes。
Nodes:
Pod通常執行在Node上,Node是k8s的工作機,它可以是物理機也可以是虛擬機器。1個Node可以擁有多個Pods,k8s master會在Nodes之間排程Pods。
每個Node都有至少支援執行功能:
Kubelet:處理k8s master與Node之間的通訊
contaienr執行環境:Docker/rkt,用於執行應用程式
最常用的kubectl命令:
kubectl get pods nodes rc/services:列出資源
kuubectl describe XXXX(同上):顯示資源詳情
kubectl logs $POD_NAME:列印pod中的某個container的日誌
kubectl exec $POD_NAME:在pod的某個container中執行命令(類似docker exec)
對外公開應用程式
————————
使用service暴露應用程式
事實上node是有生命週期的,當node工作機掛掉的時候,執行在該node上的Pods也會丟失,ReplicationController 會通過建立新Podsl來動態的驅動叢集回到期望的狀態以便保持應用程式繼續執行。
舉個例子:
1個圖片處理的後端有3個replicas Pods,這些replicas都是可替代的,前端系統不需要關心這些replicas,即便Pod丟失或者重建。
實際上,k8s中的每個Pod都有1個獨立的IP,即使這些Pod在相同的Node機器。所以這裡需要有一種機制,自動協調Pods之間的更改,這樣應用程式才能持續正常工作。
service是k8s的1個抽象概念,它定義了1組pods的邏輯集合及訪問策略。service是一系列獨立pods之間的鬆散組合。像其他的k8s物件一樣,service也通過yaml和json來定義。
儘管每個Pod都有獨立的IP,但是如果沒有service,這些IP就不會暴露到叢集之外。service允許你的應用程式接收流量。
service可以通過type欄位定義為以下內容:
ClusterIP:內部ip,使得service可以在叢集內部被訪問
NodePort:以NAT的方式,在每個Node的相同埠上暴露服務,使得service可被叢集外部訪問。
LoadBalancer:建立一個對外的負載均衡在雲服務上面(如果支援的話),同時為service分配一個固定的內部IP。
ExternalName:通過返回cname記錄暴露一個service(使用任意的名字)
service會把流量路由到一系列pods。service是一個抽象概念,它允許k8s中的pod死亡、複製重建而不對應用程式產生影響。不同Pods之間的發現、路由,都由k8s service處理。
service通過lable和selector來匹配
建立並對外暴露服務
kubectl expose deployment/kubernetes-bootcamp –type=”NodePort” –port 8080
檢視服務
kubectl describe services/kubernetes-bootcamp
獲取Node埠
export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}’)
echo NODE_PORT=$NODE_PORT
訪問service服務
curl $(minikube ip):$NODE_PORT
部署程式會為Pod建立label,可以通過以下命令檢視部署及label
kubectl describe deployment
檢視pods
kubectl get pods -l run=kubernetes-bootcamp
檢視service
kubectl get services -l run=kubernetes-bootcamp
為pod增加新名字
kubectl label pod $POD_NAME app=v1
刪除service(外部無法訪問,但內部依然可訪問,service只是抽象概念)
kubectl delete service -l run=kubernetes-bootcamp
執行多個應用程式例項
————————
應用程式伸縮性
前面,我們已經建立了1個deployment,並且通過service對外進行公開暴露。deployment只建立了1個pod來執行我們的應用程式,但是隨著流量的增長,我們需要水平擴充套件應用程式,以滿足使用者的需求。
擴充套件通過改變deplyment中的replicas數量來完成。
擴充套件deployment將確保使用可用資源建立新的Pod並將其安排到Node。
k8s也支援autoscaling自動伸縮,這裡不會詳談,當然,伸縮到0也是可能的,這會終止該deployment下所有的Pod。
執行應用程式的多個例項就需要在例項間分發流量。service內建了負載均衡器用於在deployment的Pods直接分發網路流量。service會通過端點持續監控執行的Pods,以確保流量只分發到可用的Pod。
獲取deployments
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 1 21s
DESIRED顯示的是replicas的數量, CURRENT顯示的是當前執行的replicas數量,UP-TO-DATE顯示的是已更新的replicas數量,AVALIABLE顯示的是使用者可用的replicas數量。
擴充套件deployment
kubectl scale deployments/kubernetes-bootcamp –replicas=4
檢視pods資訊
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE
kubernetes-bootcamp-5c69669756-8v6d9 1/1 Running 0 1m 172.18.0.7 minikube
kubernetes-bootcamp-5c69669756-fqtvp 1/1 Running 0 1m 172.18.0.6 minikube
kubernetes-bootcamp-5c69669756-m86tg 1/1 Running 0 6m 172.18.0.2 minikube
kubernetes-bootcamp-5c69669756-znz7b 1/1 Running 0 1m 172.18.0.5 minikube
1箇舊的Pod(AGE=6m),3個新的Pod(AGE=1m)
當你運行了多個應用程式例項,當然是希望能夠滾動更新而不進行停機的,這部分內容會在後面講到。
滾動更新(rolling updates)
使用者希望應用程式全天候都能夠穩定可用,但是開發人員希望一天內部署多次更新的版本。在k8s裡面,這通過滾動更新來完成。滾動更新允許deployment的更新通過增加更新Pods來實現。新的Pods會被安排到可用的Node節點。
前面,我們已經把應用程式擴充套件為多個例項。這其實是執行更新,而不影響應用程式可用性的1個要求。
預設的,滾動更新期間,Pod的最大不可用數量(禁用數量)和建立的新Pod最大數量都是1(意即逐個Pod進行更新)。當然,這個值是可以修改的(可改為具體數字或百分比)。
在k8s裡,更新是有版本管理的,任何Deployment都能回滾到之前的版本。
更新過程(預設配置):
禁用1箇舊Pod,建立1個新Pod,持續進行,直到全部Pod都更新完成。
更新Pod
kubectl set image deployments kubernetes-bootcamp kubernetes-bootcamp=jocatalin kubernetes-bootcamp:v2
回滾Pod
kubectl rollout undo deployments/kubernetes-bootcamp
經典案例
無狀態應用程式:
PHP+Redis留言板 Example: Deploying PHP Guestbook application with Redis – Kubernete s
有狀態應用程式:
StatefulSet基本概念: StatefulSet Basics – Kubernete s
WordPress+MYSQL+持久資料卷 Example: Deploying WordPress and MySQL with Persistent Volumes – Kubernete s
參考文件
Kubernetes – Hello World 指南 – 中文文 檔 可能已經過期,但仍有參考意義