blog/source/_posts/Kubernetes-foundations.md
2021-05-13 10:19:30 +08:00

87 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Kubernetes基础术语
date: 2021-04-01 17:03:05
tags: [DevOps, Kubernetes]
categories:
- [DevOps, Kubernetes]
keywords: Kubernetes,k8s,术语,pod
---
要完成一个服务在Kubernetes上的部署必须先了解以下关于Kubernetes中的知识点这些知识点决定着一个应用在Kubernetes上的部署行为。
<!-- more -->
## 术语集
* **Master**Kubernetes中的集群控制节点所有的集群控制命令都是在Master节点上运行。
* **Node**Kubernetes集群中的实体机器或者虚拟机是Kubernetes中的工作负载节点。
* **Namespace**对一组资源和对象的抽象集合通常用来在Kubernetes内部划分不同的项目组。默认创建的资源都是隶属于`default`命名空间的。
* **Pod**Kubernetes中最基础的服务单元其中包含至少一个容器。
* **Label**,标签是一个键值对,每个资源可以有任意数量的标签
* **Replication Controller**,即**RC**用于控制Pod部署的副本控制器现在已经建议使用**Deployment**替代。
* **Replica Set**最新一代的Pod副本控制器。与RC相比提供了更新的选择器支持。
* **Deployment**用于控制Kubernetes集群中Pod的编排内部使用**Replica Set**实现。
* **StatefulSet**运行一个或者多个能够被跟踪应用状态的Pod适用于Pod需要把数据做永久存储的需求。StatefulSet中的Pod可以与PersistentVolume对应来使得Pod的状态得以保存。
* **DaemonSet**用于在Node上提供支持设施的Pod集群会自动在符合条件的每一个Node上运行一个Pod。
* **Service**定义Kubernetes上一个服务的入口对来自客户端的访问进行请求转发和负载均衡控制。Service都拥有一个唯一的名称拥有一个虚拟IP并且会被映射在一组Pod上。
* **Endpoint**Kubernates中用来记录一个Service所对应的所有Pod的访问地址即所有Pod的IP地址和端口。只有Service中配置了Selector才会自动创建Endpoint。
## 网络IP类型
在Kubernetes中Pod、Node和Cluster这三层元素就会引入以下三个IP系统。
* **Node IP**这是Kubernetes集群中每个Node的物理网卡地址。
* **Pod IP**每个Pod都在Kubernetes集群中拥有一个独一无二的IP地址可以用来支持Pod在集群中的相互访问。Pod IP是一个虚拟的二层网络。
* **Cluster IP**Kubernetes集群中的一个Service的IP地址。Cluster IP是一个完全虚拟的IP无法被Ping到只能用于支持Kubernetes内部服务之间的相互访问。
## Label
Label允许在Kubernetes资源上附加对于系统或者用户有意义的标示性属性方便对Kubernetes资源进行分组管理。 这些属性对不会直接对Kubernetes核心组件产生语义不过可能间接地被Kubernetes核心组件处理产生效果。
Label key由两部分组成可选的prefix和name它们之间通过`/`连接。下面对它们的语法规则进行对比:
| | Prefix | Name |
| :------- | :-------- | :--------------- |
| 存在性 | 可选 | 必需 |
| 最大长度 | 253 | 63 |
| 可用字符 | DNS子域名 | 字母与数字 |
| 分割符 | `.` | `-`, `_`, `.` |
| 限制 | 以`/`结尾 | 以字母开头和结尾 |
Label可以让用户将他们自己的有组织目的的结构以一种松耦合的方式应用到系统的对象上且不需要客户端存放这些对应关系mappings
服务部署和批处理管道通常是多维的实体(例如多个分区或者部署,多个发布轨道,多层,每层多微服务)。管理通常需要跨越式的切割操作,这会打破有严格层级展示关系的封装,特别对那些是由基础设施而非用户决定的很死板的层级关系。
在习惯上以下Label都是比较常用的。
* "release" : "stable" "release" : "canary"
* "environment" : "dev""environment" : "qa""environment" : "production"
* "tier" : "frontend""tier" : "backend""tier" : "cache"
* "partition" : "customerA" "partition" : "customerB"
* "track" : "daily" "track" : "weekly"
### 选择器
与Name和UID不同标签不需要有唯一性。一般来说我们期望许多对象具有相同的标签。通过标签选择器Labels Selectors客户端/用户能方便辨识出一组对象。标签选择器是Kubernetes中核心的组成部分。
Kubernetes API目前支持两种选择器equality-based基于相等和set-based基于集合的。标签选择器可以由逗号分隔的多个requirements 组成。在多重需求的情况下必须满足所有要求因此逗号分隔符作为AND逻辑运算符。
* 一个为空的标签选择器即有0个必须条件的选择器会选择集合中的每一个对象。
* 一个null型标签选择器仅对于可选的选择器字段才可能不会返回任何对象。
> 注意:两个控制器的标签选择器不能在命名空间中重叠。
基于相等的或者不相等的条件允许用标签的keys和values进行过滤。匹配的对象必须满足所有指定的标签约束尽管他们可能也有额外的标签。有三种运算符是允许的“=”,“==”和“!=”。
* `=`被选择的资源必须带label key并且value必须相等。
* `==`被选择的资源必须带label key并且value必须相等。
* `!=`被选择的资源不带label key或者带label key但是value不相等。
基于集合的标签条件允许用一组value来过滤key。支持三种操作符`in``notin`和 `exists`(仅针对于key符号) 。
* `in`被选择的资源必须带label key并且value在集合范围内。
* `notin`被选择的资源不带label key或者带label key但是value不在集合范围内。
* `exists`被选择的资源必须带label key不检查value。Label key前加`!`表示不存在则被选择的资源必须不带label key。
Deployment和Service两种对象的Label选择器是使用map定义在json或者yaml文件中的它们只支持Equality-based的条件。JobDeploymentReplica Set和Daemon Set支持Set-based条件。注意Deployment中的`matchLabels`属性只支持Equality-based条件但`matchExpressions`属性支持Set-based条件。
> 不管是在`matchLabels`还是在`matchExpressions`中的选择器条件,都必须被同时满足才能够完成匹配。