k8s實戰 ---- pod 基礎

王若伊_恩赐解脱發表於2024-07-04

如果你對k8s還不瞭解,可以看下前文

k8s 實戰 1 ---- 初識 (https://www.cnblogs.com/jilodream/p/18245222)

什麼是pod,pod在英文中是豌豆莢、分離倉、集裝箱的意思。
在k8s中,pod就是融合一堆容器例項的一個大容器(稱之為集合更貼切)。
K8s所能部署的最小單元就是容器,就是pod,一個pod可以包含一個容器,也可以包含多個容器。
k8s以pod為最小單元將排程容器到指定的節點上,而無法直接排程某一個具體的容器。因此如果pod中有多個容器的話,那麼他們共享同一個ip地址,共享同一套埠列表。
那麼我們該如何建立一個pod呢?目前最推薦的做法就是以yaml檔案的形式,宣告pod,並提交建立。(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )
舉個例子:

 1 apiVersion: v1
 2 kind: Pod
 3 metadata:
 4   name: kuard-p
 5 spec:
 6   containers:
 7     - image: docker.io/library/kuard-amd64:blue
 8       name: kuard-c
 9       ports:
10         - containerPort: 8080
11           name: http
12           protocol: TCP

apiVersion指的是呼叫的k8s api的版本,我們目前使用的是v1版本,這個引數不用太關心。
kind表示我們要創造的資源的型別,k8s除了pod,還有service deployment configmap等等非常多的資源,我們這裡傳入pod。
對於其他型別的資源大家不要著急,後面需要對每一種常用資源都掌握,才能算熟練掌握k8s的使用。
metadata後設資料,通常會定義關於描述資源的一些基本資訊。如標籤,名稱等。至於什麼是標籤,這點和java中的註解非常類似,非常重要,但是並不是一定要用,這裡我們先跳過。
只定義資源的名稱。
specspec是specification的縮寫,表示規格,也就是你想定義的資源究竟是什麼樣子的 ?
本文中,(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )我們定義的spec是需要一系列的容器(雖然只有一個)containers。
containers表示我們需要定義一些容器,其中的每一個 '- image' 表示我們每一個容器的定義,熟悉yaml定義的同學肯定知道,這是陣列的含義。
containers,每一個元素分別需要標明:
image 容器所需映象
name容器的名稱
ports容器的埠列表

ports 中每一個埠又需要依次定義:
containerPort 容器的埠號,
name 埠名稱
protocol埠使用的協議

這樣一份最簡單的pod資源定義就算完成了。前文中有講過,我們需要使用kubectl客戶端來和k8s (api server)互動:
首先將上邊的模板儲存到一份yaml中,假若我們定義為 learnPod.yaml

(1)要求k8s 按照yaml檔案建立資源:

kubectl create -f xxx.yaml # xxx.yaml為檔名稱

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k create -f learnPod.yaml 
2 pod/busyb-p created

(2)查詢k8s中的pod資源用如下命令:
kubectl get pods

[root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k get pods
NAME                              READY   STATUS    RESTARTS   AGE
busyb-p                           1/1     Running   0          23m

(3) 刪除k8s中的資源使用如下命令:

kubectl delete pods xxx (xxx為資源名稱)

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k delete pods busyb-p
2 pod "busyb-p" deleted

(4)重新重新整理資源模板

如果我們建立完pod資源,發現有些地方需要修改怎麼辦:

推薦做法是編輯剛才我們使用 yaml檔案,然後重新提交

kubectl apply -f xxx.yaml

k8s就會按照檔案對已有資源進行修改,一般我們會升級映象,開放新埠這樣來用。
如果有時有些特性的修改,無法直接編輯,則只能刪除資源,重新建立來生效。

(5)檢視資源詳情

有時我們還需要檢視pod的詳情,則可以使用

kubectl describe pods xxx (xxx為資源名稱)

我們常常使用此命令來檢視pod的具體資訊,如映象的詳情,啟動狀態的變化等

(6)線上編輯資源模板

如果有時我們線上上,臨時需要處理一些問題來編輯資源也可以使用
kubectl edit pods xxx

edit 之後直接儲存,視為更新pod,不儲存,視為不更新pod。

(7)檢視pod(準確的說是pod中容器)的日誌
kubectl logs -f xxx (xxx為資源名稱)

1 [root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k logs -f busyb-p
2 2024/07/04 08:33:45 Starting kuard version: v0.10.0-blue
3 2024/07/04 08:33:45 **********************************************************************
4 2024/07/04 08:33:45 * WARNING: This server may expose sensitive
5 2024/07/04 08:33:45 * and secret information. Be careful.
6 2024/07/04 08:33:45 **********************************************************************
7 2024/07/04 08:33:45 Config: 
8 {
9   "address": ":8080",

(8) 有時我們需要進入到容器中,看下容器內的具體資訊

kubectl exec -it xxx -- /bin/sh (xxx為資源名稱)

進入到pod中去,

[root@iZ2ze3bpa0o5cw6gp42ry2Z learnK8s]# k exec -it busyb-p -- /bin/sh
~ $ ls -l
total 17076
drwxr-xr-x    2 root     root          4096 Mar  4  2019 bin
drwxr-xr-x    5 root     root           360 Jul  4 08:33 dev
drwxr-xr-x    1 root     root          4096 Jul  4 08:33 etc

....

除了pod的基本配置外,我們有時還會根據實際業務來配置pod中映象的拉去策略到模板中
imagePullPolicy
Always:總是從遠端倉庫中拉取映象
ifNotPresent:如果本地倉庫中有映象的話,那麼就不拉取,如果本地倉庫沒有才會選擇拉取,這也是預設的拉取策略。
Never:不會從遠端拉取映象,(防盜連線:本文首發自http://www.cnblogs.com/jilodream/ )如果本地有映象的話就使用,如果沒有映象,則會報錯。
imagePullPolicy 屬於容器屬性,和映象名稱、映象tag屬於同一層級。
如下:

.省略..
spec:
  containers:
    - image: docker.io/library/kuard-amd64:blue
      name: kuard-c
      imagePullPolicy: IfNotPresent
.省略..

除去這些基本的操作,pod的使用,還非常的複雜,如掛載卷、標籤的使用,配合更高階的資源使用(如 deployment、service),限於篇幅有限,只能在後邊的文章中介紹。

相關文章