文章目录
- 工作负载
- pod定义
- pod分类
- 关系
- 静态pod
- 控制器管理的pod
- 镜像拉取策略
- pod常用命令
- 创建pod
- 查看pod
- 删除pod
- 删除单个pod
- 删除多个pod
- pod的标签命令
- 查看pod标签
- 设置标签
- 通过命令行设置标签
- 通过yaml文件设置标签
- 查询标签
- 通过等值关系查看标签
- 通过集合关系查看标签
- 删除pod标签
- pod内部镜像操作命令
- 不用交互直接操作名
- 和容器交互操作
- Pod资源限制
- Pod中多个容器网络共享
工作负载
- 工作负载是在k8s集群中运行的应用程序,无论工作负载是单一服务还是集群构成,在k8s中都可以使用pod来运行它。
pod定义
- pod是k8s集群管理与调度的最小计算单元,表示处于运行状态的一组容器
- pod不是进程,只是容器运行的环境
- 一个pod可以封装任意个容器
- 一个pod内的容器共享部分命令空间,例如:
Net Namespace、IPC Namespace、UTS Namespace
- 用户pod默认会被调度运行在node节点上(不运行在master节点上,但是也有例外)
- pod内的IP不是固定的,集群外不能直接访问pod
pod分类
关系
- workloads分为
静态pod
和控制器管理的pod
- pod通过控制器实现应用的运行、伸缩、升级等操作
- controller在集群中管理pod
- pod与controller之间通过label-selector进行关联,且是唯一的关联方式
静态pod
- 也称为无控制器管理的pod
- 直接由特定节点上的
kubelet
守护进程管理, 不需要API 服务器看到它们 - 尽管大多数 Pod 都是通过控制面(例如,Deployment) 来管理的,对于静态 Pod 而言,
kubelet
直接监控每个 Pod,并在其失效时重启之。
控制器管理的pod
- 控制器可以控制pod的副本数,扩容与裁剪,版本更新与回滚等
镜像拉取策略
由imagePullPolicy参数控制
- Always : 不管本地有没有镜像,都要从仓库中下载镜像
- Never : 从来不从仓库下载镜像, 只用本地镜像,本地没有就算了
- IfNotPresent: 如果本地存在就直接使用, 不存在才从仓库下载
默认的策略是:
- 当镜像标签版本是latest,默认策略就是Always
- 如果指定特定版本默认拉取策略就是IfNotPresent。
pod常用命令
创建pod
- 直接使用命令行创建pod,不推荐,测试自己玩玩就行
# 创建
kubectl run nginx --image=nginx
pod/nginx created
# 查看
kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 0/1 ContainerCreating 0 13s
- 使用yaml创建指定pod
- 创建pod文件,例如
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx1
spec:
containers:
- name: nginx
image: nginx
- 使用yaml文件创建pod
kubectl create -f pod.yaml
pod/nginx1 created
- 查看pod
kubectl get pod|grep nginx1
nginx1 1/1 Running 0 2m10s
- 使用yaml创建pod时可以使用
creat
或者apply
- apply:使用apply时,如果pod已存在相当于执行更新操作
kubectl apply -f pod.yaml
pod/nginx1 configured
- create:使用create时,如果pod已存在会直接报错
kubectl create -f pod.yaml
Error from server (AlreadyExists): error when creating "pod.yaml": pods "nginx1" already exists
查看pod
- pod是一种计算资源,可以通过
kubectl get pod
来查看
kubectl get pod
NAME READY STATUS RESTARTS AGE
pod 1/1 Running 0 21s
- pod或pods都可以,不指定namespace,默认是名为default的namespace
kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
pod 1/1 Running 0 28s
- 查看pod详细信息
-o wide
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod 1/1 Running 0 38s 10.1.0.114 docker-desktop <none> <none>
- 描述pod详细信息
kubectl describe pod pod-stress [-n namespace pod在非默认空间时需要指定pod所在的namespace]
Name: pod-stress # pod名称
Namespace: default # 所在命名空间
Priority: 0 # 优先级
Node: docker-desktop/192.168.65.4 # 所在节点
Start Time: Fri, 19 Aug 2022 11:24:15 +0800 # 创建时间
Labels: <none> # 标签
Annotations: <none> # 标签描述
Status: Running # pod状态
IP: 10.1.0.109 # Pod IP地址
IPs: # IP地址
IP: 10.1.0.109
Containers: # Pod中的容器信息
c1: # c1容器
Container ID: docker://b80d5e7b88cc207978da99ef508c0772a60ac693d94c0a59cd12266d6883aa57 # 容器ID
Image: polinux/stress # 镜像名
Image ID: docker-pullable://polinux/stress@sha256:b6144f84f9c15dac80deb48d3a646b55c7043ab1d83ea0a697c09097aaad21aa # 镜像ID
Port: <none> # 端口
Host Port: <none> # 主机端口
Command: # 启动命令
stress
Args: # 启动参数
--vm # CPU数
1
--vm-bytes # 内存数
100
--vm-hang # 进程数
1
State: Running # 容器状态
Started: Fri, 19 Aug 2022 11:24:33 +0800 # 容器启动时间
Ready: True # 是否就绪
Restart Count: 0 # 容器重启次数
Environment: <none> # 环境变量
Mounts: # 绑定位置
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-sqkts (ro)
Conditions:
Type Status
Initialized True # 初始化是否完成
Ready True # 是否ready
ContainersReady True # 容器是否ready
PodScheduled True # pod调度
Volumes:
kube-api-access-sqkts:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 102s default-scheduler Successfully assigned default/pod-stress to k8s-worker1
Normal Pulling 102s kubelet Pulling image "polinux/stress"
Normal Pulled 83s kubelet Successfully pulled image "polinux/stress" in 18.944533343s
Normal Created 83s kubelet Created container c1
Normal Started 82s kubelet Started container c1
删除pod
删除单个pod
- 命令行直接删除
kubectl delete pod nginx
pod "nginx" deleted
- 使用yaml资源清单文件删除
kubectl delete -f pod.yaml
pod "nginx1" deleted
- 删除某个namespace会直接删除该命名空间下所有的pod
# 查看test空间下pod
kubectl get pod -n test
NAME READY STATUS RESTARTS AGE
nginx1 1/1 Running 0 16m
nginx2 1/1 Running 0 16m
# 删除test空间
kubectl delete ns test
namespace "test" deleted
# 查看test空间下pod
kubectl get pod -n test
No resources found in test namespace.
删除多个pod
- 命令行删除,后面直接跟多个要删除的pod名称
- 使用awk过滤删除
kubectl get pod |awk 'NR >1 {print $1}' |xargs kubectl delete pod
pod "nginx1" deleted
pod "nginx2" deleted
- 删除某个namespace会直接删除该命名空间下所有的pod
pod的标签命令
- 为pod设置标签,便于控制器通过label和pod进行关联
- 可以将标签理解成SQL中的查询条件
查看pod标签
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx1 0/1 ContainerCreating 0 2s <none>
设置标签
通过命令行设置标签
kubectl label pod nginx1 env=test zone=beijing
pod/nginx1 labeled
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx1 1/1 Running 0 72s env=test,zone=beijing
通过yaml文件设置标签
- yaml清单文件
apiVersion: v1
kind: Pod
metadata:
name: nginx2
labels:
env: dev
zone: A
spec:
containers:
- name: nginx
image: nginx
- 验证
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx1 1/1 Running 0 4m29s env=test,zone=beijing
nginx2 1/1 Running 0 46s env=dev,zone=A
查询标签
通过等值关系查看标签
kubectl get pod -l env=dev
NAME READY STATUS RESTARTS AGE
nginx2 1/1 Running 0 3m10s
通过集合关系查看标签
kubectl get pod -l "env in(dev,test,prod)"
NAME READY STATUS RESTARTS AGE
nginx1 1/1 Running 0 7m31s
nginx2 1/1 Running 0 3m48s
删除pod标签
kubectl label pod nginx1 env- zone-
pod/nginx1 labeled
kubectl get pod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx1 1/1 Running 0 8m59s <none>
nginx2 1/1 Running 0 5m16s env=dev,zone=A
pod内部镜像操作命令
不用交互直接操作名
- 命令格式:
kubectl exec pod名 -c 容器名 -- 命令
- 不指定容器名,则默认为pod里的第1个容器
kubectl exec nginx1 -- date
Fri Aug 19 10:52:50 UTC 2022
和容器交互操作
kubectl exec -it nginx1 -c nginx -- /bin/bash
root@nginx1:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@nginx1:/#
Pod资源限制
apiVersion: v1
kind: Namespace
metadata:
name: namespace1
---
apiVersion: v1
kind: Pod
metadata:
name: pod-stress2
namespace: namespace1
spec:
containers:
- name: c1
image: polinux/stress
imagePullPolicy: IfNotPresent
resources:
limits:
memory: "200Mi"
requests:
memory: "100Mi"
command: ["stress"] # 启动容器时执行的命令
args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"] # 产生1个进程分配150M内存1秒后释放
Pod中多个容器网络共享
- 编写yaml文件
apiVersion: v1
kind: Pod
metadata:
name: pod-share-network
spec:
containers:
- name: c1
image: nginx
- name: c2
image: nginx
imagePullPolicy: IfNotPresent
- 运行yaml文件
···shell
kubectl apply -f share_network.yaml
pod/pod-share-network created
* 查看
```shell
kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-share-network 1/2 CrashLoopBackOff 13 44m