3.1 使用命令创建Pod(v1.18版本变化)
- 在 Kubernetes v1.18 之前,
kubectl run
命令用于创建 Deployment 控制器。 - 从 v1.18 版本开始,
kubectl run
命令改为用于创建 Pod。
3.1.1 创建名为 pod-nginx
的 Pod
[root@k8s-master1 ~]# kubectl run nginx1 --image=nginx:1.15-alpine
pod/nginx1 created
3.1.2 验证 Pod 创建
[root@k8s-master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx1 1/1 Running 0 41s
3.2 使用 YAML 文件创建 Pod
3.2.1 准备 YAML 文件
[root@k8s-master1 ~]# vim pod1.yml
apiVersion: v1 # API 版本
kind: Pod # 资源类型为 Pod
metadata:name: pod-stress # 自定义 Pod 的名称
spec:containers: # 定义 Pod 中包含的容器- name: c1 # 自定义容器名称image: polinux/stress # 启动容器的镜像名command: ["stress"] # 自定义启动容器时执行的命令(类似 Dockerfile 中的 CMD)args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"] # 自定义启动容器执行的命令参数imagePullPolicy: IfNotPresent
# polinux/stress 镜像用于压力测试,启动容器时通过传递命令和参数来指定容器运行的压力
3.2.2 通过 YAML 文件创建 Pod
[root@k8s-master1 ~]# kubectl apply -f pod1.yml
pod/pod-stress created
3.2.3 查看 Pod 信息
查看 Pod 状态:
[root@k8s-master1 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-stress 1/1 Running 0 45s
查看 Pod 详细信息:
[root@k8s-master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-stress 1/1 Running 0 71s 10.244.194.72 k8s-worker1 <none> <none>
查看 Pod 描述信息:
[root@k8s-master1 ~]# kubectl describe pod pod-stress
......
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 102s default-scheduler Successfully assigned default/pod-stress to k8s-worker1Normal Pulling 102s kubelet Pulling image "polinux/stress"Normal Pulled 83s kubelet Successfully pulled image "polinux/stress" in 18.944533343sNormal Created 83s kubelet Created container c1Normal Started 82s kubelet Started container c1
3.3 删除 Pod
3.3.1 删除单个 Pod
方法 1:直接通过 Pod 名称删除
[root@k8s-master1 ~]# kubectl delete pod pod-stress
pod "pod-stress" deleted
方法 2:通过 YAML 文件删除
[root@k8s-master1 ~]# kubectl delete -f pod1.yml
3.3.2 删除多个 Pod
方法 1:列出多个 Pod 名称
[root@k8s-master1 ~]# kubectl delete pod pod名1 pod名2 pod名3 ......
方法 2:通过 awk
过滤出要删除的 Pod 名称,然后使用 xargs
删除
[root@k8s-master1 ~]# kubectl get pods | awk 'NR>1 {print $1}' | xargs kubectl delete pod
方法 3:如果 Pod 都在同一非默认命名空间下,可以直接删除命名空间
[root@k8s-master1 ~]# kubectl delete ns xxxx
3.4 镜像拉取策略
由 imagePullPolicy
参数控制:
Always
:无论本地是否有镜像,都从仓库拉取镜像。Never
:从不从仓库拉取镜像,只使用本地镜像,本地没有则不启动。IfNotPresent
:如果本地存在镜像则直接使用,若不存在才从仓库拉取。
默认策略:
- 如果镜像标签为
latest
,则默认策略为Always
。 - 如果指定了特定版本,则默认策略为
IfNotPresent
。
示例:查看镜像拉取策略
删除并重新创建 Pod,并使用 describe
命令查看事件信息:
[root@k8s-master1 ~]# kubectl apply -f pod1.yml
[root@k8s-master1 ~]# kubectl delete -f pod1.yml
[root@k8s-master1 ~]# kubectl describe pod pod-stress
......
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 102s default-scheduler Successfully assigned default/pod-stress to k8s-worker1Normal Pulling 102s kubelet Pulling image "polinux/stress"Normal Pulled 83s kubelet Successfully pulled image "polinux/stress" in 18.944533343sNormal Created 83s kubelet Created container c1Normal Started 82s kubelet Started container c1
说明: 如果第二行信息显示 pulling image
,表示镜像是从仓库拉取的。
如果修改 imagePullPolicy
为 IfNotPresent
后,镜像已存在则不会再次拉取:
[root@k8s-master1 ~]# vim pod1.yml
apiVersion: v1
kind: Pod
metadata:name: pod-stressnamespace: default
spec:containers:- name: c1image: polinux/stresscommand: ["stress"]args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]imagePullPolicy: IfNotPresent # 添加了这一行
再次删除并创建 Pod:
[root@k8s-master1 ~]# kubectl describe pod pod-stress
......
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 17s default-scheduler Successfully assigned default/pod-stress to k8s-worker1Normal Pulled 17s kubelet Container image "polinux/stress" already present on machineNormal Created 17s kubelet Created container c1Normal Started 17s kubelet Started container c1
说明: 第二行信息显示 Container image "polinux/stress" already present on machine
,表示镜像已存在,本地直接使用。
3.5 Pod 标签
- 为 Pod 设置标签(label),用于控制器通过标签与 Pod 进行关联。
- 标签的操作方式与 Node 标签类似。
3.5.1 通过命令管理 Pod 标签
- 查看 Pod 的标签
[root@k8s-master1 ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-stress 1/1 Running 0 7m25s <none>
- 为 Pod 打标签并查看
[root@k8s-master1 ~]# kubectl label pod pod-stress region=huanai zone=A env=test bussiness=game
pod/pod-stress labeled[root@k8s-master1 ~]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-stress 1/1 Running 0 8m54s bussiness=game,env=test,region=huanai,zone=A
- 通过标签查询 Pod
- 根据标签等值查询:
[root@k8s-master1 ~]# kubectl get pods -l env=test
NAME READY STATUS RESTARTS AGE LABELS
pod-stress 1/1 Running 0 13m bussiness=game,env=test,region=huanai,zone=A
- 查询并删除符合标签条件的 Pod
[root@k8s-master1 ~]# kubectl delete pods -l env=test
小结:
- pod的label与node的label操作方式几乎相同
- node的label用于pod调度到指定label的node节点
- pod的label用于controller关联控制的pod