序章 發表於 2025-5-4 20:10:00

K8s新手系列之ReplicaSet资源

<h2 id="概述">概述</h2>
<p>官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/replicaset/</p>
<p><code>ReplicaSet</code>简称<code>rs</code>,其主要作用和<code>ReplicationController</code>一样,保证一定数量的pod正常运行,它会持续监听这些Pod的运行状态,一旦Pod发生故障,就会重启或重建。同时它还支持对pod数量的扩缩容和镜像版本的升降级。</p>
<p>相较于ReplicationController而言,ReplicaSet更加轻量级,且功能更强大,支持正则匹配Pod。</p>
<p><strong>想要学习ReplicationController可以查看这篇文章</strong>:K8s新手系列之ReplicationController资源</p>
<h2 id="replicaset的作用">ReplicaSet的作用</h2>
<ul>
<li>
<p>副本管理:ReplicaSet 的核心功能是保证在任何时候都有指定数量的 Pod 副本在运行。如果有 Pod 意外终止,ReplicaSet 会自动创建新的 Pod 来替代它;如果 Pod 数量过多,它会删除多余的 Pod。</p>
</li>
<li>
<p>集群扩容和缩容:用户可以通过修改 ReplicaSet 中的副本数量来轻松地对应用进行扩容或缩容。</p>
</li>
<li>
<p>灵活的标签选择器</p>
<ul>
<li>
<p>集合式选择器:与 ReplicationController 仅支持等式选择器不同,ReplicaSet 支持更灵活的集合式选择器,如 in、notin、exists 等。这使得 ReplicaSet 能够更精确地选择要管理的 Pod,提高了标签选择的灵活性和表达能力。</p>
</li>
<li>
<p>动态匹配 Pod:通过标签选择器,ReplicaSet 可以动态地匹配符合条件的 Pod。即使在 ReplicaSet 创建之后,只要有新的 Pod 被创建且其标签符合 ReplicaSet 的选择器,这些 Pod 就会被纳入 ReplicaSet 的管理范围。</p>
</li>
</ul>
</li>
</ul>
<h2 id="replicaset资源配置文件详解">ReplicaSet资源配置文件详解</h2>
<p>可以通过<code>kubectl explain rs</code>查看创建ReplicaSet需要的字段</p>
<p>示例:</p>
<pre><code># kubectl explain rs
KIND:   ReplicaSet
VERSION:apps/v1

DESCRIPTION:
   ReplicaSet ensures that a specified number of pod replicas are running at
   any given time.

# fileds字段中的内容已进行截取
FIELDS:
   apiVersion   &lt;string&gt;
   
   kind &lt;string&gt;

   metadata   &lt;Object&gt;

   spec &lt;Object&gt;

   status       &lt;Object&gt;
</code></pre>
<p>通过上述可以发现定义ReplicaSet的资源文件和定义Pod一样,也需要apiVersion、kind、metadata、spec等字段。</p>
<p>但是spec字段中有三个字段,需要注意,分别是replicas、selector、template。如下:</p>
<pre><code># kubectl explain rs.spec
KIND:   ReplicaSet
VERSION:apps/v1

RESOURCE: spec &lt;Object&gt;

DESCRIPTION:
   Spec defines the specification of the desired behavior of the ReplicaSet.
   More info:
   https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

   ReplicaSetSpec is the specification of a ReplicaSet.

FIELDS:
   minReadySeconds      &lt;integer&gt;
   # minReadySeconds 规定了一个时间阈值,只有当 Pod 保持就绪状态的时间达到或者超过这个阈值,并且在此期间 Pod 内的任何容器都没有崩溃,这个 Pod 才会被视为可用。
   
   replicas   &lt;integer&gt;
   # 定义Pod的副本数量
   
   selector   &lt;mapstring&gt;
   # 标签选择器,这里指定Pod定义的标签
   
   template   &lt;Object&gt;
   # 定义Pod的模板
</code></pre>
<h2 id="创建replicaset">创建ReplicaSet</h2>
<p>这里我们创建三个Pod副本<br>
示例:</p>
<pre><code># 定义资源文件
# cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
    app: rs-nginx
spec:
# 定义Pod的副本数量
replicas: 3
# 标签选择器,这里和Pod的Label保持一致
selector:
    # 匹配Pod的Label
    matchLabels:
      app: nginx
# 定义Pod的模板,只需要定义metadata和spec两个字段即可
template:
    metadata:
      name: pod-nginx
      labels:
      app: nginx
    spec:
      restartPolicy: Always
      containers:
      - name: nginx
      image: nginx:latest

# 创建ReplicaSet
# kubectl apply -f rs-nginx.yaml
</code></pre>
<h3 id="查看对应的replicaset和pod">查看对应的ReplicaSet和Pod</h3>
<p>查看ReplicaSet</p>
<pre><code># kubectl get rs
NAME         DESIRED   CURRENT   READY   AGE
rs-nginx-1   3         3         3       93s
</code></pre>
<p>查看Pod</p>
<pre><code># kubectl get po | grep rs-nginx
rs-nginx-1-6rb9p       1/1   Running            0               2m
rs-nginx-1-ssdhv       1/1   Running            0               2m
rs-nginx-1-vzn2x       1/1   Running            0               2m
</code></pre>
<h2 id="验证replicaset的副本管理">验证ReplicaSet的副本管理</h2>
<p>ReplicaSet 的核心功能是保证在任何时候都有指定数量的 Pod 副本在运行。如果有 Pod 意外终止,ReplicaSet 会自动创建新的 Pod 来替代它;如果 Pod 数量过多,它会删除多余的 Pod。</p>
<p>当我们删除创建好的Pod时,Replicaset会发生什么呢?</p>
<pre><code># 删除上面创建的所有Pod
# kubectl delete po rs-nginx-1-6rb9p rs-nginx-1-ssdhv rs-nginx-1-vzn2x
pod "rs-nginx-1-6rb9p" deleted
pod "rs-nginx-1-ssdhv" deleted
pod "rs-nginx-1-vzn2x" deleted

# 查看rs,发现其副本数量还是3个
# kubectl get rs
NAME         DESIRED   CURRENT   READY   AGE
rs-nginx-1   3         3         3       5m17s

# 查看Pod,发现对应的Pod还是3个,通过AGE字段发现是新创建的
# kubectl get po | grep rs-nginx
NAME                   READY   STATUS             RESTARTS          AGE
rs-nginx-1-6h7fv       1/1   Running            0               22s
rs-nginx-1-fhkm9       1/1   Running            0               22s
rs-nginx-1-l5njb       1/1   Running            0               22s
</code></pre>
<h2 id="验证replicaset的扩缩容">验证Replicaset的扩缩容</h2>
<h3 id="验证扩容">验证扩容</h3>
<p>我们将rs的副本数量调整成5,看看会发生什么?</p>
<pre><code># cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
    app: rs-nginx
spec:
# 将副本数量修改成5
replicas: 5
selector:
    matchLabels:
      app: nginx
template:
    metadata:
      name: pod-nginx
      labels:
      app: nginx
    spec:
      restartPolicy: Always
      containers:
      - name: nginx
      image: nginx:latest

# 重新应用它
# kubectl apply -f rs-nginx.yaml
replicaset.apps/rs-nginx-1 configured
</code></pre>
<p>查看一下Pod的变化:</p>
<pre><code># kubectl get po | grep rs-nginx
NAME                   READY   STATUS             RESTARTS          AGE
rs-nginx-1-6h7fv       1/1   Running            0                4m17s
rs-nginx-1-fhkm9       1/1   Running            0                4m26s
rs-nginx-1-l5njb       1/1   Running            0                4m26s
rs-nginx-1-t75z7       1/1   Running            0                8s
rs-nginx-1-tdvbr       1/1   Running            0                8s
</code></pre>
<p>通过上述发现Pod副本数量由3个变成了5个,查看AGE字段,发现有两个Pod是新建的状态。</p>
<h3 id="验证缩容">验证缩容</h3>
<p>同理,我们将副本数量调整成1,看看会发生什么?</p>
<pre><code># cat rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
    app: rs-nginx
spec:
# 将Pod数量调整成1
replicas: 1
selector:
    matchLabels:
      app: nginx
template:
    metadata:
      name: pod-nginx
      labels:
      app: nginx
    spec:
      restartPolicy: Always
      containers:
      - name: nginx
      image: nginx:latest

# 重新应用它
# kubectl apply -f rs-nginx.yaml
replicaset.apps/rs-nginx-1 configured

</code></pre>
<p>查看一下:</p>
<pre><code># 查看rs
# kubectl get rs
NAME         DESIRED   CURRENT   READY   AGE
rs-nginx-1   1         1         1       11m
# 查看Pod
# kubectl get po | grep rs-nginx
rs-nginx-1-fhkm9       1/1   Running            0               6m33s
</code></pre>
<p>通过上述发现,Pod的数量由5个缩减成1个</p>
<h2 id="replicaset的标签选择器">Replicaset的标签选择器</h2>
<p>Replicaset的标签选择器分为两类,一类是等式选择器,另一类是集合选择器</p>
<h3 id="等式选择器">等式选择器</h3>
<p>等式选择器通过 =、==(两者含义相同)或者 != 来筛选标签。其通过<code>spec.selector.matchLabels</code>来实现。</p>
<p>示例:</p>
<pre><code>apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx-1
namespace: default
labels:
    app: rs-nginx
spec:
replicas: 1
selector:
# 等式选择器
    matchLabels:
      app: nginx
template:
    metadata:
      name: pod-nginx
      labels:
      app: nginx
    spec:
      restartPolicy: Always
      containers:
      - name: nginx
      image: nginx:latest
</code></pre>
<h3 id="集合选择器">集合选择器</h3>
<p>集合选择器借助 in、notin、exists、DoesNotExist 这些操作符来筛选标签。</p>
<ul>
<li>in:用于选取标签值在指定集合内的 Pod。</li>
<li>notin:用于选取标签值不在指定集合内的 Pod。</li>
<li>exists:用于选取具有指定标签的 Pod,不考虑标签的值。</li>
<li>DoesNotExist:用于选取不具有指定标签的 Pod,不考虑标签的值。</li>
</ul>
<p>其通过<code>spec.selector.matchExpressions</code>来实现</p>
<p>示例:</p>
<pre><code>apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset-set
spec:
replicas: 3
selector:
   # 集合选择器
    matchExpressions:
      # key:指定Label的key,operator:表示操作符,value:表示Label的value
      - {key: app, operator: In, values: }
      - {key: env, operator: NotIn, values: }
template:
    metadata:
      labels:
      app: nginx
      env: production
    spec:
      containers:
      - name: nginx
      image: nginx:1.14.2
      ports:
      - containerPort: 80
</code></pre>
<h2 id="管理replicaset">管理Replicaset</h2>
<h3 id="查看replicaset">查看Replicaset</h3>
<p>语法:</p>
<pre><code>kubectl get rs &lt;rs-name&gt; -n &lt;namespace-name&gt;
</code></pre>
<p>示例:</p>
<pre><code># kubectl get rs
NAME         DESIRED   CURRENT   READY   AGE
rs-nginx-1   1         1         1       25m
</code></pre>
<h3 id="修改replicaset">修改Replicaset</h3>
<p>由两种方式,一种是通过<code>kubectl edit rc &lt;rc-name&gt;</code>来进行修改,会打开一个类似<code>vim</code>的界面,修改其对应的值即可,最后<code>wq</code>保存即可应用你的配置.<br>
另一种方式则是修改对应的资源文件,最后使用<code>kubectl apply -f &lt;file&gt;</code>即可。</p>
<h3 id="删除replicaset">删除Replicaset</h3>
<p>语法:</p>
<pre><code>kubectl delete rc &lt;rc-name&gt; -n &lt;namespace-name&gt;
</code></pre>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18859229,微信Vac6666666,欢迎交流</p><br><br>
来源:https://www.cnblogs.com/huangSir-devops/p/18859229
頁: [1]
查看完整版本: K8s新手系列之ReplicaSet资源