Kubernetes基本概念之Label
<blockquote><p>系列目录</p>
</blockquote>
<p>在为对象定义好Label后,其他对象就可以通过Label来对对象进行引用。Label的最常见的用法便是通过spec.selector来引用对象。</p>
<pre><code class="language-yml">apiVersion: v1
kind: ReplicationController
metadata:
name: nginx
spec:
replicas: 3
selector:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
</code></pre>
<p>关于Label的用法重点在于这两步:</p>
<ul>
<li>
<p>通过<code>template.metadata.labels</code>字段<code>为即将新建的Pod附加Label</code>。在上面的例子中,新建了一个名称为nginx的Pod,它拥有一个键值对为app:nginx的Label。</p>
</li>
<li>
<p>通过<code>spec.selector</code>字段来<code>指定这个RC管理哪些Pod</code>。在上面的例子中,新建的RC会管理所有拥有app:nginxLabel的Pod。这样的<code>spec.selector</code>在Kubernetes中被称作<code>Label Selector</code>。</p>
</li>
</ul>
<h2 id="11-label的定义">1.1. Label的定义</h2>
<p>我们通常使用<code>metadata.labels</code>字段,来为对象添加Label。Label可以为多个。一个简单的例子如下:</p>
<pre><code class="language-yml">apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
release: stable
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
</code></pre>
<p>上面的描述文件为名为nginx的Pod添加了两个Label,分别为app: nginx和release: stable。</p>
<blockquote>
<p>注: label为任意键值对,只要selector在选择的时候匹配即可</p>
</blockquote>
<h3 id="111-常见的label">1.1.1. 常见的Label</h3>
<p>一般来说,我们会给一个Pod(或其他对象)定义<code>多个Label</code>,以便于配置,部署等管理工作。例如:部署不同版本的应用到不同的环境中;或者监控和分析应用(日志记录,监控,报警等)。通过多个Label的设置,我们就可以多维度的Pod或其他对象进行精细化管理。一些常用的Label示例如下:</p>
<pre><code class="language-yml">relase: stable
release: canary
environment: dev
environemnt: qa
environment: production
tier: frontend
tier: backend
tier: middleware
......
</code></pre>
<blockquote>
<p>上面说过,Label是自定义的一些key/value对,你可以随心所欲的设置,但是强烈建议按照一定的惯例或者组织内部规则,以便维护管理</p>
</blockquote>
<h2 id="12-label-selector">1.2. Label Selector</h2>
<p>带有Label的对象创建好之后,我们就可以通过Label Selector来引用这些对象。<br>
通常我们通过描述文件中的<code>spec.selector</code>字段来指定Label,从而Kubernetes寻找到所有包含你指定Label的对象,进行管理。<br>
Kubernetes目前支持两种类型的Label Selector:</p>
<ul>
<li>基于等式的Selector(Equality-based)</li>
<li>基于集合的Selector(Set-based)</li>
</ul>
<blockquote>
<p>RC只支持基于等式的Selector,而RS两种Selector都支持。而RC是很早版本就建议弃用的特征,因此实际项目中强烈建议使用<code>Deployment</code>来代替<code>Repliation Controller (RC)</code></p>
</blockquote>
<h3 id="121-基于等式的selector">1.2.1. 基于等式的Selector</h3>
<p>上文中创建RC的例子中的使用的就是基于等式的Selector。基于等式的Selector通过等式类的表达式来进行筛选。例如:</p>
<ul>
<li>app=nginx 选择所有Label中key为app,value为nginx的对象。</li>
<li>env!=dev 选择所有Label中key为env,value不等于dev的对象。</li>
</ul>
<h3 id="122-基于集合的selector">1.2.2. 基于集合的Selector</h3>
<p>基于集合的Selector通过集合操作的表达式来进行筛选。例如</p>
<ul>
<li>
<p>name in (redis-master, redis-slave) 选择所有Label中key为name,并且value为redis-master或redis-slave的对象。</p>
</li>
<li>
<p>env not in (dev) 选择所有Label中key为env,并且value不为dev的对象。</p>
</li>
</ul>
<blockquote>
<p>使用Label可以给对象创建一组或多组标签,Service,ReplicationController ReplicaSet,Deployment等组件则通过Label Selector来定位需要管理的对象,Label和Label Selector共同构成了Kubernetes系统中最核心的应用模型,使得对象能够精细分组,同时实现了集群的高可用性。</p>
</blockquote><br><br>
来源:https://www.cnblogs.com/tylerzhou/p/11020761.html
頁:
[1]