Kubernetes

Kubernetes 是 Google 開源的容器集羣管理系統,支持自動化部署、自動擴縮容、管理容器化的應用。在生產環境中部署一個應用程序時,一般要部署該應用的多個實例以便對應用請求進行負載均衡。

1. 集羣架構

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 

2. 部署集羣

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

3. 部署應用

使用 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

4. 查看應用

(1)Pod 是 Kubernetes 中的最小單位,建立 deployment 時,會建立具備容器的 Pod,每一個 Pod 將被綁定到 Node 節點上。Pod 是一個抽象化概念,包括:

  • 共享存儲,volume 卷
  • 網絡,惟一的集羣 IP 地址
  • 容器運行的信息

(2)Node 是 Kubernetes 中的工做節點,能夠是虛擬機或物理機。Node 由 Master 管理,Node 上能夠有多個 Pod。當一個 Node 節點銷燬時,在該節點上運行的 Pod 也會銷燬,而後經過 Replication Controller 動態建立新的 Pod。

每一個 Node 上至少運行着:

  • Kubelet,負責 Master 和 Node 之間的通訊;管理 Node 上運行的 Pod 和 Container 容器。
  • Container runtime,Docker 或其餘容器。

$ 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:/#

5. 發佈應用

Service 是一個抽象的概念,它定義了一組邏輯的 Pod,應用能夠方便的實現服務發現和負載均衡。使用 YAML 或 JSON 來定義 Service,Service 經過 Label Selector 來匹配一組 Pod。

Service 集成了負載均衡器,能夠將網絡流量分發到 deployment 暴露的全部 Pod。Service 使用 Endpoints 持續監控運行的 Pod,以確保將流量分配到可用的 Pod。

能夠在 ServiceSpec 中經過 type 指定 Service 類型:

  • ClusterIP   在集羣內部的IP上暴露 Service,此類型只能在集羣內訪問。
  • NodePort   經過每一個 Node 上的 IP 和靜態端口(NodePort)暴露 Service,集羣外部經過 <NodeIP>:<NodePort> 方式訪問。
  • LoadBalancer   經過外部的負載均衡器暴露 Service。
  • ExternalName   經過返回 CNAME 和它的值,能夠將 Service 映射到 externalName 字段的內容,不使用代理。這種類型須要v1.7版本或更高版本 kube-dnsc 才支持。

$ 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

6. 擴展應用

前面咱們建立了一個 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>

7. 更新應用

滾動更新經過 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

 

內容參考 http://docs.kubernetes.org.cn/

相關文章
相關標籤/搜索