欢迎光临散文网 会员登陆 & 注册

【K8S】K8S 基础概念学习

2022-07-24 14:27 作者:九霄如歌  | 我要投稿


公众号:鸣霄溪

容器编排与作业管理

Deployment

  • 多副本,水平扩展

  • 滚动更新


创建一个多复本应用首选的方式就是 Deplyment,Deployment 内部使用 ReplicaSet 实现。


Deployment 实际上是一个两层控制器:

  1. 它通过 ReplicaSet 的个数来描述应用的版本;

  2. 它通过 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

  1. 控制器模型

  • 控制循环 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 是什么东西


【K8S】K8S 基础概念学习的评论 (共 条)

分享到微博请遵守国家法律