Kubernetes 屬於主從分佈式架構,主要由 Master 節點和 Node 節點組成,以及包括命令行工具 kubectl 和其它附加項。node
節點 | 組件 | 功能 |
Master | API server | 資源操做的惟一入口,以 RESTful API 方式供客戶端工具和其餘組件調用 |
scheduler | 負責資源調度,將Pod綁定到Node節點 | |
controller-manager | 管理控制器,包括 Endpoint Controller,Replication Controller 等 | |
etcd | 高可用的鍵值存儲數據庫,用於存儲集羣的配置信息和各類資源狀態信息 | |
Node | kubelet | 節點代理,Pod的生命週期管理並向Master報告Pod運行狀態 |
kube-proxy | 網絡代理和負載均衡,將service接收到的請求轉發給Pod |
Kubernetes 集羣部署有3種方式:kubeadm、minikube和二進制包。數據庫
部署 Kubernetes cluster(單機版)最簡單的方式是 minikube:安裝 Docker;下載 kubectl;安裝 minikube;啓動 minikube。bash
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready master 44s v1.15.0
使用 Kubectl 建立和管理 deployment,deployment 負責建立和更新應用實例。建立 deployment 後,Master 會將 deployment 建立的應用實例調度到集羣中的 Node 節點。網絡
應用實例建立後,Deployment Controller 會持續監視這些實例。若是管理實例的 Node 節點被銷燬,Deployment Controller 會建立新的應用實例,實現自我修復能力。架構
(1)使用 Kubectl 發送部署請求給 API Server;app
(2)API Server 通知 Controller-manager 建立一個 deployment;負載均衡
(3)Scheduler 執行調度任務,將 Pod 副本發送到 Node 節點;分佈式
(4)Node 節點上的 kubelet 建立並運行 Pod。ide
$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
deployment.apps/kubernetes-bootcamp created工具
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1/1 1 1 2m11s
(1)Pod 是 Kubernetes 中的最小單位,建立 deployment 時,會建立具備容器的 Pod,每一個 Pod 將被綁定到 Node 節點上。Pod 是一個抽象化概念,包括:
(2)Node 是 Kubernetes 中的工做節點,能夠是虛擬機或物理機。Node 由 Master 管理,Node 上能夠有多個 Pod。當一個 Node 節點銷燬時,在該節點上運行的 Pod 也會銷燬,而後經過 Replication Controller 動態建立新的 Pod。
每一個 Node 上至少運行着:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5b48cfdcbd-d49wp 1/1 Running 0 16s
$ kubectl describe pods
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ echo $POD_NAME
kubernetes-bootcamp-5b48cfdcbd-d49wp
$ kubectl logs $POD_NAME
$ kubectl exec -ti $POD_NAME bash
root@kubernetes-bootcamp-5b48cfdcbd-d49wp:/#
Service 是一個抽象的概念,它定義了一組邏輯的 Pod,應用能夠方便的實現服務發現和負載均衡。使用 YAML 或 JSON 來定義 Service,Service 經過 Label Selector 來匹配一組 Pod。
Service 集成了負載均衡器,能夠將網絡流量分發到 deployment 暴露的全部 Pod。Service 使用 Endpoints 持續監控運行的 Pod,以確保將流量分配到可用的 Pod。
能夠在 ServiceSpec 中經過 type 指定 Service 類型:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5b48cfdcbd-6tmcr 1/1 Running 0 93s
$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3m50s
kubernetes-bootcamp NodePort 10.111.106.144 <none> 8080:30216/TCP 5s
$ kubectl get services -l run=kubernetes-bootcamp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-bootcamp NodePort 10.111.106.144 <none> 8080:30216/TCP 2m9s
$ kubectl describe services/kubernetes-bootcamp
$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=30216
$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
前面咱們建立了一個 deployment,而後經過 Service 暴露,deployment 建立的 Pod 來運行應用。當流量增長時,咱們須要對應用進行擴展。
經過更改 deployment 副本數實現對應用的擴展。
$ kubectl scale deployments/kubernetes-bootcamp --replicas=2 deployment.extensions/kubernetes-bootcamp scaled $ kubectl get deployments NAME READY UP-TO-DATE AVAILABLE AGE kubernetes-bootcamp 2/2 2 2 44s $ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kubernetes-bootcamp-5b48cfdcbd-4d5w2 1/1 Running 0 23s 172.18.0.6 minikube <none> <none> kubernetes-bootcamp-5b48cfdcbd-55b4g 1/1 Running 0 44s 172.18.0.5 minikube <none> <none>
滾動更新經過 deployment 實現應用實例在不停機狀況下進行更新,新的 Pod 會逐步調度到可用的 Node 節點。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-5b48cfdcbd-rwd82 1/1 Running 0 7m12s
kubernetes-bootcamp-5b48cfdcbd-w68tj 1/1 Running 0 7m12s
$ kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
deployment.extensions/kubernetes-bootcamp image updated
$ kubectl rollout status deployments/kubernetes-bootcamp
deployment "kubernetes-bootcamp" successfully rolled out
$ kubectl rollout undo deployments/kubernetes-bootcamp
deployment.extensions/kubernetes-bootcamp rolled back