在部門內容組織了一次K8s的培訓,普及了下K8s的概念、框架、操做等,爲便於後期查閱,也爲了進一步深究K8s,所以開展K8s系列,週期不定…node
(1) 含義:來自希臘語,意爲」舵手」,又稱K8sgit
(2) 歷史:2014年由Google建立,是十多年大規模容器管理技術Borg的開源版github
(3) 功能:爲容器化應用提供資源調度,即容器編排數據庫
嚴格意義:容器是將代碼以及全部的依賴打包,以便應用可以快速運行,以及在環境間的可靠移植。 json
通俗意義:容器就像一個集裝箱,將應用封裝起來。這樣應用和應用之間,就由於有了邊界而不至於相互干擾;而被裝進集裝箱的應用,能夠被方便的搬來搬去。 api
K8s並未將Docker做爲整個架構的核心,僅僅把它做爲最底層的一個容器運行時bash
(1) master網絡
a. controller-manager:容器編排架構
b. uapi-server:提供api服務app
c. scheduler:負責調度
(2) Etcd:用於a: K8s集羣持久化數據; b: 由api-server處理後保存
(3) worker
1) kubelet
a. 負責同容器運行時打交道,定義容器運行時的各類操做
b. 依賴CRI遠程調用接口(Container Runtime Interface)
c. 經過api-server同master通訊
2) Container Runtime
a.同底層OS交互,將CRI請求轉化爲對Linux OS的調用
b. 依賴OCI協議(Open Container Interface)
3) Device Plugin
a. kubelet經過gRPC與Device plugin交互
b. 管理GPU宿主機物理設備,用於機器學習、高性能做業
4) Networking
a. kubelet調用網絡插件爲容器配置網絡
b. 經過CNI協議(Container Networking Interface)交互
5) Volume Plugin
a. kubelet調用存儲插件爲容器配置持久化存儲
b. 經過CSI協議(Container Storeage Interface)交互
(1) 設計思想:從更宏觀的角度,以統一的方式來定義任務之間的各類關係
1) Pod
a. K8s的最小、最簡單的單元
b. 表明集羣中的運行進程
c. K8s可將多個容器劃分爲一個Pod,Pod中的容器共享同一個Network,同一組數據卷
2) Service
a. 對於容器來講,IP地址信息並不是固定,Service聲明IP地址與Pod綁定,提供固定IP地址
b. 做爲Pod的代理入口,代替Pod對外暴露一個固定網絡地址,以提供外部訪問
3) Deployment
a. 管理Pod,如啓動多個應用實例
4) Secret
a. 將鑑權信息(數據庫密碼)以Secret方式存儲在Etcd中的鍵值對
b. 啓動Pod應用時,可自動把Secret中的數據以Volume的方式掛載到容器中
5) Job
a. 描述一次性運行任務,如大數據任務
6) DaemonSet
a. 每一個宿主機上必須且只能運行一個副本的守護進程服務
7) CronJob
a. 定時任務
8) Ingress
a. 爲K8s的Service配置HTTP負載均衡器,將服務暴露給K8s集羣外的客戶端
9) StatefulSet
a. 管理有狀態應用,提供Pod惟一標識
b. 保證部署和擴展Pod的順序
10) ConfigMap
a. 容器應用的配置管理
a. https://github.com/opsnull/follow-me-install-kubernetes-cluster
b. https://git.xfyun.cn/container/kdeploy
c. https://kubernetes.io/docs/setup/independent/install-kubeadm/
d. https://kubernetes.io/docs/tasks/tools/install-minikube/
(1) Cluster
1) 主節點
a. 管理集羣: 調度應用、維護應用所需狀態、應用滾動更新
2) 工做節點
a. kubelet: 管理工做節點,並負責與主節點通訊,處理容器操做
3) 工做節點與主節點經過api-server通訊,開發者也可調用api-server
4) 命令:
kubectl version # 查詢版本 kubectl cluster-info #查詢集羣的細節 kubectl get nodes #查詢集羣節點信息
(2) Deployment
1) 執行格式:kubectl action resources
2) 執行流程
a. 尋找合適工做節點運行應用實例
b. 調度應用在該節點上運行
c. 須要時在新節點上從新調度實例
3) 當工做節點上的應用掛掉或刪除,K8s將替換並重啓一個
4) 命令:
kubectl -n test run hello-world --replicas=2 --labels=「run=load-balancer-example」 --image=anjia0532/google-samples.node-hello:1.0 --port=8080 # 建立Deployment kubectl –n test get deployments #查詢當前Deployment
1) 一個Pod能夠有多個容器,共享存儲、網絡等信息
2) 每一個Pod具備獨立且惟一的網絡IP
a. 集羣內的Pod和Service相互可見,集羣外不可見
b. 經過kubectl proxy代理轉發,實現外界與集羣內Pod通訊
3) 命令:
kubectl get object # 顯示指定對象 kubectl describe object # 對象具體細節 kubectl logs pod #打印pod容器中的日誌 kubectl exec pod #執行Pod容器命令
(4) Service
1) 定義一組邏輯Pod及訪問Pod的策略,4種類型
a. ClusterIP(默認): 集羣內爲Service保留IP,僅集羣內訪問
b. NodePort: 使用NAT在集羣的每一個節點同一端口公開,可經過<NodeIp>:<NodePort>在集羣外部訪問
c. LoadBalancer: 外部負載均衡,爲Service指定固定外部IP
d. ExternalName: 經過返回帶有名稱CNAME記錄,使用任意名稱公開服務,需kube-dns支撐
2) 命令:
kubectl -n test expose deployments/hello-world --port=8080 --type=「NodePort」 # 公開服務 kubectl -n test get services # 查看服務 kubectl -n test describe service hello-world # 查看服務詳情 curl 192.168.86.156:39018 #測試服務 kubectl -n test delete service hello-world #刪除Service kubectl -n test exec -ti hello-world-7b97bf7768-cldrm curl localhost:8080 # 驗證容器內的服務仍在運行
(5) Label
1) 使用鍵值對存儲,用途:
a. 指定測試、開發、生產環境的對象
b. 嵌入版本標籤
c. 使用標籤分類對象
2) 命令:
kubectl -n test get pods -l run=load-balancer-example # 使用標籤查詢Pod kubectl -n test get services -l run=load-balancer-example # 使用標籤查詢Service kubectl -n test label pod hello-world-7b97bf7768-cldrm app=v1 # 爲Pod打新的標籤
(6) Scale
1) 流量增長時,需對應用進行擴展
2) K8s基於Deployment中的副本數實現擴展
3) 命令
kubectl -n test scale deployments/hello-world --replicas=4 # 擴展副本集 kubectl -n test get pods -o wide #查看擴展 kubectl -n test describe deployments/hello-world # 查看deployment詳情 kubectl -n test expose deployments/hello-world --port=8080 --type=「NodePort「 # 公開服務 kubectl -n test describe service hello-world # 查看暴露的端口 curl 192.168.86.1:11235
(7) Rollout Update
1) Deployment滾動更新時,Service將流量負載均衡至可用狀態的Pod
2) Rollout Update時,Pods的最大可用數和新的Pod的最大建立你數,默認均爲1,但能夠設置
3) 滾動更新版本化,任何Deployment更新都可還原以前的版本
4) 支持以下操做
a. 將應用從一個環境推廣到另外一個環境
b. 回溯至之前的版本
c. 應用的CI/CD
5) 命令:
kubectl -n test describe pod hello-world-7b97bf7768-lftt5 # 顯示Pod中的鏡像 kubectl –n test set image deployments/hello-world hello-world=anjia0532/google-samples.hello-app:2.0 #通知Deployment使用不一樣鏡像,滾動更新 kubectl -n test rollout status deployments/hello-world # 驗證更新 kubectl -n test describe pod hello-world-855cb96d-qx827 #查看鏡像是否更新 kubectl -n test rollout undo deployments/hello-world #版本還原 kubectl -n test describe pod hello-world-7b97bf7768-sbmq4
(8) ConfigMap
1) 容許配置與鏡像內容分離,進而保持容器應用可移植性
2) 建立格式:kubectl create configmap <map-name> <data-source>
a. data-source: 可來自於文件、目錄或字面值,均以鍵值對錶示
3) 命令:
kubectl -n test create configmap game-config2 --from-file=game.properties --from-file=ui.properties kubectl -n test get configmap game-config2 -o yaml kubectl -n test describe configmap game-config2 kubectl -n test create configmap game-config-env-file --from-env-file=game-env-file.properties kubectl -n test get configmap game-config-env-file -o yaml kubectl -n test create configmap special-config --from-literal=special.how=very --from-literal=special.type=charmükubectl -n test create configmap game-config2 --from-file=game.properties --from-file=ui.properties kubectl -n test get configmap game-config2 -o yaml kubectl -n test describe configmap game-config2 kubectl -n test create configmap game-config-env-file --from-env-file=game-env-file.properties kubectl -n test get configmap game-config-env-file -o yaml kubectl -n test create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm kubectl -n test create configmap env-config --from-literal=log_level=INFO kubectl -n test get configmap special-config -o yaml
(9) 基於yaml文件配置
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod namespace: test spec: containers: - name: test-container image: anjia0532/google-containers.busybox:1.27.2 command: [ "/bin/sh", "-c", "env" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how restartPolicy: Never
命令:
kubectl apply –f dapi-test-pod.yaml kubectl –n test describe pod dapi-test-pod kubectl –n test logs pods/dapi-test-pod
1) --help/-h: 若是對於某個命令不熟悉,能夠直接在命令後增長--help或-h,查看用途及示例
2) 在線教程
a. https://www.katacoda.com/courses/kubernetes/
b. https://training.play-with-kubernetes.com/kubernetes-workshop/
1 1. Cluster 2 # 查看K8s的版本 3 kubectl version 4 5 #查看集羣信息 6 kubectl cluster-info 7 8 # 查看當前集羣節點信息 9 kubectl get nodes 10 11 12 2. Deployment 13 # 建立deployment 14 kubectl -n test run hello-world --image=anjia0532/google-samples.node-hello:1.0 15 # 查詢當前deployments(完成部署時AVAILABLE纔會爲2) 16 kubectl -n test get deployments 17 18 19 3. Pod 20 # 顯示Pods 21 kubectl -n test get pods 22 23 # 顯示指定Pod詳情 24 kubectl -n test describe pod hello-world-9d675f6bf-dg4bh 25 26 # 打印容器日誌(應用一般發送給STDOUT的任何內容,均會成爲Pod容器中的日誌) 27 kubectl -n test logs hello-world-9d675f6bf-dg4bh 28 29 # 查看容器內部的信息 30 kubectl -n test exec hello-world-9d675f6bf-dg4bh env 31 kubectl -n test exec hello-world-9d675f6bf-dg4bh -it bash 32 33 # 查看服務 34 curl localhost:8080 35 36 37 4. Service 38 # 使用NodePort方式公開服務 39 kubectl -n test expose deployments/hello-world --port=8080 --type="NodePort" 40 41 # 查看服務 42 kubectl -n test get services 43 44 # 查看服務詳情 45 kubectl -n test describe services hello-world 46 47 # 驗證公開服務 <NodeIp>:<NodePort> 48 curl 192.168.86.156:29463 49 50 # 刪除Service 51 kubectl -n test delete service hello-world 52 53 # 查看Service 54 kubectl -n test get services 55 56 # 集羣內的服務仍在運行 57 kubectl -n test exec hello-world-675c948d88-c6df2 -it curl localhost:8080 58 59 5. Label 60 # 使用標籤查詢Pod 61 kubectl -n test get pods -l run=hello-world 62 63 # 使用標籤查詢Service 64 kubectl -n test get services -l run=hello-world 65 66 # 爲Pod建立新的標籤 67 kubectl -n test label pod hello-world-675c948d88-c6df2 app=v1 68 69 6. Scale 70 # 擴展副本集 71 kubectl -n test scale deployments/hello-world --replicas=2 72 73 # 查看Pod 74 kubectl -n test get pods -o wide 75 76 # 查看Deployments的詳情 77 kubectl -n test describe deployment hello-world 78 79 # 公開服務 80 kubectl -n test expose deployments/hello-world --port=8080 --type="NodePort" 81 82 # 查看公開的端口 83 kubectl -n test get service -o wide 84 85 # 測試負載均衡 86 curl 192.168.86.156:18047 87 88 7. Rollout Update 89 # 查找Deployment中的鏡像 90 kubectl -n test describe deployment hello-world 91 92 # 更新應用鏡像,使用set image命令 93 kubectl -n test set image deployments/hello-world hello-world=anjia0532/google-samples.hello-app:2.0 94 95 # 驗證更新 96 kubectl -n test describe deployment hello-world 97 kubectl -n test rollout status deployment hello-world 98 99 # 版本還原(滾動更新異常,如鏡像沒法拉取等) 100 kubectl -n test rollout undo deployments/hello-world 101 102 # 查看還原後的版本 103 kubectl -n test describe deployment hello-world 104 105 8. ConfigMap 106 # 基於文件建立ConfigMap 107 kubectl -n test create configmap game-config --from-file=game.properties --from-file=ui.properties 108 109 # 檢測建立結果 110 kubectl -n test get configmap game-config -o yaml 111 112 # 基於環境變量配置文件建立 113 kubectl -n test create configmap game-config-env-file --from-env-file=game-env-file.properties --from-env-file=ui-env-file.properties 114 115 # 查看建立結果(當屢次使用多個數據來源經過--from-env-file建立時,只有最後一個生效) 116 kubectl -n test get configmap game-config-env-file -o yaml 117 118 # 基於字面值建立 119 kubectl -n test create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm 120 kubectl -n test create configmap env-config --from-literal=log_level=INFO 121 122 # 查看字面值建立 123 kubectl -n test get configmap special-config -o json 124 125 # 基於yaml文件配置 126 kubectl apply -f dapi-test-pod.yaml 127 128 # 查看該Pod 129 kubectl -n test describe pod dapi-test-pod 130 131 # 查看輸出日誌是否生效 132 kubectl -n test logs pods/dapi-test-pod