一、前言
? ? ? ?Pod的原意是豌豆莢的意思,一個(gè)豆莢里面包含了很多豆子。在K8S中,Pod也是類(lèi)似的意思,只不過(guò)這里的豆子就是容器。在K8S初級(jí)入門(mén)系列之一-概述中,我們對(duì)Pod有個(gè)初步的了解。
1、Pod是K8S編排和調(diào)度的最小基礎(chǔ)單元。
? ? ? ? 了解容器的同學(xué)會(huì)知道,容器之間通過(guò)隔離技術(shù)(namespace+cgroup+chroot),實(shí)現(xiàn)了應(yīng)用間的隔離。那么K8S為何不直接使用容器進(jìn)行調(diào)度,而非得再引入Pod的概念,使得模型更加復(fù)雜呢?現(xiàn)在的復(fù)雜系統(tǒng)有著成百上千的服務(wù),服務(wù)與服務(wù)之間的關(guān)系,從運(yùn)行環(huán)境看,需要做資源的隔離,但是從業(yè)務(wù)邏輯看,他們又存在親和性。
? ? ? ?比如下面的系統(tǒng)中,字?jǐn)?shù)統(tǒng)計(jì)是應(yīng)用服務(wù),實(shí)現(xiàn)業(yè)務(wù)功能,Nginx服務(wù)負(fù)責(zé)應(yīng)用服務(wù)的反向代理以及負(fù)載均衡,日志采集服務(wù)收集應(yīng)用服務(wù)的日志并進(jìn)行上報(bào),這三個(gè)服務(wù)必須部署運(yùn)行在一起,才能對(duì)外提供完整的功能。同時(shí)為了系統(tǒng)的可靠性,數(shù)據(jù)庫(kù)MySql服務(wù)需要和應(yīng)用服務(wù)分開(kāi)部署。
? ? ?這個(gè)例子中,如果用容器實(shí)現(xiàn),就需要將應(yīng)用服務(wù),Ngnix服務(wù),日志采集服務(wù)放到一個(gè)容器中,才能實(shí)現(xiàn)統(tǒng)一部署。這種方式不是說(shuō)不可以,但是違背了容器的設(shè)計(jì)理念,即一個(gè)進(jìn)程跑一個(gè)容器??梢钥吹剑琍od即有利于進(jìn)程資源的隔離,又能獨(dú)立打包部署和維護(hù)。
?? ? ?通過(guò)Pod就可以把具備親和性的服務(wù)包裹一起,而互斥性的服務(wù)部署在不同Pod中,K8S通過(guò)對(duì)Pod的調(diào)度和編排,解決了上述容器無(wú)法實(shí)現(xiàn)的問(wèn)題。
- Pod是K8S中最核心,最基礎(chǔ)的概念
K8S的其他組件和概念,基本上都是直接或者間接圍繞Pod發(fā)展的。如下圖所示:
本章節(jié)我們先了解Pod的一些基本概念和操作,關(guān)于Pod高級(jí)特性我們放到后面章節(jié)。?
?二、YAML語(yǔ)言
? ? ?在了解Pod前,我們先看下YAML語(yǔ)言。在K8S的世界里,所有的對(duì)象都可以采用了YAML語(yǔ)言描述,YAML語(yǔ)言類(lèi)似于JSON,但是比JSON更加的清晰緊促,首先做個(gè)對(duì)比:
JSON的描述:
{
"students":
{
"boy":20,
"girl":22
}
}
YMAL的描述
Students:
boy: 20
girl: 22
可以看到,YAML是通過(guò)縮減和空白表示層次間的關(guān)系。YAML語(yǔ)言需要注意以下幾點(diǎn):
- 對(duì)象與值之間用":"隔開(kāi),冒號(hào)后面一定要帶上空格。
- 數(shù)組或者列表采用"-"開(kāi)頭,橫杠后面一定要帶上空格。
- 在一個(gè)文件中可以有多個(gè)YAML描述對(duì)象,使用"---"分割。
- 使用"#"描寫(xiě)注釋
具體的語(yǔ)法可以參見(jiàn)YAML官網(wǎng)
三、Pod的描述
? ? ? K8S采用YAML語(yǔ)言,聲明式的描述Pod對(duì)象。我們先看下較簡(jiǎn)單的Pod對(duì)象示例。
apiVersion: v1
kind: Pod
metadata:
name: busybox-pod
labels:
app: bash
spec:
containers:
- name: busybox
image: busybox
env:
- name: type
value: prod
- name: log
value: debug
command:
- "/bin/sh"
- "-c"
- "sleep 3000"
args:
- "$(type), $(log)"
? ? ?Pod對(duì)象有apiVersion,kind,metadata,spec四部分組成。apiVersion描述版本,kind描述類(lèi)型,對(duì)于Pod來(lái)說(shuō),固定為v1和Pod。
? ? ? metadata描述pod的元數(shù)據(jù),一般有name,以及l(fā)abels。name表示該P(yáng)od的名稱(chēng),labels是Pod的標(biāo)簽,可以有多個(gè),表示Pod的"歸類(lèi)",這個(gè)屬性很重要,后續(xù)的Pod的選擇都是依賴(lài)標(biāo)簽完成。
? ? spec是對(duì)Pod詳細(xì)定義,本篇我們重點(diǎn)了解containers,顧名思義,里面可以定義多個(gè)容器,容器重要的屬性如下:
- name,容器的名稱(chēng)。
- image,鏡像的名稱(chēng)。
- env,環(huán)境變量,可以配置運(yùn)行時(shí)的環(huán)境變量列表。
- command,容器啟動(dòng)時(shí),執(zhí)行的指令。
- args,command啟動(dòng)的入?yún)ⅰ?/li>
- ports,容器需要暴露的端口號(hào)列表。
Pod對(duì)象的屬性還有很多,在后續(xù)的介紹逐步了解。
四、Pod的操作
? ? ?kubectl是K8S的命令行工具(CLI),kubectl 提供了大量的命令,方便管理 Kubernetes 集群中的各種功能,下面我們使用kubectl操作Pod。
1、Pod的創(chuàng)建
使用kubectl apply -f <pod file>指令完成上述Pod的創(chuàng)建。
[root@k8s-master yaml]# kubectl apply -f busybox-pod.yaml
pod/busybox-pod created
? ? ? 注意:使用kubectl create也可以創(chuàng)建Pod對(duì)象,create是命令式的,而apply是聲明式的,其創(chuàng)建邏輯是,不存在則創(chuàng)建,存在則比較差異,進(jìn)行更新,一般推薦apply。
2、Pod的查看
pod創(chuàng)建完成后,可以使用kubectl get pod 指令查看所有pod的運(yùn)行情況。
[root@k8s-master yaml]# kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox-pod 1/1 Running 0 31m
?pod的name為我們定義的busybox,狀態(tài)status為Running。也可以加上"-o wide"看出更多的信息
[root@k8s-master yaml]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox-pod 1/1 Running 0 41m 10.244.36.75 k8s-node1 <none> <none>
該P(yáng)od運(yùn)行在k8s-node1節(jié)點(diǎn)上,其ip為10.244.36.75。
通過(guò) kubectl describe pod <podname>可以查看具體某個(gè)pod的詳情
[root@k8s-master yaml]# kubectl describe pod busybox-pod
Name: busybox-pod
Namespace: default
Priority: 0
Node: k8s-node1/10.0.0.4
Start Time: Sun, 13 Nov 2022 21:43:20 +0800
Labels: app=bash
Annotations: cni.projectcalico.org/containerID: 30d0f991395befa857f6c2814f625f66e008c308564941285c7cd434a5a3ab18
cni.projectcalico.org/podIP: 10.244.36.68/32
cni.projectcalico.org/podIPs: 10.244.36.68/32
Status: Running
IP: 10.244.36.75
IPs:
IP: 10.244.36.75
Containers:
busybox:
Container ID: docker://8b28fddf7104e31279f9dc1773630ee5cf4aef2a1d8311abe9dd0224ac2e0567
Image: busybox
Image ID: docker-pullable://busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Port: <none>
Host Port: <none>
Command:
/bin/sh
-c
sleep 3000
Args:
$(type), $(log)
State: Running
Started: Sun, 13 Nov 2022 22:33:54 +0800
Last State: Terminated
Reason: Completed
Exit Code: 0
Started: Sun, 13 Nov 2022 21:43:37 +0800
Finished: Sun, 13 Nov 2022 22:33:37 +0800
Ready: True
Restart Count: 1
Environment:
type: prod
log: debug
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-d5mwc (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
kube-api-access-d5mwc:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 58m default-scheduler Successfully assigned default/busybox-pod to k8s-node1
Normal Pulled 58m kubelet Successfully pulled image "busybox" in 16.819473827s
Normal Pulling 8m35s (x2 over 58m) kubelet Pulling image "busybox"
Normal Created 8m19s (x2 over 58m) kubelet Created container busybox
Normal Started 8m19s (x2 over 58m) kubelet Started container busybox
Normal Pulled 8m19s kubelet Successfully pulled image "busybox" in 15.486748688s
? ? ?詳情中包括了pod的信息,container信息,以及events事件信息。特別說(shuō)明的是,如果pod啟動(dòng)不成功,可以從event事件查看過(guò)程。
使用kubectl logs <podname>指令查看Pod的日志
[root@k8s-master yaml]# kubectl logs busybox-pod
3、進(jìn)入Pod
Pod運(yùn)行期間,可以通過(guò)命令kubectl exec -it <podname>?sh進(jìn)入到Pod內(nèi)部,執(zhí)行相關(guān)命令。
[root@k8s-master ~]# kubectl exec -it busybox-pod sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ifconfig
eth0 Link encap:Ethernet HWaddr D2:2C:E7:0F:4B:48
inet addr:10.244.36.75 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1480 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:446 (446.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
進(jìn)入pod的環(huán)境后,執(zhí)行ifconfig看下ip信息,該pod的ip與上面詳情中顯示的一致。
也可以使用kubectl exec -it <podname> -c <containername> sh進(jìn)入到某個(gè)容器內(nèi)部
[root@k8s-master ~]# kubectl exec -it busybox-pod -c busybox sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # ifconfig
eth0 Link encap:Ethernet HWaddr D2:2C:E7:0F:4B:48
inet addr:10.244.36.75 Bcast:0.0.0.0 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1480 Metric:1
RX packets:5 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:446 (446.0 B) TX bytes:0 (0.0 B)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
執(zhí)行ifconfig后看到到容器的ip和pod的ip是一致的。這個(gè)也就是我們后續(xù)要講的pod里所有的容器網(wǎng)絡(luò)是共享的。
4、Pod的刪除
使用kubectl delete pod <podname>命令刪除一個(gè)pod
[root@k8s-master ~]# kubectl delete pod busybox-pod
pod "busybox-pod" deleted
[root@k8s-master ~]# kubectl get pod
No resources found in default namespace.
在查詢(xún)列表為空,表示該pod已經(jīng)刪除
五、總結(jié)
? ? ? ? Pod是K8S最核心的概念,引入Pod的目的是為了解決存在親和性和互斥性復(fù)雜關(guān)系服務(wù)的調(diào)度和編排問(wèn)題。
? ? ? ?Pod采用YAML聲明式的對(duì)象描述,主要包括apiVersion,kind,metadata,spec四部分,其中spec中申明該P(yáng)od容器列表。
? 采用kubectl命令行工具,演示了對(duì)于Pod的創(chuàng)建,查看,修改,刪除等基本操作。
?附:
K8S初級(jí)入門(mén)系列之一-概述
K8S初級(jí)入門(mén)系列之二-集群搭建
K8S初級(jí)入門(mén)系列之三-Pod的基本概念和操作
K8S初級(jí)入門(mén)系列之四-Namespace/ConfigMap/Secret
K8S初級(jí)入門(mén)系列之五-Pod的高級(jí)特性
K8S初級(jí)入門(mén)系列之六-控制器(RC/RS/Deployment)
K8S初級(jí)入門(mén)系列之七-控制器(Job/CronJob/Daemonset)
K8S初級(jí)入門(mén)系列之八-網(wǎng)絡(luò)
K8S初級(jí)入門(mén)系列之九-共享存儲(chǔ)
K8S初級(jí)入門(mén)系列之十-控制器(StatefulSet)
K8S初級(jí)入門(mén)系列之十一-安全文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-607888.html
K8S初級(jí)入門(mén)系列之十二-計(jì)算資源管理文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-607888.html
到了這里,關(guān)于K8S初級(jí)入門(mén)系列之三-Pod的基本概念和操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!