k8s学习笔记-02(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。
- 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/manifests
1.2 静态Pod文件路径conf文件
1.找到kubelet 配置文件路径
systemctl status kubelet 命令输出结果中找到Drop-In行。
# systemctl status kubelet
默认情况下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'
如果该命令有输出表示有设置静态Pod路径。
如果yaml文件和conf文件均设置有静态Pod路径,以conf文件内容为准。
1.3 修改静态Pod路径
一般情况下不建议更改静态Pod路径,如果需要修改,需要保证新的静态Pod路径中有etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml 四个文件。
1.3.1 通过config文件修改静态Pod路径
# systemctl status kebelet
--config= 后面的文件路径,默认为/var/lib/kubelet/config.yaml
# vim /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests
在config.yaml中修改staticPodPath后的值,红色字体部分。
# systemctl restart kubelet
1.3.2 通过kubelet.service.d修改静态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.重启服务
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 describe pod/pod1 -n kube-system
查看在kube-system命名空间中pod1名字的pod信息。
Pod运行日志查看
kubectl logs 命令可以查看到Pod中容器运行的日志,多个容器存在与同一个pod时需要使用-c命令指定查看哪个一个容器的运行日志。
# #多容器Pod查看指定容器运行日志 # kubectl logs pod1 -c c1 # #单容器Pod查看就不需要加-c参数 # kubectl logs pod1
2.2.3 在Pod中执行命令
Pod中至少运行一个容器,可以像Docker一样进入到Pod中运行的容器中执行命令。在1.17及更高的版本上需要在执行的命令前需要加上 -- 。
Pod直接执行命令
不进入Pod中的容器进行命令执行。
# kubectl exec -it pod_name -n namespace_name -c container_name -- (需要执行的命令)
# 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 cp file_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 pod pod_name -n namespace_name 标签名=标签值 #设置指定命名空间中的指定pod的标签
# kubectl label pod --all -n namespace_name 标签名=标签值 #为指定命令空间中的所有Pod添加标签
# kubectl label pod --all -A 标签名=标签值 #为当前环境下所有命名空间中所有Pod添加标签 # #例子 # kubectl label pod pod1 aa=98
# 确认标签设置成功
# kubectl get pod -A --show-labels
删除标签
# kubectl label pod pod_name -n namespace_name 标签名- #去除掉指定命名空间中的指定Pod的指定标签
# kubectl label pod --all -n namespace_name 标签名- #去除掉指定命名空间中所有Pod中的指定标签
# 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 edit pod pod_name -n namespace_name