【K8S】K8S 基础概念学习

容器编排与作业管理
Deployment
多副本,水平扩展
滚动更新
创建一个多复本应用首选的方式就是 Deplyment,Deployment 内部使用 ReplicaSet 实现。
Deployment 实际上是一个两层控制器:
它通过 ReplicaSet 的个数来描述应用的版本;
它通过 ReplicaSet 的属性,比如 replicas的值,来保证 Pod 的副本数量。
Deployment 控制 ReplicaSet 版本,ReplicaSet 控制 Pod 副本数量。
ReplicaSet

StatefulSet
核心功能:通过某种方式记录 Pod 的拓扑状态或者存储状态,然后在 Pod 被重新创建时,能够为新 Pod 恢复这些状态。这里的状态包括拓扑状态和存储状态。
稳定、唯一的网络标识符
稳定、持久的存储
有序的部署、删除和扩缩容
有序的滚动更新
如何实现:
StatefuleSet 的控制器直接管理 Pod.
拓扑状态:StatefulSet 为每个 Pod 维护了一个粘性 ID 编号,无论怎么调度,每个 Pod 都有一个永远不变的 ID.
存储状态:为每个 Pod 分配并创建一个同样编号的 PVC。(这样,Kubernetes 就可以通过 Persistent Volume 机制为这个 PVC 绑定上对应的 PV,从而保证了每一个 Pod 都拥有一个独立的 Volume。)
所以即使 Pod 被删,当被重新创建出来的时候,kubernets 会为它找到同样编号的 PVC, 挂载 PVC 对应的 Volume.
通过 Headless Service 为每个有编号的 Pod, 生成带有同样编号的 DNS 记录。(只要 StatefulSet 能够保证这些 Pod 名字里的编号不变,那么 Service 里类似于 web-0.nginx.default.svc.cluster.local 这样的 DNS 记录也就不会变)
StatefulSet 这个控制器的主要作用之一,就是使用 Pod 模板创建 Pod 的时候,对它们进行编号,并且按照编号顺序逐一完成创建工作。
而当 StatefulSet 的“控制循环”发现 Pod 的“实际状态”与“期望状态”不一致,需要新建或者删除 Pod 进行“调谐”的时候,它会严格按照这些 Pod 编号的顺序,逐一完成这些操作。
与此同时,通过 Headless Service 的方式,StatefulSet 为每个 Pod 创建了一个固定并且稳定的 DNS 记录,来作为它的访问入口。
实际上,在部署“有状态应用”的时候,应用的每个实例拥有唯一并且稳定的“网络标识”,是一个非常重要的假设。
StatefulSet 其实是一种特殊的 Deployment,只不过这个“Deployment”的每个 Pod 实例的名字里,都携带了一个唯一并且固定的编号。这个编号的顺序,固定了 Pod 的拓扑关系;这个编号对应的 DNS 记录,固定了 Pod 的访问方式;这个编号对应的 PV,绑定了 Pod 与持久化存储的关系。所以,当 Pod 被删除重建时,这些“状态”都会保持不变。
Headless Service
Persisted Volume Claim (PVC) 对象

Persisted Volume 对象
声明式 API 与 Kubernets 编程范式
在 Kubernetes 项目中,一个 API 对象在 Etcd 里的完整资源路径,是由:Group(API 组)、Version(API 版本)和 Resource(API 资源类型)三个部分组成的。

Operator: 聪明的微创新
Operator 的工作原理:
实际上是利用了 Kubernetes 的自定义 API 资源(CRD),来描述我们想要部署的“有状态应用”;
然后在自定义控制器里,根据自定义 API 对象的变化,来完成具体的部署和运维工作。
Controller Manager
控制器模型
控制循环 control loop
基于 etcd watch 的实现方式:

kube-proxy :

容器网络:Service 是如何被发现的?
Service 是由 kube-proxy 组件,加上 iptables 来共同实现的
访问 Service VIP 的 IP 包经过上述 iptables 处理之后,就已经变成了访问具体某一个后端 Pod 的 IP 包了。不难理解,这些 Endpoints 对应的 iptables 规则,正是 kube-proxy 通过监听 Pod 的变化事件,在宿主机上生成并维护的。
Informar 和 缓存机制 - ListAndWatch 机制

所谓 Informer,其实就是一个带有本地缓存和索引机制的、可以注册 EventHandler 的 client。
client-go 与 controller runtime 是什么关系?
kubernetes 提供了 client-go 以便使用 go 语言进行二次开发。
K8s 系统使用 client-go 作为 Go语言的官方编程式交互客户端库, 提供对 K8s API Server 服务的交互访问
k8s 其他组件都是通过 cleint-go informer 机制与 K8s 的 API-Server 进行通信的
controller-runtime 是社区封装的一个控制器处理框架。
controller runtime 和 kubebuilder 是什么关系?
kubebuilder 基于 controller runtime 做了一些封装,目的是快速生成 operator 代码。
kustomize 是什么东西