K8s pod 及Replicaset控制器

129 阅读6分钟

pod生命周期

image.png

生命周期中出现的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:{keyoperator,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"`