pod生命周期
生命周期中出现的5种状态
| 状态值 | 状态名称 | 描述 |
|---|---|---|
| 1. Pending | 挂起 | apiServer已经创建了pod资源对象,但它尚未被调度完成或者仍处于下载镜像的过程中; |
| 2. Running | 运行中 | pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成; |
| 3. Succeeded | 成功 | pod中的所有容器都已经成功终止并且不会被重启 |
| 4. Failed | 失败 | 所有容器都已终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态; |
| 5. Unknown | 未知 | apiServer无法正常获取到pod对象的状态信息,通常由网络通讯失败所导致; |
Replicaset控制器
Replicaset概述
ReplicaSet是kubernetes中的一种副本控制器,简称rs,主要作用是控制由其管理的pod,使pod副本的数量始终维持在预设的个数。它的主要作用就是保证一定数量的Pod能够在集群中正常运行,它会持续监听这些Pod的运行状态,在Pod发生故障时重启pod,pod数量减少时重新运行新的 Pod副本。官方推荐不要直接使用ReplicaSet,用Deployments取而代之,Deployments是比ReplicaSet更高级的概念,它会管理ReplicaSet并提供很多其它有用的特性,最重要的是Deployments支持声明式更新,声明式更新的好处是不会丢失历史变更。所以Deployment控制器不直接管理Pod对象,而是由 Deployment 管理ReplicaSet,再由ReplicaSet负责管理Pod对象。
Replicaset工作原理
Replicaset核心作用在于用户创建指定数量的pod副本,并确保pod副本一直处于满足用户期望的数量, 起到多退少补的作用,并且还具有自动扩容缩容等制。
Replicaset控制器主要由三个部分组成:
1、用户期望的pod副本数:用来定义由这个控制器管控的pod副本有几个
2、标签选择器:选定哪些pod是自己管理的,如果通过标签选择器选到的pod副本数量少于我们指定的数量,需要用到下面的组件
3、pod资源模板:如果集群中现存的pod数量不够我们定义的副本中期望的数量怎么办,需要新建pod,这就需要pod模板,新建的pod是基于模板来创建的。
查看命令帮助:
kubectl explain rs.spec
kubectl explain rs.spec.selector
kubectl explain ReplicaSet.spec.selector.matchExpressions:{key,operator,values}
selector:
matchExpressions:
- {key: app, operator: In, values: [ng-rs-80,ng-rs-81]}
kubectl explain ReplicaSet.spec.selector.matchLabels:{key,value}
#查看当前命名空间下 副本控制器:
kubectl get rs
kubectl describe rs my-replicaset
kubectl apply -f replicaset.yaml
kubectl delete -f replicaset.yaml
watch kubectl get pod -o wide
实际操作
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 10
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: mycontainer
image: harbor.hiuiu.com/nginx/nginx:1.21.5
ports:
- containerPort: 80
## repolicaset 动态扩容
修改spec:
replicas: 5
# 如果删除pod,repolicaset会自动创建该pod
Pod 节点选择器
## nodeName
kubectl explain rs.spec.template.spec.nodeName
spec:
nodeName: 31.hiuiu.com
## nodeSelector
kubectl explain rs.spec.template.spec.nodeSelector
spec:
nodeSelector:
nodeNum: node2
Pod 标签
打标签:
metadata:
name: nginx100
labels:
app: nginx
project: project1
# 查看标签
kubectl get pod --show-labels
# 动态给pod打标签
kubectl label pod my-replicaset-55w9w release=v1
# 查看节点的标签
kubectl get node --show-labels
# 给节点追加标签
kubectl label node 30.hiuiu.com nodemaster=yes
# 给节点删除标签
kubectl label node 30.hiuiu.com nodemaster-
@@实验案例:需求:运行pod指定node1节点:
两种方法:1. nodeName 2.nodeSelector
1. kubectl explain rs.spec.template.spec.nodeName # 选择主机名
2. kubectl explain rs.spec.template.spec.nodeSelector # 选择label
a. 给node打标签
b. nodeSelector
# 列出指定标签名的pod或node
kubectl get pods -L project
# 累出指定标签的pod 或node
kubectl get node -l nodeNum=node2
kubectl get pod -l project --show-labels
Evicted状态:
在Kubernetes中,当节点资源紧张时,Kubelet可能会驱逐节点上的一些Pods以释放资源。当这种情况发生时,Pod的状态会被设置为"Evicted"。
node亲和性
apiVersion: v1
kind: Pod
metadata:
name: pod-node-affinity-demo
namespace: default
labels:
app: myapp
spec:
containers:
- name: myapp
image: harbor.hiuiu.com/nginx/nginx:1.21.5
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- ky36
- ccc
# 给主机打标签
kubectl lable node NODENAME zone=ky36
# 观察pod调度动态
kubectl get pod -o wide
kubectl explain pods.spec.affinity.nodeAffinity.preferredDuringSchedulingIgnoredDuringExecution
#调度器将倾向于将pods调度到满足该字段指定的亲和性表达式的节点上,但它也可能选择违背一个或多个表达式的节点。最受青睐的节点是具有最大权重和的节点,即对于每个满足所有调度要求(资源请求、调度期间的亲和性表达式等)的节点,通过迭代该字段的元素计算和,如果节点匹配相应的匹配表达式,则为和添加“权重”,具有最高权重的节点是最受青睐的。---- 是软性偏好,表示调度器会尽量但不强求将Pod调度到满足特定条件的节点上。
kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution
#如果调度时不满足该字段指定的亲和性要求,pod将不会被调度到该节点上。如果该字段指定的亲和性需求在pod执行期间的某个点停止满足(例如由于更新),系统可能会也可能不会尝试最终将pod从其节点中移除。---- 是硬性要求,表示Pod必须被调度到满足特定条件的节点上
Pod 亲和性
应用场景: 期望pod能够调度到同一台主机。
topologyKey:( 获取topologyKey : kubectl get nodes --show-labels )
#topologyKey是节点标签(Node Label)的键,用于标识节点在集群中的拓扑位置。通过在Pod的亲和性(Affinity)、反亲和性(Anti-Affinity)或拓扑分布约束(Topology Spread Constraints)中指定topologyKey,可以精确地控制Pod的调度位置,以满足特定的硬件或软件要求。
yaml1:
apiVersion: v1
kind: Pod
metadata:
name: pod-first
labels:
app2: myapp2
tier: frontend
spec:
containers:
- name: myapp
image: harbor.hiuiu.com/nginx/nginx:1.21.5
yaml2:
apiVersion: v1
kind: Pod
metadata:
name: pod-second
labels:
app: backend
tier: db
spec:
containers:
- name: mysql
image: harbor.hiuiu.com/nginx/nginx:1.21.5
imagePullPolicy: IfNotPresent
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- {key: app2, operator: In, values: ["myapp2"]}
topologyKey: kubernetes.io/hostname
Pod 反亲和性
kubectl explain pods.spec.affinity.podAntiAffinity.requiredDuringSchedulingIgnoredDuringExecution.topologyKey
# 他的pod应该与指定的命名空间中与labelSelector匹配的pod同处(affinity)或非同处(anti-affinity),其中co-located定义为运行在一个节点上,其标签的键topologyKey的值与所选pod运行的任何节点的值相匹配。不允许为空的拓扑键。
Pod 拉取镜像策略
kubectl explain pod.spec.containers.imagePullPolicy
##imagePullPolicy (镜像拉取策略)::
IfNotPresent:node节点没有此镜像就去指定的镜像仓库拉取,node有就使用node本地镜像。
Always:每次重建pod都会重新拉取镜像
Never:从不到镜像中心拉取镜像,只使用本地镜
Pod 重启策略
kubectl explain pod.spec.restartPolicy
restartPolicy
- `"Always"`
- `"Never"`
- `"OnFailure"`