Kubernetes
初始化
初始化的阶段
- preflight 运行安装前检查
- Certificate generation 生成证书
- Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file 生成建立控制平面所需的所有kubecconfig文件和admin kubecconfig文件
- kubelet-start Write kubelet settings and (re)start the kubelet 启动
kubelet
- etcd 生成建立控制平面所需的所有静态Pod清单文件
- 更新kubeadm与kubelet的配置文件
- 上传证书到kubeadm-cert
- 将节点标记为控制平面
- 生成token,用于将节点加入到集群
- TLS引导后更新kubelet相关的设置
- 安装通过一致性测试所需的附加组件
- 显示控制与工作节点连接的指令
解析:
-
在做出变更前运行一系列的预检项来验证系统状态。一些检查项目仅仅触发警告, 其它的则会被视为错误并且退出 kubeadm,除非问题得到解决或者用户指定了
--ignore-preflight-errors=<错误列表>
参数。 -
生成一个自签名的 CA 证书来为集群中的每一个组件建立身份标识。 用户可以通过将其放入
--cert-dir
配置的证书目录中(默认为/etc/kubernetes/pki
) 来提供他们自己的 CA 证书以及/或者密钥。 APIServer 证书将为任何--apiserver-cert-extra-sans
参数值提供附加的 SAN 条目,必要时将其小写。 -
将 kubeconfig 文件写入
/etc/kubernetes/
目录以便 kubelet、控制器管理器和调度器用来连接到 API 服务器,它们每一个都有自己的身份标识,同时生成一个名为admin.conf
的独立的 kubeconfig 文件,用于管理操作。 -
为 API 服务器、控制器管理器和调度器生成静态 Pod 的清单文件。假使没有提供一个外部的 etcd 服务的话,也会为 etcd 生成一份额外的静态 Pod 清单文件。
静态 Pod 的清单文件被写入到
/etc/kubernetes/manifests
目录; kubelet 会监视这个目录以便在系统启动的时候创建 Pod。一旦控制平面的 Pod 都运行起来,
kubeadm init
的工作流程就继续往下执行。 -
对控制平面节点应用标签和污点标记以便不会在它上面运行其它的工作负载。
-
生成令牌,将来其他节点可使用该令牌向控制平面注册自己。 如kubeadm token文档所述, 用户可以选择通过
--token
提供令牌。 -
为了使得节点能够遵照启动引导令牌 和TLS 启动引导 这两份文档中描述的机制加入到集群中,kubeadm 会执行所有的必要配置:
-
创建一个 ConfigMap 提供添加集群节点所需的信息,并为该 ConfigMap 设置相关的 RBAC 访问规则。
-
允许启动引导令牌访问 CSR 签名 API。
-
配置自动签发新的 CSR 请求。
更多相关信息,请查看 kubeadm join。
-
-
通过 API 服务器安装一个 DNS 服务器 (CoreDNS) 和 kube-proxy 附加组件。 在 Kubernetes 版本 1.11 和更高版本中,CoreDNS 是默认的 DNS 服务器。 请注意,尽管已部署 DNS 服务器,但直到安装 CNI 时才调度它。
CRI
容器运行时接口(Container Runtime Interface) kubelet在每个节点上运行. 管理和维护Pod的状态 CRI是kubelet与容器主要的通信协议, 所以只要是实现了kubernetes的CRI通信协议的容器都可以作为kubelet的容器运行时
Docker不支持CRI, Kubernetes为了兼容Docker, 开发了Dockershim Kubernetes v1.24及之后版本已经抛弃对Docker的支持(从Kubernetes项目移除Dockershim模块)
Namespace
命名空间: 利用不用的命名空间来区别不同的环境, 达到资源隔离
特性
包含:
- Service
- Deployment 不包含:
- StorageClass、
- Node、
- PersistentVolume
默认自带四个命名空间:
- default: 用户默认的命名空间, 即不指定命名空间的情况下创建的Pod,Service,Deployment等
- kube-system: kubernetes系统对象(控制平面和Node组件)的命名空间
- kube-public: 公共命名空间, 所有(包括未经验证的)用户都可以读取到. 作为公用可见和可读的资源
- kube-node-lease: 租约, 对象使用的命名空间。每个节点都有一个关联的 lease 对象,lease 是一种轻量级资源。lease对象通过发送心跳 ,检测集群中的每个节点是否发生故障
配置对象
labels
标签, 用户给资源标记
例子: 给nginx对象标记名称app为nginx
, 环境env为生产环境production
metadata:
label:
app: nginx
env: production
apiVersion
kubernetes API版本
kind
对象类别