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。

静态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/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路径

 1.查看config配置文件路径
# systemctl status kebelet

 --config= 后面的文件路径,默认为/var/lib/kubelet/config.yaml

2.修改config文件
# vim /var/lib/kubelet/config.yaml
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 kubelet

 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+
[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
posted @ 2023-08-04 10:44  飞翔的小胖猪  阅读(255)  评论(0编辑  收藏  举报