适合 Kubernetes 初学者的一些实战练习 (三)
本系列的前兩篇文章:
- 適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (一)
- 適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (二)
我們已經(jīng)完成了下列在 Kubernetes 中的練習(xí):
- 如何在 Kubernetes 里創(chuàng)建一個(gè) Nginx 應(yīng)用
- 如何在 Kubernetes 里創(chuàng)建一個(gè) Nginx Service
- Kubenetes 里 Pod 和 Service 綁定的實(shí)現(xiàn)方式
- 使用 Kubernetes 里的 job 計(jì)算圓周率后 2000 位
- Kubernetes 里的 ConfigMap 的用途
- 使用腳本在 Linux 服務(wù)器上自動(dòng)安裝 Kubernetes 的包管理器 Helm
- 一個(gè)簡單的例子理解 Kubernetes 的三種 IP 地址類型
- 使用 describe 命令進(jìn)行 Kubernetes pod 錯(cuò)誤排查
本文繼續(xù)通過實(shí)戰(zhàn)來學(xué)習(xí) Kubernetes 相關(guān)知識(shí)。
練習(xí)1:通過 describe 命令學(xué)習(xí) Kubernetes 的 pod 詳細(xì)屬性
我們可以首先使用 kubectl get pods 命令得到 pod 列表,比如我們想研究 pod nginx-storage-pod 的明細(xì):
使用命令 kubectl describe pod nginx-storage-pod > nginx-storage-pod.yaml, 將 describe 命令的輸出重定向到一個(gè) yaml 文件里。用 vi 打開這個(gè) yaml 文件:
pod 的所有屬性可以從這個(gè) yaml 文件里學(xué)習(xí):
node:shoot–k8s-train–shacw46-worker-prvfv-z1-7844dc6744-ghd5m/10.250.0.6
表明 pod 所在的 node,這個(gè) node 一定是命令 kubectl get node 返回的結(jié)果之一:
Image:代表該 pod 是基于哪一個(gè) docker image 創(chuàng)建的。
Mount:該 pod 使用的 persistent volume 對應(yīng)的物理文件目錄,我的例子是 usr/share/nginx/html:
這個(gè)路徑從哪里來的呢?就是我的 pod 文件的 yaml 文件里的定義:
describe命令除了本文介紹的可以用來深入學(xué)習(xí) pod 的屬性外,還可以用于 pod 不能正常啟動(dòng)時(shí)的錯(cuò)誤排查。
比如我有一個(gè) pod 名為 another3,狀態(tài)一直處于 CrashLoopBackOff, RESTART 次數(shù)為12:
使用 kubectl describe pod another3 就可以看到這個(gè)容器啟動(dòng)的明細(xì):
Back-off restarting failed container
仔細(xì)檢查 pod 的 yaml 文件,發(fā)現(xiàn)原因是因?yàn)槲叶x了 volume 的 name 為 content-storage,但是沒有指定 persistentvolumeclaim.
當(dāng)我把 volumes: - name: content-storage 刪除之后,
下圖是修改后的 yaml 文件:
重新創(chuàng)建名為 another3 的 pod,很快就創(chuàng)建成功并且狀態(tài)處于 running 了:
練習(xí)2 - 使用 Gardener 在 Google Cloud Platform 上創(chuàng)建 Kubernetes 集群
Gardener是一個(gè)開源項(xiàng)目,github 地址在這里.
使用 Gardener,我們可以在幾分鐘之內(nèi)在 GCP, AWS, Azure 或者 Openstack 上輕松創(chuàng)建Kubernetes Cluster.
點(diǎn)擊新建按鈕創(chuàng)建一個(gè) Cluster,這里 Infrastructure 我選擇的是 gcp:
創(chuàng)建成功后,狀態(tài)變?yōu)?Ready,表明該集群已經(jīng)可用了。
點(diǎn)擊集群名稱 jerrycls,進(jìn)入集群明細(xì)頁面,在 Access 標(biāo)簽頁下面獲得這個(gè)集群的用戶名admin 和密碼。
點(diǎn)擊 dashboard 超鏈接,會(huì)彈出輸入用戶米和密碼的提示。用戶名輸入 admin,密碼從上面 Access 標(biāo)簽頁獲取。即可進(jìn)入集群的管理頁面。
從左下角處查看這個(gè)集群的三個(gè) namespace:default,kube-public 和 kube-system:
這是 Gardener 自動(dòng)為我分配的工作節(jié)點(diǎn):
點(diǎn)擊 kubeconfig,獲得這個(gè)集群的 config yaml 文件,把它的內(nèi)容復(fù)制下來:
我使用的操作系統(tǒng)是 ubuntu,上面安裝了 kubectl.
進(jìn)入目錄 /home/vagrant/.kube, 用 vi 編輯 config 文件:
把從 Gardener 里拷貝的內(nèi)容粘貼到 config 文件里。
現(xiàn)在使用 kubectl get ns,就可以看到 Kubernetes cluster 上的三個(gè) namespace,和我們前面在 dashboard 里觀察到的一致。
使用 kubectl get node -o wide, 看到一個(gè)工作節(jié)點(diǎn),和之前在 Kubernetes dashboard 里觀察到的一致。
使用命令 kubectl run nginx --image=nginx:1.12.2 創(chuàng)建一個(gè) deployment,運(yùn)行 nginx container:
創(chuàng)建好 deployment 之后,使用命令行創(chuàng)建一個(gè) service,把 nginx 服務(wù)暴露給外部:
kubectl expose deployment nginx --type=loadBalancer --port=80 --target-port=80
使用 kubectl get svc 查看生成的 service,供外部訪問的 IP 地址從 EXTERNAL-IP 處獲得:35.233.45.209:
在瀏覽器里直接訪問這個(gè) ip 地址,看到 nginx 默認(rèn)的首頁,說明部署在 Google Cloud Platform 上的 Kubernetes cluster 能夠正常工作了。
練習(xí)3 - 如何使用 Kubernetes 的 configmap 通過環(huán)境變量注入到 pod 里
在 Kubernetes 官網(wǎng)里,提到了 Kubernetes 里的一個(gè)最佳實(shí)踐就是把應(yīng)用代碼同配置信息分開,一種方式就是使用 Kubernetes 1.2 里引入的 configmap 概念。
configmap實(shí)際上就是一系列鍵值對,存儲(chǔ)于 etcd 里。etcd 的官網(wǎng)有這樣一句話:
etcd is a distributed key-value store designed to reliably and quickly preserve and provide access to critical data.
etcd 是一個(gè)高性能的分布式鍵值對存儲(chǔ)庫,用于存儲(chǔ)和訪問關(guān)鍵數(shù)據(jù)。
使用下面的命令行創(chuàng)建一個(gè) Kubernetes config map:
kubectl create configmap test-config --from-literal=test.type=unit --from-literal=test.exec=always
創(chuàng)建一個(gè)名為 test-config 的鍵值對,key 為 test.type,值為 unit,key 為 test.exec, 值為 always。
下面我打算創(chuàng)建一個(gè) pod,消費(fèi)這個(gè)名為 test-config 的 configmap.
創(chuàng)建一個(gè)內(nèi)容如下的 yaml 文件:
apiVersion: v1kind: Podmetadata:name: test-configmapspec:containers:- name: test-containerimage: alpine:3.8command: [ "/bin/sh", "-c", "env" ]env:- name: TEST_TYPEvalueFrom:configMapKeyRef:name: test-configkey: test.type- name: TEST_EXECvalueFrom:configMapKeyRef:name: test-configkey: test.execrestartPolicy: Never這個(gè) yaml 文件定義的 pod 基于 docker 鏡像 alpine,執(zhí)行 shell 命令 /bin/sh -c env 查看環(huán)境變量。
在 env 區(qū)域,我給該 pod 注入一個(gè)名為 TEST_TYPE 的環(huán)境變量,值從 configMap 鍵值對的鍵名稱為 test.type 的值中取。
kubectl create -f 創(chuàng)建這個(gè) pod:
使用命令 kubectl logs test-configmap 查看這個(gè) pod 運(yùn)行生成的日志,發(fā)現(xiàn)輸出的環(huán)境變量列表中,出現(xiàn)了 TEST_TYPE=unit,這個(gè) TEST_TYPE 是我在 yaml 文件里注入的環(huán)境變量名稱,而 unit 就來自 configmap 里 test-config 的值 unit。
總結(jié)
本文作為該系列的第三篇文章,首先學(xué)習(xí)了如何使用 describe 這個(gè)常用命令來深入學(xué)習(xí) pod 的屬性和一些常見故障的排查工作,接著通過 ConfigMap 使用方法的學(xué)習(xí),了解了 Kubernetes 世界里應(yīng)用代碼同配置信息相分離的這一最佳實(shí)踐,最后學(xué)習(xí)了使用開源項(xiàng)目 Gardener 在云平臺(tái)上創(chuàng)建 Kubernetes 集群的步驟,希望對大家有所幫助。
本系列前兩篇文章包含的練習(xí),請參閱之前的文章:
本系列的前兩篇文章:
- 適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (一)
- 適合 Kubernetes 初學(xué)者的一些實(shí)戰(zhàn)練習(xí) (二)
總結(jié)
以上是生活随笔為你收集整理的适合 Kubernetes 初学者的一些实战练习 (三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu下解压rar文件的方法
- 下一篇: SAP UI5 BarcodeScann