一、标签管理

1.标签在k8s中极其重要,大多数资源的相互关联就需要使用标签;也就是说,资源的相互关联大多数时候,是使用标签进行关联的;
2.其他作用,在k8s集群中,node节点的一些操作比如污点及污点容忍等,都需要使用到标签;

查看标签

[root@k8s1 pod]# kubectl get pod --show-labels
 NAME            READY   STATUS    RESTARTS   AGE    LABELS
 my-pod-hpm      1/1     Running   0          40m    <none>
 pod-env         1/1     Running   0          22m    <none>
 pod-hnw         1/1     Running   0          64m    <none>
 volumes-nfs01   1/1     Running   0          3h2m   <none>
 volumes-nfs02   1/1     Running   0          3h2m   <none>

创建标签-声明式

# 创建资源清单

[root@k8s1 pod]# vi pod-labels.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: m-nginx
  #给资源添加标签
  labels:
    name: "oslee"
    age: "18"
spec:
  containers:
    - name: c-nginx
      image: nginx:1.20.1-alpine
[root@k8s1 pod]# kubectl apply -f pod-labels.yaml 
 pod/m-nginx created# 查看标签
[root@k8s1 pod]# kubectl get pod --show-labels 
 NAME            READY   STATUS    RESTARTS   AGE     LABELS
 m-nginx         1/1     Running   0          34m     age=18,name=oslee

创建标签-响应式

[root@k8s1 pod]# kubectl label pod m-nginx addr=beijing
 pod/m-nginx labeled
 [root@k8s1 pod]# kubectl get pod --show-labels 
 NAME            READY   STATUS    RESTARTS   AGE     LABELS
 m-nginx         1/1     Running   0          36m     addr=beijing,age=18,name=oslee

删除标签

[

root@k8s1 pod]# kubectl label pod m-nginx addr-
 pod/m-nginx unlabeled
 [root@k8s1 pod]# kubectl get pod --show-labels 
 NAME            READY   STATUS    RESTARTS   AGE     LABELS
 m-nginx         1/1     Running   0          37m     age=18,name=oslee

修改标签

[root@k8s1 pod]# kubectl label pod m-nginx age=19 --overwrite
 pod/m-nginx labeled
 [root@k8s1 pod]# kubectl get pod --show-labels 
 NAME      READY   STATUS    RESTARTS   AGE   LABELS
 m-nginx   1/1     Running   0          82s   age=19,name=oslee

通过标签删除pod

# 通过标签删除pod
[root@k8s1 pod]# kubectl delete pod -l age=19
 pod "m-nginx" deleted
  # 删除全部标签
[root@k8s1 pod]# kubectl delete pods --all

二、pod的镜像拉取策略

IfNotPresent

只有当镜像在本地不存在时才会拉取。(先对本地进行排查,本地有该镜像直接使用,本地没有该镜像则选择在仓库中拉取)

Always

总是从仓库拉取镜像,无论本地是否存在镜像(即使本地中存在我们所指定的相关镜像,该策略也会先从仓库中拉取进行应用)

Never

Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。(如果本地不存在,并不会在仓库中拉取,直接报错)

[root@k8s1 pod]# vi pod-ipp.yaml

apiVersion: v1
kind: Pod
metadata:
  name: labels-pod
  labels:
    name: "oslee"
    age: "19"
spec:
  containers:
  - image: nginx:1.20.1-alpine
    name: nginx
    # 设置镜像拉取策略
    imagePullPolicy: IfNotPresent

[root@k8s1 pod]# kubectl apply -f pod-ipp.yaml 
pod/labels-pod created

三、pod中容器的重启策略

当pod中容器退出时,是否需要重新创建容器?

1,Always(默认值):当容器退出时(不论什么原因),自动拉起新的容器;

2,Never:当容器退出时(不论什么原因),都不会重新创建拉起新的容器;

3,OnFailure:当容器“意外退出”时,才会拉起新的容器;

[root@k8s1 pod]# vi pod-rp.yaml

apiVersion: v1
kind: Pod
metadata:
  name: labels-pod
  labels:
    name: oslee
spec:
  #设置容器重启策略
  restartPolicy: Always
  containers:
  - image: nginx:1.20.1-alpine
    name: nginx

[root@k8s1 pod]# kubectl apply -f pod-rp.yaml 
pod/labels-pod configured

四、pod的优雅终止

在pod的删除时,系统会自动延迟30s,为了给pod处理未处理完的请求;

vi pod-nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  name: m-nginx
  labels:
    name: oslee
spec:
  #pod优雅终止字段,定义延时kill信号的时间,给pod处理未完成的请求时间;
  #缓期多少秒时间执行;若不设置,默认是30s;
  terminationGracePeriodSeconds: 3
  containers:
    - name: c-nginx
      image: nginx:1.20.1-alpine
      #定义容器的生命周期(容器启动做什么动作,容器停止前做什么动作)
      lifecycle:
        #容器启动前做什么
        postStart:
          exec:
            command:
            - "sh"
            - "-c"
            - "echo \"postStart at $(date +%F_%T)\" >> /poststart.log "
        #容器停止前做什么
        preStop:
          exec:
            command:
            - "sh"
            - "-c"
            - "echo \"prestop at $(date +%F_%T)\" >> /prestop.log"

[root@k8s1 pod]# kubectl apply -f pod-nginx.yaml 
pod/m-nginx created
[root@k8s1 pod]# kubectl exec m-nginx -it -- sh
/ # cat poststart.log
postStart at 2024-04-06_09:34:43

五、pod中容器的资源限制

[root@k8s1 pod]# vi pod-resources.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-res
spec:
  nodeName: k8s2
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    #设置资源限制
    resources:
      #最大资源的使用限制;最多就能用这么多的资源;
      limits:
        #2核心;
        cpu: 2000m
        #限制内存
        memory: 40M
      #期望资源限制;需要宿主机预留的资源,我可以不用,但是你必须要有;
      requests:
        #1核心
        cpu: 1000m
        #限制内存
        memory: 20M

[root@k8s1 pod]# kubectl apply -f pod-resources.yaml 
pod/pod-res created

# 查看资源限制,资源清单指定部署在节点k8s2上

[root@k8s2 ~]# docker stats | grep c1

k8s无法从registry拉取镜像ErrImagePull k8s拉取镜像命令_Pod

六、pod的容器类型

k8s无法从registry拉取镜像ErrImagePull k8s拉取镜像命令_Pod_02

01-基础架构容器【pause】:运行pod中的容器时,提供容器的网络名称空间

02-初始化容器【initContainers】:

  • 完成一些业务容器运行前的操作,如执行命令,如果初始化容器没有创建成功,将一直重启,业务容器也就无法创建出来;
  • 它可以延后业务容器的启动时间;

基础架构容器pause

查看基础架构容器

[root@k8s2 data]# docker container ps | grep pause

k8s无法从registry拉取镜像ErrImagePull k8s拉取镜像命令_kubernetes_03

初始化容器initContainers

[root@k8s1 pod]# vi pod-init-c.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-init-c
spec:
  #声明初始化容器
  initContainers:
  - name: init-c1
    image: alpine
    #在初始化容器中执行命令
    command: 
    - "sleep"
    - "10"
  - name: init-c2
    image: alpine
    command:
    - "sleep"
    - "5"
  #业务容器
  containers:
  - name: c1
    image: alpine
    #给容器一个标准输入,也就是守护进程
    stdin: true

# 创建资源

[root@k8s1 pod]# kubectl apply -f pod-init-c.yaml 
pod/pod-init-c created

# 查看描述

[root@k8s1 pod]# kubectl describe pod/pod-init-c

k8s无法从registry拉取镜像ErrImagePull k8s拉取镜像命令_kubernetes_04

七、pod中容器的守护进程

创建资源清单,拉取alpine最小linux系统

[root@k8s1 pod]# vi pod-alpine.yaml

apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine:3.19.1
[root@k8s1 pod]# kubectl apply -f pod-alpine.yaml 
 pod/m-alpine created [root@k8s1 pod]# kubectl get pod

查看pod资源,发现,启动后会结束,因为没有守护进程

k8s无法从registry拉取镜像ErrImagePull k8s拉取镜像命令_docker_05

守护进程,加入标准输入stdin

 [root@k8s1 pod]# vi pod-alpine.yaml

apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine:3.19.1
      stdin: true
[root@k8s1 pod]# kubectl delete -f pod-alpine.yaml
 pod "m-alpine" deleted
 [root@k8s1 pod]# kubectl apply -f pod-alpine.yaml
 pod/m-alpine created[root@k8s1 pod]# kubectl get pod
 NAME       READY   STATUS    RESTARTS   AGE
 m-alpine   1/1     Running   0          48s

守护进程,命令方式

· command

apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine:3.19.1
      #在容器当中执行命令
      command:
      - "tail"
      - "-f"
      - "/etc/hosts"

· args

apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine:3.19.1
      args:
      - "tail"
      - "-f"
      - "/etc/hosts"

· command与args结合

args可以当做command的参数进行命令执行;

跟docker中的守护进程命令一样;command就类似于ENTRYPOINT;args就类似于CMD;

apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine
      command:
      - "tail"
      - "-f"
      args:
      - "/etc/hosts"

八、pod排障之日志查询

# pod资源清单

[root@k8s1 pod]# vi pod-log-nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  name: m-log-nginx
spec:
  terminationGracePeriodSeconds: 1
  containers:
    - name: c1
      image: nginx:1.20.1-alpine
[root@k8s1 pod]# kubectl apply -f pod-log-nginx.yaml 
#  模拟循环访问pod
[root@k8s1 pod]# kubectl get pod -owide
 NAME          READY   STATUS    RESTARTS   AGE   IP            NODE   NOMINATED NODE   READINESS GATES
 m-log-nginx   1/1     Running   0          1s    10.100.1.21   k8s2   <none>           <none>
while true ; 
do 
  curl 10.100.1.21 ; 
  sleep 0.5 
done
# 查看pod日志 
[root@k8s1 pod]# kubectl logs pod/m-log-nginx -f
# 如果pod中容器发生重启,如何查看重启前的容器的log日志信息?
[root@k8s1 pod]# kubectl logs -p pod/m-log-nginx -f
# 模拟容器重启
[root@k8s2 ~]# docker kill a0706cc1dd9a

九、进入pod容器exec与cp命令

#进入pod中容器
kubectl  exec  pod名称  -it  --  sh
#拷贝容器中数据到宿主机(默认pod中第一个容器)
kubectl  cp  pod名称:/root/123.txt    ./
#拷贝宿主机数据到容器
kubectl  cp  ./222.log   pod名称:/mnt/
#指定容器拷贝
kubectl  cp -c 容器名  pod名称:/root/123.txt    ./
#pod外部执行命令
[root@k8s1 pod]# kubectl exec m-log-nginx -it -- ifconfig