iT邦幫忙

2021 iThome 鐵人賽

DAY 12
1
DevOps

DevOps 好想學!新手也能打造雲端 Study Lab系列 第 12

Day12 - Google Kubernetes Engine 基礎 - Pod 建置

前言

前一天我們建立好了 Kubernetes 的環境,今天就來實際使用看看,將應用程式透過 Pod 部屬到 k8s 內部。

Kubernetes 基礎元件

在 Kubernetes 有著各式元件,有負責建置容器,也有負責管理網路的。使用 K8s 的方法就是根據需求來建置所需要的元件,這裡就來介紹最基本的 Node 以及 Pod 。

Node

Node 是 Kubernetes 的硬體單位,可以是實體機或虛擬機,作為工作節點提供運算資源。

Pod

Pod 是 Kubernetes 的最小運行單位,由一個或多個容器所組成,一個 Pod 對應一個應用程式。

實際情況來說,在一個 k8s 叢集上會有許多 Node,代表實際的運算資源,裡面安裝了如 Docker 的容器平台,而 k8s 就會以 Pod 為單位將容器放入到 Node 上做運行。

Kubectl 基本操作

要如何建立、管理 Kubernetes 的元件,可以使用Kubectl工具,我們就來實際練習看看。

  1. 進入 Cloud Shell 網站,點擊終端機輸入指令

  2. 列出所有的 project ,找到之前所創建專案的 PROJECT_ID

gcloud projects list

  1. 點擊倒三角形->點選專案的 PROJECT_ID,開啟專案 Terminal

在前一篇中已經設置好了kubectl工具了,現在使用kubectl get <type>就能夠查看叢集上的各種元件。

  1. 查看所有 Node 元件
kubectl get nodes

(輸出結果)

NAME                                STATUS  ROLES   AGE    VERSION
gke-lab-default-pool-9638ad20-l69n  Ready   <none>  7m50s  v1.20.9-gke.701
gke-lab-default-pool-9638ad20-tnlg  Ready   <none>  7m50s  v1.20.9-gke.701
gke-lab-default-pool-9638ad20-x3jm  Ready   <none>  7m50s  v1.20.9-gke.701

這裡對應著 GCP 上的三台 VM ,被加入到 k8s 作為工作節點,使用kubectl describe <type> <object name>就能查看詳細資料。

  1. 查看 Node 資訊,將<object name>改為你任一 Node 的名稱
kubectl describe node <object name>

會輸出這個 Node 的資訊,包括 IP、系統資源、事件等等。

https://ithelp.ithome.com.tw/upload/images/20210911/20139235v8nKJZjnfQ.png

Pod 建立

要如何在 Kubernetes 建立元件,可以在一個 yaml 文件中描述,下面就來使用 yaml 檔來建置 Pod 。

  1. 建立 k8s-test 資料夾
cd && mkdir k8s-test
  1. 建立 yaml 檔案
cd ~/k8s-test && touch mypod.yaml
  1. 點擊左上 Explorer -> Open Folder -> 選擇 k8s-test 資料夾 -> Open

https://ithelp.ithome.com.tw/upload/images/20210912/20139235tXYtjLiGNr.png

  1. 點擊mypod.yaml檔案並貼上以下內容,並將<your iamge name>改成之前建立的 Image Name

這裡的 Image 是在 Day08 所建立的 Node 應用

https://ithelp.ithome.com.tw/upload/images/20210911/20139235XxDNe66QdN.png

  • mypod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  labels:
     app: myapp
spec:
  containers:
    - name: mycontainer
      image: <your iamge name>
      ports:
         - containerPort: 8080
  • apiVersion
    • 該元件的版本號,根據要建立的元件而定
  • kind
    • 要建立的元件
  • metadata
    • name: 指定該 pod 的名稱
    • labels: 給定一個key/value,根據標籤將 Pod 分群管理
  • spec
    • 負責定義 Container 詳細資訊
    • containers
      • name: Container 的名稱
      • image: Container 使用的 Image
      • ports: 指定哪些 Port 允許外部資源存取

建好了 yaml 檔案,就可以使用kubectl apply -f <file>指令,Kubernetes 會根據 yaml檔的內容建立相應元件。

  1. 根據mypod.yaml建立元件
kubectl apply -f mypod.yaml

使用kubectl get <type>就能夠查看 Pod 元件。

  1. 查看所有 Pods
kubectl get pods

(輸出結果)

# 剛建立時輸入
NAME    READY   STATUS              RESTARTS   AGE
mypod   0/1     ContainerCreating   0          5s
# 建立完成後輸入
NAME    READY   STATUS    RESTARTS   AGE
mypod   1/1     Running   0          14s

可以看到mypod建立成功並成功運行,使用kubectl describe <type> <object name>查看詳細資料。

  1. 查看 mypod 詳情
kubectl describe pod mypod

(輸出結果 -> Event)

Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  90s   default-scheduler  Successfully assigned default/mypod to gke-lab-default-pool-9638ad20-l69n
  Normal  Pulling    89s   kubelet            Pulling image "gcr.io/ninth-bonito-324214/node-project:v1"
  Normal  Pulled     79s   kubelet            Successfully pulled image "gcr.io/ninth-bonito-324214/node-project:v1" in 9.834570297s
  Normal  Created    78s   kubelet            Created container mycontainer
  Normal  Started    78s   kubelet            Started container mycontainer

會顯示 Pod 詳細資訊,包括容器使用了什麼 Image 、運行事件等等。

存取 Pod 資源

建立好了 Pod 後,要怎麼跟裡面的容器進行互動,常見的有兩種方式

  • 使用 kubectl 做 port-forward
  • 建立一個 Service 元件

這裡使用第一種方式,利用kubectl port-forward <pod> <本機 port>:<pod port>,可以將 Pod 中的某個 Port 跟本機端做映射。

  1. 將 mypod 的 8080 Port 映射到本機的 8080 Port
kubectl port-forward mypod 8080:8080

(輸出結果)

Forwarding from 127.0.0.1:8080 -> 8080

此時透過 cloud shell 的 8080 Port 就能獲取 Pod 裡的服務。

  1. 在cloud shell點擊網頁預覽->透過以下通訊預覽 : 8080

看到回傳訊息,成功的與容器進行互動。

https://ithelp.ithome.com.tw/upload/images/20210907/20139235NPmhN4uq8U.png

  1. 回到 Cloud Shell 終端機,點擊Ctrl +c停止 port-forward

總結

今天學習到了 kubectl 基本指令,以及如何透過 yaml 檔案來建置 Pod 元件,下一章將會介紹 service 元件,建立 Pod 的溝通管道。


上一篇
Day11 - Google Kubernetes Engine 輕鬆架起 k8s 環境
下一篇
Day13 - Google Kubernetes Engine 基礎 - 使用 Service 暴露服務
系列文
DevOps 好想學!新手也能打造雲端 Study Lab30

尚未有邦友留言

立即登入留言