名词
指令式(命令),指令式对象配置(yaml),声明式(描述目标)
网桥,虚拟网桥。在第几层协议?
Unix Domain Socket(UDS)
UDS 与 TCP/IP 套接字的区别是?
UDS 指定路径监听。l, err := net.Listen("unix", s.path)
golang 的 json 内联
本文概念
对象ID,集群ID,标签,注解,finalizers,属主,附属。
控制面组件:apiserver,etcd,kube-scheduler,kube-controller-manager, cloud-controler-manager
节点层面组件: kubelete,kube-proxy,container-runtime,addons(DaemonSet,Deplyment)
其他组件:DNS,大盘,CNI......
功能点
default
标签机制(两个 label 与 注解)
垃圾清理机制
容器网络管理,容器生命周期管理,容器性能管理。
cgroupv2
pod网络管理,pod声明周期管理,pod性能管理。
租约机制
调协机制
扩缩容机制
节点管理,节点生命周期管理,节点扩缩容。
组件之间通信机制
镜像管理
存储管理
内存管理
其他硬件管理
网络管理
负载均衡
网关管理
业务配置管理
安全管理
调度策略
集群管理
二开管理,Operator,自定义资源,计算存储网络拓展。
命令行工具设计
时间同步问题
scheduler, controller-manager ,coreDNS,etcd,proxy
kubeadmin workflows 机制
流程
安装流程简述
安装容器运行时
安装 kubeadm,kubelet,kubectl
启动 kubelet
使用 kubeadm 启动集群
kubeadmin init 流程
cmd/kubeadm/app/cmd.go 的 newCmdInit 定义了工作流程。
启动前的检查 preflight.go
获取证书相关 certs.go
生成 kubenetes 所需要的所有配置文件, kubeconfig.go
生成 etcd 静态 pod 的 manifest 文件 etcd.go
生成 控制面组件的静态 pod manifest 文件
设置 kubelet 并重启 kubelet。 Q:这里会应用 上边已经创建的静态 pod 文件并启动对应的 pod 吗 A:正确。
等待kubelet重启所引导的静态pod服务启动成功。
上传 cert 文件到 Q:到哪?
标记控制平面组件 Q:具体怎么个流程?
生成 node 的 token,Q:用来做什么?
TLS启动后做一些事,Q:具体怎么个事?
安装一些插件
展示集群信息
主流程启动
安装 kubectl 工具
安装 kubelet 并启动
安装 kubeadm 工具
启动 etcd 以及其他控制平面组件
etcd 启动流程
zz_generated.conversion.go
生成 etcd 目录
往 kubeadmin 的manifest目录写静态 pod 文件,pod文件是动态生成的。
apiserver 启动流程
三个 server:
kubeAPIServer:提供 restful 服务,管理资源。
APIExtensionsServer:管理自定义资源
AggregatorServer:聚合服务器,负责请求的分发。
NewConfig 生成这三个 server 的配置
config.Complete 补齐没有配置的配置
CreateServerChain
Q:GenericAPIServer 是什么
A:GenericAPIServer contains state for a Kubernetes cluster api server.
Q:k8s 的 open api 是什么
A:
apiserver同样也是被 kubeadmin 工具启动起来的。入口在 cmd/kube-apiserver/app/server.go run方法。
生成配置。
给没配置的配置配上配置。
注册 openAPI 服务,启动 openAPI controller
启动 apiserver
配置生成
apiserver 有个大配置,app/config.Config。这个大配置里分为五个中配置。
apiserver run
定义 run 退出需要清理的机制
如果开启了 UNIX socket debug 模式,开启一个 UNIX SOCKET 用于 DEBUG
启动一个协程,监听所有的 http server 都已经准备好了。
启动一个协程,监听 stopCh,如果要停,shutdownInitiatedCh.Signal()
如果需要的话,开启审计 BE。(Q:审计BE有什么用?)
kubelet 启动流程
controller-manager 启动流程
静态 pod 启动流程
使用cgroup驱动流程
Q:什么是 cgroup驱动?
A:调用 cgroup 的 sdk 。
Q:kubelet 需要 cgroup 干嘛?
A:使用 cgroup 对容器的资源做限制。
使用 core DNS 的流程
Q:什么是 core DNS?
A:一个用 golang 写的 DNS serve
CoreDNS: DNS and Service Discovery。 https://github.com/coredns/coredns.io/tree/master/content/manual
core DNS 被 kubernetes 包括进来,是 k8s 的一部分。kubernetes
Q:coreDNS 在 k8s 中的作用是什么?
证书管理流程
使用 kubeadm 进行证书管理 | Kubernetes
配置文件汇总
kubeadm-config.yaml
静态 POD 文件
性能
依赖
cgroupfs,cgroup v2,容器运行时,