适合 Kubernetes 初学者的一些实战练习(一)
本系列記錄了筆者剛剛接觸并學習 Kubernetes 時動手做過的一些練習,這里分享出自己的 Kubernetes 學習歷程,希望對廣大 Kubernetes 初學者有所幫助。
練習1 - 如何在 Kubernetes 里創建一個 Nginx 應用
使用命令行 kubectl run --image=nginx nginx-app --port=80 創建一個名為 nginx-app 的應用
結果: deployment.apps/nginx-app created
使用命令行 kubectl get pods 查看創建結果,狀態已經為 running:
使用命令行 kubectl describe pods 查看 pod 明細:
把 pod id 記下來: nginx-app-f75d46bd9-q6c76
使用該 pod id 可以執行一些命令:
-
kubectl exec nginx-app-f75d46bd9-q6c76 ps aux
-
kubectl describe pod nginx-app-f75d46bd9-q6c76
-
kubectl logs nginx-app-f75d46bd9-q6c76
練習2 - 如何在 Kubernetes 里創建一個 Nginx Service
前一個練習,我們已經使用 kubectl 命令行創建了 Pod,但是在 kubernetes 中,Pod 的 IP 地址會隨著 Pod 的重啟而變化,因此用 Pod 的 IP 地址來訪問我們部署的 nginx 應用不太合適。
Kubernetes 里推薦的方式是用 Service 來消費 nginx 服務。
Service 為一組 Pod 提供一個統一的入口,并為它們提供負載均衡和服務發現支持。
使用如下命令行基于 pod 創建一個 service:
kubectl expose deployment nginx-app --type=NodePort --port=80
收到 service/nginx-app exposed 消息。
使用命令行拿到創建成功的 service 的明細:
kubectl describe service nginx-app
使用 http://<node_id>:32624 訪問這個 nginx 應用:
看到上圖說明訪問 nginx 成功了。
使用命令行查看 nginx 訪問日志:
kubectl logs nginx-app-f75d46bd9-q6c76
練習3 - Kubenetes 里 Pod 和 Service 綁定的實現方式
前一個練習,我們介紹了如何創建一個 Kubernetes pod 和 service,使用的方法是命令kubectl run.
本文介紹另一種方式,通過這種方式來學習 Kubernetes 里 pod 和對應的 service 是如何綁定的。
首先使用下面的命令行創建一個名稱為 jerry-nginx-1982 的 deployment:
kubectl create deployment jerry-nginx-1982 --image=nginx
然后使用命令行 kubectl get deployment 得到創建好的 deployment:
然后創建一個同名的 service,類型為 nodeport.
kubectl create service nodeport jerry-nginx-1982 --tcp 80:80
創建完成后,使用命令行 kubectl get svc 得到名稱為 jerry-nginx-1982 對外暴露的端口號:31954:
然后就能通過這個端口號訪問nginx server了:
那么這兩個同名的 pod 和 service 是如何關聯的呢?
首先打開 kubernetes dashboard,找到之前創建的 pod:
其明細為:jerry-nginx-1982-67cb658cb8-9hl99
再打開同名service:
再打開這個 service 里的 pod,發現就是我們前面找到的 jerry-nginx-1982-67cb658cb8-9hl99,說明 pod 和 service 是通過名稱關聯的。
我們可以做一個 negative 測試,直接創建一個名為 test 的 service,但不給它預先創建名為 test 的 pod:
kubectl create service nodeport test --tcp 80:80
service 創建成功后,打開這個 service,發現里面沒有分配任何 pod:
這個結果和我們預測的一致。
練習4 - 使用 Kubernetes 里的 job 計算圓周率后 2000 位
使用 Kubernetes 里的 job(作業),我們可以很方便地執行一些比較耗時的操作。
新建一個 job.ymal 文件:
定義了一個 Kubernetes job,名稱為 pi,類型為 job,容器名稱為 pi,鏡像為 perl,執行的 perl 命令為 print bpi(2000):
這個 ymal 文件的完整內容:
apiVersion: batch/v1 kind: Job metadata: name: pi spec: template: metadata: name: pi spec: containers: name: pi image: perl command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] restartPolicy: Never使用命令 kubectl create -f 導入這個 yaml 文件,創建一個新的 job:
之后在 Kubernetes 的 dashboard 里能看到這個新建的 job:
job 對應的 pod 狀態為 Waiting ContainerCreating:
稍后,其狀態從 Running 變為了 Terminated:Completed,總共花了 14 分鐘。
在 pod 的事件日志里,能看到大部分時間花在了 perl 鏡像的下載上:
點擊 dashboard 的 logs 按鈕,就能看到這個 2000 位圓周率的計算結果:
練習5 - Kubernetes 里的 ConfigMap 的用途
顧名思義,ConfigMap 用于保存配置數據的鍵值對,可以用來保存單個屬性,也可以用來保存配置文件。
ConfigMap 同 Kubernetes 的另一個概念 secret 類似,區別是 ConfigMap 主要用于保存不包含敏感信息的明文字符串。
創建方式:
kubectl create configmap special-config --from-literal=i042416=jerry
上述命令行創建了一個名為 special-config 的鍵值對,
key為 i042416, 值為 jerry
接下來我希望用這個 key 為 i042416 的值"jerry"來定義成 pod 里的一個環境變量。
下面是我的 yaml 文件:
apiVersion: v1 2 kind: Pod 3 metadata: 4 name: jerry-config-pod 5 spec: 6 containers: 7 - name: test-container 8 image: http://gcr.io/google_containers/busybox 9 command: [ "/bin/sh", "-c", "env" ] 10 env: 11 - name: JERRY_NAME 12 valueFrom: 13 configMapKeyRef: 14 name: special-config 15 key: i042416 16 restartPolicy: Never可以看到第 15 行引用了我的 ConfigMap 的 key:i042416
下面使用 create -f 將該 yaml 文件導入,創建一個新的 pod:
創建之后,能在 pod 的明細頁面看到 configMap 的 key 已經作為環境變量顯示出來了:
因為我 yaml 文件里指定 pod 執行的 script 為 /bin/sh -c env, 因此最后會將容器里所有的環境變量都打印出來,我們定義在 ConfigMap 里的 i042416 的值 jerry 也被顯示了出來:
這種定義環境變量的做法和 SAP 云平臺 CloudFoundry 環境里定義環境變量的方式很類似。
CloudFoundry環境變量一覽表:
https://docs.run.pivotal.io/devguide/deploy-apps/environment-variable.html
- CF_INSTANCE_ADDR
- CF_INSTANCE_GUID
- CF_INSTANCE_INDEX
- CF_INSTANCE_IP
- CF_INSTANCE_INTERNAL_IP
- CF_INSTANCE_PORT
- CF_INSTANCE_PORTS
- DATABASE_URL
- HOME
- LANG
- MEMORY_LIMIT
- PORT
- PWD
- TMPDIR
- USER
- VCAP_APP_PORT
- VCAP_APPLICATION
- VCAP_SERVICES
當使用 cf push 命令將本地應用部署到 SAP 云平臺的 CloudFoundry 環境下時,某些環境變量會自動被系統寫入相應的值,這個行為同 ABAP 的 sy-sysid 自動被設置為當前系統 ID 具有一樣的邏輯。
比如 app router 會把用戶訪問請求重定向到 XSUAA 實例上。
app router 在 manifest.yml 里定義的 XSUAA 實例名稱為 xsuaa-jerry-demo,
在運行時這個 XSUAA 的 id 會被 SAP 云平臺自動寫入環境變量 VCAP_SERVICES 里:
總結
本文介紹了每一個 Kubernetes 從業者的實際工作中幾乎都會使用的步驟:創建 Deployment 和 Service,同時通過實際例子講解了 Pod 和 Service 綁定的實現方式,介紹了使用 Kubernetes Job 計算圓周率這種費時的操作,希望對 Kubernetes 初學者能有所幫助。
總結
以上是生活随笔為你收集整理的适合 Kubernetes 初学者的一些实战练习(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 普却信是什么梗 出自哪里
- 下一篇: Ubuntu下解压rar文件的方法