王國慶 发表于 2023-8-7 11:19:28

k8s学习笔记-2(Pod基础知识)

原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。 邮箱:yinwanit@163.com
概念

k8s中不能直接对容器进行管理,k8s中最小得的理单元即Pod。
Pod分为静态POD和动态POD,静态Pod不通过kubelet管理。
同一个pod内共享同一个网络命名空间,IP地址等信息没有配置在具体功能性容器上。
Pod在k8s中归属apiVersion版本为v1。在编写yaml文件中apiVersion应该设置为v1。kind才能设置成Pod。
在k8s中由两种创建pod的方式,一种是通过kubectl run命令;一种是编写yaml文件,使用kubectl  apply -f xxx.yaml   命令用来创建pod
一、静态Pod

静态Pod是由kubelet进程直接维护管理,在k8s中用来构建k8s的环境,如etcd、kube-apiserver、kube-controller-manager、kube-scheduler。静态Pod不是通过Master节点上的apiserver管理。
默认情况下只有Master上会有静态Pod存在。
静态Pod yaml文件存放在特定的文件夹内,只要该文件中存在的yaml文件,kubelet都会自动按照yaml文件内容创建出Pod。
静态Pod路径主要由两个文件控制,一个是服务的yaml文件,一个是服务程序的conf文件,如果两个文件都设置了静态Pod路径,以服务程序config文件为准。

[*]yaml文件:kubelet服务的config配置文件文件即默认的 /var/lib/kubelet/config.yaml;使用systemctl status kubelet 查看--config字段
[*]conf文件:/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 文件内修改。使用 systemctl status kubelet 查看Drop-In行
1.1 静态Pod文件路径yaml文件

1.找到kubelet 配置文件路径
systemctl status kubelet 命令输出结果中找到 --config= 后面的文件路径。
# systemctl status kubelet默认情况下kubectl配置文件为 /var/lib/kubelet/config.yaml
2.找到静态Pod路径
在/var/lib/kubelet/config.yaml文件中过滤出 staticPodPath行截取第二列即为静态Pod路径。
# grep -i 'staticPodPath:'/var/lib/kubelet/config.yaml| awk'{print $2}'默认情况下静态路径在 /etc/kubernetes/manifests 文件夹下。
3.确认文件夹内容
默认情况下静态文件夹内至少包含etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml 四个文件。
# ls -l /etc/kubernetes/manifests1.2 静态Pod文件路径conf文件

1.找到kubelet 配置文件路径
systemctl status kubelet 命令输出结果中找到Drop-In行。
# systemctl status kubelethttps://img2023.cnblogs.com/blog/2062633/202308/2062633-20230805191657205-1383163923.png
默认情况下kubectl配置文件为 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
2.确认是否有配置静态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'https://img2023.cnblogs.com/blog/2062633/202308/2062633-20230805191950080-104817252.png
 如果该命令有输出表示有设置静态Pod路径。
如果yaml文件和conf文件均设置有静态Pod路径,以conf文件内容为准。
https://img2023.cnblogs.com/blog/2062633/202308/2062633-20230805192154318-1735147832.png
 
1.3 修改静态Pod路径

一般情况下不建议更改静态Pod路径,如果需要修改,需要保证新的静态Pod路径中有etcd.yaml  kube-apiserver.yaml  kube-controller-manager.yaml  kube-scheduler.yaml 四个文件。
1.3.1 通过config文件修改静态Pod路径

 1.查看config配置文件路径# systemctl status kebelet --config= 后面的文件路径,默认为/var/lib/kubelet/config.yaml
2.修改config文件# vim /var/lib/kubelet/config.yaml<br>staticPodPath: /etc/kubernetes/manifests在config.yaml中修改staticPodPath后的值,红色字体部分。
 3.重启服务修改了/var/lib/kubelet/config.yaml文件过后需要重启kubelet服务器后生效。# systemctl restart kubelet 1.3.2 通过kubelet.service.d修改静态Pod路径

 1.查看Kubelet.service.d文件地址在输出结果中找到Drop-In行,默认路径为 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf# systemctl status kubelethttps://img2023.cnblogs.com/blog/2062633/202308/2062633-20230805185927409-105155037.png
 2.修改配置文件
 在/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 文件中在第一个Environment=最后添加--pod-manifest-path=/dir/dir/ ,红色字体部分为添加内容。# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
# Note: This dropin only works with kubeadm and kubelet v1.11+

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_ARGS3.重启服务
kubelet服务配置文件更改过后需要重启服务。
# systemctl daemon-reload
# systemctl restart kubelet 
二、常用命令

在k8s中由两种创建pod的方式,一种是通过kubectl run命令;一种是编写yaml文件,使用kubectl  apply -f xxx.yaml   命令用来创建pod
kubectl run pod_name --image
2.1 创建Pod命令(非yaml文件)

使用kubectl run命令行创建一个pod时,至少要指定Pod中运行的容器镜像、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(必选):指明当前Pod中运行容器的镜像。
[*]--image-pull-policy(可选):指明当前Pod中镜像拉取规则,有三个选项:默认为Always,Always总是去互联网拉取镜像,本地存在也会去互联网拉取;IfNotPresent优先使用本地的镜像,如果本地有镜像则使用本地镜像,本地没有镜像则去互联网拉取;Never只使用本地镜像。
[*]--restart:Pod重启规则,有三个选项:默认为Always,Always总是重启,不管是容器创建失败还是容器出错都执行重启容器操作;OnFailure只在容器失败产生故障时重启;Never从来不重启。
[*]--namespace:Pod归属于哪个命名空间,默认为当前命名空间,可通过命令  kubectl config get-contexts  查看当前命名空间。
[*]--labels:设置Pod的标签,默认标签为 “run: Pod名”
[*]--dry-run:以调试方式运行,不真实创建出Pod,只检查Pod语法是否有问题。两个选项:默认为server,server输出完整的配置数据;client输出基本的配置数据。
[*]-o yaml:表示以yaml的格式输出pod的配置信息,需要和--dry-run搭配使用。
[*]实际需要使用kubectl run命令直接创建Pod时,需要去除掉--dry-run和 -o yaml选项。
2.2 查看Pod

Pod在创建后,需要查看Pod的状态和信息,确保Pod运行正常。
2.2.1 Pod状态查看

查看kube-system命名空间里面所有pod的信息。
# kubectl get pod --show-labels-o wide -n kube-system查看所有命名空间里面的pod信息
# kubectl get pod -A --show-labels -o wide参数详解:

[*]--show-labels:展示Pod的标签,k8s中是依靠标签进行资源与资源进行绑定的。
[*]-o wide:展示显示的信息,可以看到pod运行在哪个节点上。
[*]-n:指定查看哪个命名空间里面的数据,默认为当前命名空间,可用 kebectl config get-contexts 命令查看当前在哪个命名空间下,可用 kubectl get ns查看当前有多少个命名空间。
[*]-A:展示所有命名空间,-n和-A不能同时使用。
Pod状态说明:

[*]Pengding Pod 因为其他原因导致pod准备开始创建,卡住了还没有创建,一般存在与没有节点可以调度
[*]Runing Pod 中容器工作正常。
[*]Conmpleted Pod里面的容器正常退出
[*]CrashLoopBackOff 创建的时候出错
[*]ImagePullBackoff 创建Pod时,拉取镜像下载失败。
2.2.2 Pod状态信息查看

查看Pod的属性信息包括IP地址、包含的容器信息、归属的节点信息,当Pod创建时可以通过kubectl describe 命令查看到Pod创建的过程。
# kubectl describepod/pod1-n kube-system 查看在kube-system命名空间中pod1名字的pod信息。
Pod运行日志查看
kubectl logs 命令可以查看到Pod中容器运行的日志,多个容器存在与同一个pod时需要使用-c命令指定查看哪个一个容器的运行日志。
# #多容器Pod查看指定容器运行日志
# kubectl logs pod1 -c c1
# #单容器Pod查看就不需要加-c参数
# kubectl logs pod12.2.3 在Pod中执行命令

 Pod中至少运行一个容器,可以像Docker一样进入到Pod中运行的容器中执行命令。在1.17及更高的版本上需要在执行的命令前需要加上 -- 。
Pod直接执行命令
不进入Pod中的容器进行命令执行。
# kubectl exec -it pod_name -n namespace_name-c container_name -- (需要执行的命令)<br># kubectl exec -it pod1 -n kube-system -c c1-- ls /tmp 进入到Pod中
使用bash命令可以进入Pod打开Pod中容器的bash终端界面。
#kubectl exec -it pod_name-n namespace_name -c container_name -- bash操作完成过后使用快捷键“ CTRL + D ”退出Pod里面的容器。
拷贝文件到Pod容器中
本地主机文件到Pod的容器中。
# kubectl cpfile_name   pod_name:/dir/-c container_name拷贝Pod容器中的文件到主机中。
# kubectl cp   pod_name:/dir/file_name -c container_name当Pod中有多个容器时需要使用 -c 参数指定操作哪个容器。只有一个容器时可以不用指定。
2.3 配置修改Pod

2.3.1 设置label 

k8s中各个资源使用label进行互相关联。
查看Pod的标签
 kubectl get pod -A 加上 --show-labels参数可以查看当前环境下所有资源的标签信息。
# kubectl get pod -A --show-labels添加标签
为名为pod1的Pod添加一个aa=98的标签。
# kubectl label podpod_name -n namespace_name   标签名=标签值    #设置指定命名空间中的指定pod的标签<br># kubectl label  pod --all -n namespace_name 标签名=标签值         #为指定命令空间中的所有Pod添加标签<br># kubectl label  pod --all -A 标签名=标签值                        #为当前环境下所有命名空间中所有Pod添加标签
# #例子
# kubectl label pod pod1 aa=98<br># 确认标签设置成功<br># kubectl get pod -A --show-labels删除标签
# kubectl label pod pod_name -n namespace_name 标签名-   #去除掉指定命名空间中的指定Pod的指定标签<br># kubectl label pod --all -n namespace_name 标签名-      #去除掉指定命名空间中所有Pod中的指定标签<br># kubectl label pod -all -A标签名-                     #去除掉所有命名空间的中的所有Pod的制定标签名 2.3.2 重启Pod

K8s中不能直接对Pod进行重启, Pod重启可以通过导出配置文件然后再使用生成的配置文件进行Pod创建。
# 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红色字体部分按照实际情况填写,如果Pod资源在同一个namespace内,-n 选项可以省略。--force表示立即删除。
命令详解:

[*]kubectl get pod pod_name -n namespace_name -o yaml > tmp_restart_pod01.yaml:以yaml格式导出指定命名空间中指定Pod的配置文件到自定义名字的yaml文件中
[*]kubectl delete pod pod_name -n namespace_name --force:删除指定命名空间中的指定pod
[*]kubectl apply -f file_name.yaml: 使用导出的yaml文件新建一个Pod
[*]rm -rf file_name.yaml:删除零时创建的yaml文件
 2.3.3 修改Pod配置

Pod修改有两种方式。

[*]重启Pod类似,通过导出的Pod yaml文件修改了参数过后,删除原有Pod再使用导出的yaml文件进行创建,第一种不累述参考1.3.2重启Pod章节。
[*]直接使用命令在线修改Pod配置,一般container对象内的配置在线修改了也无效。
命令修改Pod
可以自己尝试修改一下label试试,edit进去过后就是就是一个vim文本编辑器,修改完成按照vim的方式退出即可。
# kubectl editpod pod_name -n namespace_name
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: k8s学习笔记-2(Pod基础知识)