原創(chuàng)文檔編寫不易,未經(jīng)許可請(qǐng)勿轉(zhuǎn)載。文檔中有疑問(wèn)的可以郵件聯(lián)系我。 郵箱:yinwanit@163.com
概念
k8s中不能直接對(duì)容器進(jìn)行管理,k8s中最小得的理單元即Pod。
Pod分為靜態(tài)POD和動(dòng)態(tài)POD,靜態(tài)Pod不通過(guò)kubelet管理。
同一個(gè)pod內(nèi)共享同一個(gè)網(wǎng)絡(luò)命名空間,IP地址等信息沒(méi)有配置在具體功能性容器上。
Pod在k8s中歸屬apiVersion版本為v1。在編寫yaml文件中apiVersion應(yīng)該設(shè)置為v1。kind才能設(shè)置成Pod。
在k8s中由兩種創(chuàng)建pod的方式,一種是通過(guò)kubectl run命令;一種是編寫yaml文件,使用kubectl? apply -f xxx.yaml? ?命令用來(lái)創(chuàng)建pod
一、靜態(tài)Pod
靜態(tài)Pod是由kubelet進(jìn)程直接維護(hù)管理,在k8s中用來(lái)構(gòu)建k8s的環(huán)境,如etcd、kube-apiserver、kube-controller-manager、kube-scheduler。靜態(tài)Pod不是通過(guò)Master節(jié)點(diǎn)上的apiserver管理。
默認(rèn)情況下只有Master上會(huì)有靜態(tài)Pod存在。
靜態(tài)Pod yaml文件存放在特定的文件夾內(nèi),只要該文件中存在的yaml文件,kubelet都會(huì)自動(dòng)按照yaml文件內(nèi)容創(chuàng)建出Pod。
- yaml文件:kubelet服務(wù)的config配置文件文件即默認(rèn)的 /var/lib/kubelet/config.yaml;使用systemctl status kubelet 查看--config字段
- conf文件:/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 文件內(nèi)修改。使用 systemctl status kubelet 查看Drop-In行
1.1 靜態(tài)Pod文件路徑y(tǒng)aml文件
1.找到kubelet 配置文件路徑
systemctl status kubelet 命令輸出結(jié)果中找到?--config= 后面的文件路徑。
# systemctl status kubelet
默認(rèn)情況下kubectl配置文件為 /var/lib/kubelet/config.yaml
2.找到靜態(tài)Pod路徑
在/var/lib/kubelet/config.yaml文件中過(guò)濾出 staticPodPath行截取第二列即為靜態(tài)Pod路徑。
# grep -i 'staticPodPath:' /var/lib/kubelet/config.yaml | awk '{print $2}'
默認(rèn)情況下靜態(tài)路徑在?/etc/kubernetes/manifests 文件夾下。
3.確認(rèn)文件夾內(nèi)容
默認(rèn)情況下靜態(tài)文件夾內(nèi)至少包含etcd.yaml? kube-apiserver.yaml? kube-controller-manager.yaml? kube-scheduler.yaml 四個(gè)文件。
# ls -l /etc/kubernetes/manifests
1.2?靜態(tài)Pod文件路徑conf文件
1.找到kubelet 配置文件路徑
systemctl status kubelet 命令輸出結(jié)果中找到Drop-In行。
# systemctl status kubelet
默認(rèn)情況下kubectl配置文件為?/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
2.確認(rèn)是否有配置靜態(tài)Pod路徑
在/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 配置文件中查看是否有--pod-manifest-path配置。
# cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf | grep -i 'pod-manifest-path'
?如果該命令有輸出表示有設(shè)置靜態(tài)Pod路徑。
如果yaml文件和conf文件均設(shè)置有靜態(tài)Pod路徑,以conf文件內(nèi)容為準(zhǔn)。
?
1.3 修改靜態(tài)Pod路徑
一般情況下不建議更改靜態(tài)Pod路徑,如果需要修改,需要保證新的靜態(tài)Pod路徑中有etcd.yaml? kube-apiserver.yaml? kube-controller-manager.yaml? kube-scheduler.yaml 四個(gè)文件。
1.3.1 通過(guò)config文件修改靜態(tài)Pod路徑
# systemctl status kebelet
?--config= 后面的文件路徑,默認(rèn)為/var/lib/kubelet/config.yaml
# vim /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests
在config.yaml中修改staticPodPath后的值,紅色字體部分。
# systemctl restart kubelet
1.3.2 通過(guò)kubelet.service.d修改靜態(tài)Pod路徑
# systemctl status kubelet
?2.修改配置文件
# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf # Note: This dropin only works with kubeadm and kubelet v1.11+ [Service] Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/static_pod" Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. EnvironmentFile=-/etc/sysconfig/kubelet ExecStart= ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
3.重啟服務(wù)
kubelet服務(wù)配置文件更改過(guò)后需要重啟服務(wù)。
# systemctl daemon-reload
# systemctl restart kubelet
?
二、常用命令
在k8s中由兩種創(chuàng)建pod的方式,一種是通過(guò)kubectl run命令;一種是編寫yaml文件,使用kubectl? apply -f xxx.yaml? ?命令用來(lái)創(chuàng)建pod
kubectl run pod_name --image
2.1 創(chuàng)建Pod命令(非yaml文件)
使用kubectl run命令行創(chuàng)建一個(gè)pod時(shí),至少要指定Pod中運(yùn)行的容器鏡像、Pod的名字。
# ?kubectl run test_name_pod --image=nginx? --image-pull-policy=IfNotPresent --restart=Always --namespace=kube-system --labels=aa=12? --dry-run=client -o yaml
?命令詳解
- --image(必選):指明當(dāng)前Pod中運(yùn)行容器的鏡像。
- --image-pull-policy(可選):指明當(dāng)前Pod中鏡像拉取規(guī)則,有三個(gè)選項(xiàng):默認(rèn)為Always,Always總是去互聯(lián)網(wǎng)拉取鏡像,本地存在也會(huì)去互聯(lián)網(wǎng)拉?。籌fNotPresent優(yōu)先使用本地的鏡像,如果本地有鏡像則使用本地鏡像,本地沒(méi)有鏡像則去互聯(lián)網(wǎng)拉取;Never只使用本地鏡像。
- --restart:Pod重啟規(guī)則,有三個(gè)選項(xiàng):默認(rèn)為Always,Always總是重啟,不管是容器創(chuàng)建失敗還是容器出錯(cuò)都執(zhí)行重啟容器操作;OnFailure只在容器失敗產(chǎn)生故障時(shí)重啟;Never從來(lái)不重啟。
- --namespace:Pod歸屬于哪個(gè)命名空間,默認(rèn)為當(dāng)前命名空間,可通過(guò)命令??kubectl config get-contexts? 查看當(dāng)前命名空間。
- --labels:設(shè)置Pod的標(biāo)簽,默認(rèn)標(biāo)簽為 “run: Pod名”
- --dry-run:以調(diào)試方式運(yùn)行,不真實(shí)創(chuàng)建出Pod,只檢查Pod語(yǔ)法是否有問(wèn)題。兩個(gè)選項(xiàng):默認(rèn)為server,server輸出完整的配置數(shù)據(jù);client輸出基本的配置數(shù)據(jù)。
- -o yaml:表示以yaml的格式輸出pod的配置信息,需要和--dry-run搭配使用。
- 實(shí)際需要使用kubectl run命令直接創(chuàng)建Pod時(shí),需要去除掉--dry-run和 -o yaml選項(xiàng)。
2.2 查看Pod
Pod在創(chuàng)建后,需要查看Pod的狀態(tài)和信息,確保Pod運(yùn)行正常。
2.2.1 Pod狀態(tài)查看
查看kube-system命名空間里面所有pod的信息。
# kubectl get pod --show-labels -o wide -n kube-system
查看所有命名空間里面的pod信息
# kubectl get pod -A --show-labels -o wide
參數(shù)詳解:
- --show-labels:展示Pod的標(biāo)簽,k8s中是依靠標(biāo)簽進(jìn)行資源與資源進(jìn)行綁定的。
- -o wide:展示顯示的信息,可以看到pod運(yùn)行在哪個(gè)節(jié)點(diǎn)上。
- -n:指定查看哪個(gè)命名空間里面的數(shù)據(jù),默認(rèn)為當(dāng)前命名空間,可用 kebectl config get-contexts 命令查看當(dāng)前在哪個(gè)命名空間下,可用 kubectl get ns查看當(dāng)前有多少個(gè)命名空間。
- -A:展示所有命名空間,-n和-A不能同時(shí)使用。
Pod狀態(tài)說(shuō)明:
- Pengding Pod 因?yàn)槠渌驅(qū)е聀od準(zhǔn)備開(kāi)始創(chuàng)建,卡住了還沒(méi)有創(chuàng)建,一般存在與沒(méi)有節(jié)點(diǎn)可以調(diào)度
- Runing Pod 中容器工作正常。
- Conmpleted Pod里面的容器正常退出
- CrashLoopBackOff 創(chuàng)建的時(shí)候出錯(cuò)
- ImagePullBackoff 創(chuàng)建Pod時(shí),拉取鏡像下載失敗。
2.2.2 Pod狀態(tài)信息查看
查看Pod的屬性信息包括IP地址、包含的容器信息、歸屬的節(jié)點(diǎn)信息,當(dāng)Pod創(chuàng)建時(shí)可以通過(guò)kubectl describe 命令查看到Pod創(chuàng)建的過(guò)程。
# kubectl describe pod/pod1 -n kube-system
查看在kube-system命名空間中pod1名字的pod信息。
Pod運(yùn)行日志查看
kubectl logs 命令可以查看到Pod中容器運(yùn)行的日志,多個(gè)容器存在與同一個(gè)pod時(shí)需要使用-c命令指定查看哪個(gè)一個(gè)容器的運(yùn)行日志。
# #多容器Pod查看指定容器運(yùn)行日志 # kubectl logs pod1 -c c1 # #單容器Pod查看就不需要加-c參數(shù) # kubectl logs pod1
2.2.3 在Pod中執(zhí)行命令
?Pod中至少運(yùn)行一個(gè)容器,可以像Docker一樣進(jìn)入到Pod中運(yùn)行的容器中執(zhí)行命令。在1.17及更高的版本上需要在執(zhí)行的命令前需要加上 -- 。
Pod直接執(zhí)行命令
不進(jìn)入Pod中的容器進(jìn)行命令執(zhí)行。
# kubectl exec -it pod_name -n namespace_name -c container_name -- (需要執(zhí)行的命令)
# kubectl exec -it pod1 -n kube-system -c c1 -- ls /tmp
?進(jìn)入到Pod中
使用bash命令可以進(jìn)入Pod打開(kāi)Pod中容器的bash終端界面。
# kubectl exec -it pod_name -n namespace_name -c container_name -- bash
操作完成過(guò)后使用快捷鍵“ CTRL + D ”退出Pod里面的容器。
拷貝文件到Pod容器中
本地主機(jī)文件到Pod的容器中。
# kubectl cp file_name pod_name:/dir/ -c container_name
拷貝Pod容器中的文件到主機(jī)中。
# kubectl cp pod_name:/dir/ file_name -c container_name
當(dāng)Pod中有多個(gè)容器時(shí)需要使用 -c 參數(shù)指定操作哪個(gè)容器。只有一個(gè)容器時(shí)可以不用指定。
2.3 配置修改Pod
2.3.1 設(shè)置label?
k8s中各個(gè)資源使用label進(jìn)行互相關(guān)聯(lián)。
查看Pod的標(biāo)簽
?kubectl get pod -A 加上 --show-labels參數(shù)可以查看當(dāng)前環(huán)境下所有資源的標(biāo)簽信息。
# kubectl get pod -A --show-labels
添加標(biāo)簽
為名為pod1的Pod添加一個(gè)aa=98的標(biāo)簽。
# kubectl label pod pod_name -n namespace_name 標(biāo)簽名=標(biāo)簽值 #設(shè)置指定命名空間中的指定pod的標(biāo)簽
# kubectl label? pod --all -n namespace_name 標(biāo)簽名=標(biāo)簽值 #為指定命令空間中的所有Pod添加標(biāo)簽
# kubectl label? pod --all -A 標(biāo)簽名=標(biāo)簽值 #為當(dāng)前環(huán)境下所有命名空間中所有Pod添加標(biāo)簽 # #例子 # kubectl label pod pod1 aa=98
# 確認(rèn)標(biāo)簽設(shè)置成功
# kubectl get pod -A --show-labels
刪除標(biāo)簽
# kubectl label pod pod_name -n namespace_name 標(biāo)簽名- #去除掉指定命名空間中的指定Pod的指定標(biāo)簽
# kubectl label pod --all -n namespace_name 標(biāo)簽名- #去除掉指定命名空間中所有Pod中的指定標(biāo)簽
# kubectl label pod -all -A 標(biāo)簽名- #去除掉所有命名空間的中的所有Pod的制定標(biāo)簽名
?2.3.2 重啟Pod
K8s中不能直接對(duì)Pod進(jìn)行重啟, Pod重啟可以通過(guò)導(dǎo)出配置文件然后再使用生成的配置文件進(jìn)行Pod創(chuàng)建。
# kubectl get pod pod_name -n namespace_name -o yaml > file_name1.yaml && kubectl delete pod pod_name -n namespace_name --force && kubectl apply -f file_name1.yaml && rm -rf file_name1.yaml
紅色字體部分按照實(shí)際情況填寫,如果Pod資源在同一個(gè)namespace內(nèi),-n 選項(xiàng)可以省略。--force表示立即刪除。
命令詳解:
- kubectl get pod pod_name -n namespace_name -o yaml > tmp_restart_pod01.yaml:以yaml格式導(dǎo)出指定命名空間中指定Pod的配置文件到自定義名字的yaml文件中
- kubectl delete pod pod_name -n namespace_name --force:刪除指定命名空間中的指定pod
- kubectl apply -f file_name.yaml: 使用導(dǎo)出的yaml文件新建一個(gè)Pod
- rm -rf file_name.yaml:刪除零時(shí)創(chuàng)建的yaml文件
?2.3.3 修改Pod配置
Pod修改有兩種方式。
- 重啟Pod類似,通過(guò)導(dǎo)出的Pod yaml文件修改了參數(shù)過(guò)后,刪除原有Pod再使用導(dǎo)出的yaml文件進(jìn)行創(chuàng)建,第一種不累述參考1.3.2重啟Pod章節(jié)。
- 直接使用命令在線修改Pod配置,一般container對(duì)象內(nèi)的配置在線修改了也無(wú)效。
命令修改Pod文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-630862.html
可以自己嘗試修改一下label試試,edit進(jìn)去過(guò)后就是就是一個(gè)vim文本編輯器,修改完成按照vim的方式退出即可。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-630862.html
# kubectl edit pod pod_name -n namespace_name
到了這里,關(guān)于k8s學(xué)習(xí)筆記-02(Pod基礎(chǔ)知識(shí))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!