搭建k8s叢集
由於在國內網路問題,我們無法很好的使用minikube進行部署k8s實驗環境,所以可以使用阿里提供的minikube進行搭建。除了minikube,也可以使用kubeasz進行部署。
下面我基於kubeaze給出部署方法。
1.基礎系統配置準備一臺虛擬機器配置記憶體2G/硬碟30G以上最小化安裝Ubuntu 16.04 server或者CentOS 7 Minimal配置基礎網路、更新源、SSH登入等注意: 確保在乾淨的系統上開始安裝,不能使用曾經裝過kubeadm或其他k8s發行版的環境
2.下載檔案下載工具指令碼easzup,舉例使用kubeasz版本2.2.1export release=2.2.1curl -C- -fLO --retry 3 https://github.com/easzlab/kubeasz/releases/download/${release}/easzupchmod +x ./easzup
使用工具指令碼下載
預設下載最新推薦k8s/docker等版本,使用命令./easzup 檢視工具指令碼的幫助資訊
# 舉例使用 k8s 版本 v1.18.2,docker 19.03.5./easzup -D -d 19.03.5 -k v1.18.2
可選下載離線系統包 (適用於無法使用yum/apt倉庫情形)
./easzup -P
上述指令碼執行成功後,所有檔案(kubeasz程式碼、二進位制、離線映象)均已整理好放入目錄/etc/ansible
/etc/ansible 包含 kubeasz 版本為 ${release} 的釋出程式碼/etc/ansible/bin 包含 k8s/etcd/docker/cni 等二進位制檔案/etc/ansible/down 包含叢集安裝時需要的離線容器映象/etc/ansible/down/packages 包含叢集安裝時需要的系統基礎軟體3.安裝叢集容器化執行 kubeasz./easzup -S
使用預設配置安裝 aio 叢集
docker exec -it kubeasz easzctl start-aio
4.驗證安裝
如果提示kubectl: command not found,退出重新ssh登入一下,環境變數生效即可
$ kubectl version # 驗證叢集版本 $ kubectl get node # 驗證節點就緒 (Ready) 狀態$ kubectl get pod -A # 驗證叢集pod狀態,預設已安裝網路外掛、coredns、metrics-server等$ kubectl get svc -A # 驗證叢集服務狀態
在k8s中執行一個程式編寫YAML檔案
Kubernetes 跟 Docker 等很多專案最大的不同,就在於它不推薦你使用命令列的方式直接執行容器,而是希望你用 YAML 檔案的方式,然後用這樣一句指令把它執行起來:
$ kubectl create -f 我的配置檔案
yaml如下:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
Kind 欄位,指定了這個 API 物件的型別(Type),是一個 Deployment。Deployment,是一個定義多副本應用的物件,Deployment 還負責在 Pod 定義發生變化時,對每個副本進行滾動更新。
像這樣使用一種 API 物件(Deployment)管理另一種 API 物件(Pod)的方法,在Kubernetes 中,叫作“控制器”模式(controller pattern)。
一個 Kubernetes 的 API 物件的定義,大多可以分為 Metadata 和 Spec 兩個部分。前者存放的是這個物件的元資料,對所有 API 物件來說,這一部分的欄位和格式基本上是一樣的;而後者存放的,則是屬於這個物件獨有的定義,用來描述它所要表達的功能。
spec.replicas是2,表示定義的 Pod 副本個數。
spec.template作用是描述了我想要建立的 Pod 的細節。spec.containers.image表示容器映象是nginx:1.7.9,containerPort表示監聽的埠是80。
Labels 欄位可以用來過濾控制物件,在上面這個 YAML 檔案中,Deployment 會把所有正在執行的、攜帶“app: nginx”標籤的 Pod 識別為被管理的物件,並確保這些 Pod 的總數嚴格等於兩個。
spec.selector.matchLabels是用來定義過濾規則的,一般稱之為:Label Selector。
建立一個pod在理解完上面的知識後,我們可以執行起來:
$ kubectl create -f nginx-deployment.yaml
然後,通過 kubectl get 命令檢查這個 YAML 執行起來的狀態是不是與我們預期的一致:
$ kubectl get pods -l app=nginxNAME READY STATUS RESTARTS AGEnginx-deployment-67594d6bf6-9gdvr 1/1 Running 0 10mnginx-deployment-67594d6bf6-v6j7w 1/1 Running 0 10m
-l表示獲取所有匹配 app: nginx 標籤的 Pod。
注意:在命令列中,所有 key-value 格式的引數,都使用“=”而非“:”表示。
此外,我們還可以使用kubectl describe 命令,檢視一個 API 物件的細節:
$ kubectl describe pod nginx-deployment-67594d6bf6-9gdvrName: nginx-deployment-67594d6bf6-9gdvrNamespace: defaultPriority: 0PriorityClassName: <none>Node: node-1/10.168.0.3Start Time: Thu, 16 Aug 2018 08:48:42 +0000Labels: app=nginx pod-template-hash=2315082692Annotations: <none>Status: RunningIP: 10.32.0.23Controlled By: ReplicaSet/nginx-deployment-67594d6bf6...Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 1m default-scheduler Successfully assigned default/nginx-deployment-67594d6bf6-9gdvr to node-1 Normal Pulling 25s kubelet, node-1 pulling image "nginx:1.7.9" Normal Pulled 17s kubelet, node-1 Successfully pulled image "nginx:1.7.9" Normal Created 17s kubelet, node-1 Created container Normal Started 17s kubelet, node-1 Started container
上面詳細資訊中,在 Kubernetes 執行的過程中,對 API 物件的所有重要操作都會記錄到Events裡面。
為pod進行版本升級如果我們要對這個 Nginx 服務進行升級,把它的映象版本從 1.7.9 升級為 1.8,那麼我們可以修改一下YAML檔案:
... spec: containers: - name: nginx image: nginx:1.8 #這裡被從1.7.9修改為1.8 ports: - containerPort: 80
然後使用kubectl replace 指令來完成k8s叢集中更新:
$ kubectl replace -f nginx-deployment.yaml
我們也可以使用kubectl apply 命令,來統一進行 Kubernetes 物件的建立和更新操作,具體做法如下所示:
$ kubectl apply -f nginx-deployment.yaml# 修改nginx-deployment.yaml的內容$ kubectl apply -f nginx-deployment.yaml
使用kubectl apply 命令是 Kubernetes“宣告式 API”所推薦的使用方法。也就是說,作為使用者,你不必關心當前的操作是建立,還是更新,你執行的命令始終是 kubectl apply,而 Kubernetes 則會根據 YAML 檔案的內容變化,自動進行具體的處理。
宣告一個 Volume在 Kubernetes 中,Volume 是屬於 Pod 物件的一部分。所以,我們就需要修改這個 YAML 檔案裡的 template.spec 欄位,如下所示:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deploymentspec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.8 ports: - containerPort: 80 volumeMounts: - mountPath: "/usr/share/nginx/html" name: nginx-vol volumes: - name: nginx-vol emptyDir: {}
我們在上面定義了volumes欄位,名字叫做nginx-vol,型別是 emptyDir。Pod 中的容器,使用的是 volumeMounts 欄位來宣告自己要掛載哪個 Volume,並通過 mountPath 欄位來定義容器內的 Volume 目錄,比如:/usr/share/nginx/html。
emptyDir表示,Kubernetes 也會在宿主機上建立一個臨時目錄,這個目錄將來就會被繫結掛載到容器所宣告的 Volume 目錄上。
然後使用kubectl apply 指令,更新這個Deployment,然後使用 kubectl describe 檢視一下最新的 Pod:
...Containers: nginx: Container ID: docker://07b4f89248791c2aa47787e3da3cc94b48576cd173018356a6ec8db2b6041343 Image: nginx:1.8 ... Environment: <none> Mounts: /usr/share/nginx/html from nginx-vol (rw)...Volumes: nginx-vol: Type: EmptyDir (a temporary directory that shares a pod's lifetime)
最後,你還可以使用 kubectl exec 指令,進入到這個 Pod 當中(即容器的 Namespace 中)檢視這個 Volume 目錄:
$ kubectl exec -it nginx-deployment-5c678cfb6d-lg9lw -- /bin/bash# ls /usr/share/nginx/html
如果要刪除這個Nginx Deployment 的話,直接執行:
$ kubectl delete -f nginx-deployment.yaml
總結與k8s進行互動儘量選擇yaml檔案互動;我們可以使用kubectl create 命令建立一個pod;想要獲取目前pod的狀態可以使用kubectl get pods命令;使用kubectl describe pod 可以檢視某個pod的詳細資訊;如果想要對pod更新最好使用kubectl apply -f ,這樣可以做到更加無感的建立pod或更新;我們可以使用Volumes來掛載卷;使用kubectl delete -f可以刪除一個pod;