k8s知识

共享网络

每个Pod 里,额外起一个Infra container小容器来共享整个Pod的Network Namespace
Infra container 是一个非常小的镜像,大概 100~200KB 左右,是一个汇编语言写的、永远处于“暂停”状态的容器。由于有了这样一个Infra container之后,其他所有容器都会通过Join Namespace的方式加入到Infra container的Network Namespace中
整个 Pod 里面,必然是 Infra container 第一个启动

共享存储

 Pod来给容器共享存储可以通过挂载同一个Volume(EmptyDir)来解决

容器设计模式

Sidecar边车模式,执行主业务容器所需要的一些辅助工作
(1)需要在主业务容器启动前做一些前置准备可使用Init Conainer来解决
(2)日志收集,转发到ELK集群,打包进Pod里做收集工作(Fluentd)
(3)监控业务,将监控组件或者监控脚本装进Sidecar容器与主容器进行协作
(4)Proxy代理:代理容器能够实现对业务容器屏蔽被代理的服务集群,简化业务代码实现的逻辑
(5)适配器容器:将业务容器暴露出来的接口转换成另一种模式,比如业务容器暴露接口/metrics,监控系统升级需要访问/health才能够访问,这时候Sidecar容器就可以起到转发请求的作用,且由于Pod之间是Localhost直接通信,不存在性能损耗。

管理模式

Deployment只负责管理不同版本的ReplicaSet,由ReplicaSet来管理Pod副本数,每个RS对应了Deployment template的一个版本,一个RS下的Pod的都是同一版本,Template Hash都是一样的
Deployment负责创建ReplicaSet,ReplicaSet负责创建Pod
Deployment 发布部署的根本原理是调整不同版本的ReplicaSet的终态副本数,回滚也是通过回滚到不同版本的ReplicaSet

image

Deployment控制器

控制器都是通过 Informer 中的 List-Watch机制 对订阅到的事件 通过注册的Event Handler 进行处理

Deployment 控制器会将 DP 和 RS 的Event加入到队列,Deployment Controller从队列中取出事件后会判断Paused是否为True来决定是更新ReplicaSet

注意:Deployment Controller主要负责管理Deployment对象,创建和管理ReplicaSet,并不会直接对Pod资源变更做出反应,而是监控和管理ReplicaSet

image

ReplicaSet控制器

ReplicaSet controller只管理副本数,Deployment 控制器负责ReplicaSet版本管理

Spec字段解析

(1)inReadySeconds:Deployment 就一定会等到 Pod ready 超过MinReadySeconds才会认为是Available的,Available的前提是Pod ready
(2)revisionHistoryLimit:保留历史 revision,即保留历史 ReplicaSet 的数量,默认值为 10 个
(3)paused:paused 是标识,Deployment 只做数量维持,不做新的发布
(4)progressDeadlineSeconds:当 Deployment 处于扩容或者发布状态时,如果超过DeadlineSeconds还处于 processing,那么 controller 将认为这个 Pod 会进入 failed 的状态

Deployment更新升级策略字段解析

MaxUnavailable:滚动过程中最多有多少个 Pod 不可用
MaxSurge:滚动过程中最多存在多少个 Pod 超过预期 replicas 数量
在生产环境中,如果资源足够,注重服务可用性,MaxUnavailable 可设置25%以下、MaxSurge可设置50%以上

image

DaemonSet控制器

(1)保证集群内的每一个节点都运行一组相同的Pod
(2)保证新加入集群节点自动创建相应DaemonSet的Pod
(3)在节点移除集群时自动删除对应Pod
(4)监控Pod状态,如Deployment一样保持DaemonSet Pod的数量

适用于:(1)日志Fluentd(2)持久化存储NFS(3)性能Metricbeat

配置管理

可变配置就用 ConfigMap
敏感信息是用 Secret
身份认证是用 ServiceAccount 这几个独立的资源来实现的
资源配置是用 Resources
安全管控是用 SecurityContext
前置校验是用 InitContainers 这几个在 spec 里面加的字段,来实现的这些配置管理
posted @ 2024-06-16 16:22  付同學  阅读(6)  评论(0编辑  收藏  举报