14、kubeadm流程与组件解析
1、梳理基本流程
1.1、Master节点启动相关流程
1、当前环境检查,确保当前主机可以部署kubernetes 2、生成kubernetes对外提供服务所需要的各种私钥以及数字证书 3、生成kubernetes控制组件的kubeconfig文件 4、生成kubernetes控制组件的pod对象需要的manifest文件 5、为集群控制节点添加相关的标识,不让主节点参与node角色工作【即打上污点】 6、生成集群的统一认证的token信息,方便其他节点加入到当前的集群 7、进行基于TLS的安全引导相关的配置、角色策略、签名请求、自动配置策略 8、为集群安装coreDNS、kube-porxy、dashboard、flannel等插件。
1.2、node节点加入流程
1、当前环境检查,读取相关集群配置信息。 2、获取集群相关数据后启动kubelet服务。 3、获取认证信息后,基于证书方式进行通信。
2、流程解析
2.1、Master流程解析
2.1.1、当前环境检查,确保当前主机可以部署kubernetes
主要检查系统环境是否符合安装。 如: 1、对于交换分区的检查报错,可以通过 --ignore-preflight-errors=Swap 省略检查。
2.1.2、生成kubernetes对外提供服务所需要的各种私钥以及数字证书
[root@master3 ~]# ls /etc/kubernetes/pki/ apiserver.crt apiserver.key ca.crt front-proxy-ca.crt front-proxy-client.key apiserver-etcd-client.crt apiserver-kubelet-client.crt ca.key front-proxy-ca.key sa.key apiserver-etcd-client.key apiserver-kubelet-client.key etcd front-proxy-client.crt sa.pub
2.1.3、生成kubernetes控制组件的kubeconfig文件及相关的启动配置文件
[root@master3 ~]# ls /etc/kubernetes admin.conf controller-manager.conf kubelet.conf manifests pki scheduler.conf
2.1.4、kubelet采集的属性信息
[root@master3 ~]# cat /var/lib/kubelet/config.yaml apiVersion: kubelet.config.k8s.io/v1beta1 authentication: anonymous: enabled: false webhook: cacheTTL: 0s enabled: true x509: clientCAFile: /etc/kubernetes/pki/ca.crt authorization: mode: Webhook webhook: cacheAuthorizedTTL: 0s cacheUnauthorizedTTL: 0s cgroupDriver: systemd clusterDNS: - 10.96.0.10 clusterDomain: cluster.local cpuManagerReconcilePeriod: 0s evictionPressureTransitionPeriod: 0s fileCheckFrequency: 0s healthzBindAddress: 127.0.0.1 healthzPort: 10248 httpCheckFrequency: 0s imageMinimumGCAge: 0s kind: KubeletConfiguration logging: flushFrequency: 0 options: json: infoBufferSize: "0" verbosity: 0 memorySwap: {} nodeStatusReportFrequency: 0s nodeStatusUpdateFrequency: 0s rotateCertificates: true runtimeRequestTimeout: 0s shutdownGracePeriod: 0s shutdownGracePeriodCriticalPods: 0s staticPodPath: /etc/kubernetes/manifests streamingConnectionIdleTimeout: 0s syncFrequency: 0s volumeStatsAggPeriod: 0s
2.1.5、kubeadm的启动参数
[root@master3 ~]# cat /var/lib/kubelet/kubeadm-flags.env KUBELET_KUBEADM_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock
--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.8"
2.1.6、生成kubernetes控制组件的pod对象需要的manifest文件
# 配置信息的目录 [root@master3 ~]# ls /etc/kubernetes/manifests/ etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml # 查看配置信息 [root@master1 ~]# kubectl get configmaps -n kube-system | grep kubelet kubelet-config 1 21h # 查看配置的位置 [root@master1 ~]# kubectl describe configmaps kubelet-config -n kube-system | grep static staticPodPath: /etc/kubernetes/manifests
2.1.7、对etcd查询数据
# 进入etcd pods里面 kubectl -n kube-system exec -it etcd-master1 /bin/sh # 设置链接的别名 alias etcdctl='etcdctl \ --key=/etc/kubernetes/pki/etcd/server.key \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --endpoints 192.168.10.26:2379,192.168.10.27:2379,192.168.10.28:2379' # 查询etcd成员 sh-5.1# etcdctl -w table member list +------------------+---------+---------+----------------------------+----------------------------+------------+ | ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER | +------------------+---------+---------+----------------------------+----------------------------+------------+ | 49a8f24b174de1fa | started | master2 | https://192.168.10.27:2380 | https://192.168.10.27:2379 | false | | 4a182a6f514944cc | started | master1 | https://192.168.10.26:2380 | https://192.168.10.26:2379 | false | | fe67d236c75cf789 | started | master3 | https://192.168.10.28:2380 | https://192.168.10.28:2379 | false | +------------------+---------+---------+----------------------------+----------------------------+------------+ # 查询etcd点的状态 sh-5.1# etcdctl -w table endpoint status +--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | 192.168.10.26:2379 | 4a182a6f514944cc | 3.5.6 | 3.4 MB | false | false | 8 | 114792 | 114792 | | | 192.168.10.27:2379 | 49a8f24b174de1fa | 3.5.6 | 3.3 MB | false | false | 8 | 114792 | 114792 | | | 192.168.10.28:2379 | fe67d236c75cf789 | 3.5.6 | 3.4 MB | true | false | 8 | 114792 | 114792 | | +--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ # 查询configmaps的相关名字 sh-5.1# etcdctl get /registry/configmaps/kube-system/ --prefix=true --keys-only /registry/configmaps/kube-system/coredns /registry/configmaps/kube-system/extension-apiserver-authentication /registry/configmaps/kube-system/kube-flannel-cfg /registry/configmaps/kube-system/kube-proxy /registry/configmaps/kube-system/kube-root-ca.crt /registry/configmaps/kube-system/kubeadm-config /registry/configmaps/kube-system/kubelet-config
2.1.8、为集群控制节点添加相关的标识,不让主节点参与node角色工作
[root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready control-plane 21h v1.25.7 master2 Ready control-plane 21h v1.25.7 master3 Ready control-plane 21h v1.25.7 node1 Ready <none> 20h v1.25.7 node2 Ready <none> 20h v1.25.7 [root@master1 ~]# kubectl describe nodes | grep -i taint Taints: node-role.kubernetes.io/control-plane:NoSchedule Taints: node-role.kubernetes.io/control-plane:NoSchedule Taints: node-role.kubernetes.io/control-plane:NoSchedule Taints: <none> Taints: <none>
2.1.9、生成集群的统一认证的token信息,方便其他节点加入到当前的集群
[root@master1 ~]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS 60gie1.innb6kpy6e4cp6lk 3h 2023-03-17T12:52:42Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token ty35j9.vh29s063rqey0c2r 2h 2023-03-17T12:07:10Z authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
2.1.10、进行基于TLS的安全引导相关的配置、角色策略、签名请求、自动配置策略
# 查看角色相关信息 [root@master2 ~]# kubectl get role -n kube-system NAME CREATED AT extension-apiserver-authentication-reader 2023-03-16T12:07:00Z kube-proxy 2023-03-16T12:07:10Z kubeadm:kubelet-config 2023-03-16T12:07:08Z kubeadm:nodes-kubeadm-config 2023-03-16T12:07:08Z system::leader-locking-kube-controller-manager 2023-03-16T12:07:00Z system::leader-locking-kube-scheduler 2023-03-16T12:07:00Z system:controller:bootstrap-signer 2023-03-16T12:07:00Z system:controller:cloud-provider 2023-03-16T12:07:00Z system:controller:token-cleaner 2023-03-16T12:07:00Z [root@master2 ~]# cat /etc/kubernetes/kubelet.conf apiVersion: v1 clusters: ...
2.1.11、为集群安装DNS和kube-porxy插件
[root@master1 ~]# kubectl get pod -n kube-system | egrep 'proxy|core' coredns-75c9cf9bd7-qcwcf 1/1 Running 0 21h coredns-75c9cf9bd7-sdsq5 1/1 Running 0 21h kube-proxy-kmw24 1/1 Running 0 21h kube-proxy-lmsts 1/1 Running 0 21h kube-proxy-t7n6h 1/1 Running 0 20h kube-proxy-tgzrs 1/1 Running 0 21h kube-proxy-zszhv 1/1 Running 0 20h
2.2、Node流程解析
2.2.1、当前环境检查,读取相关集群配置信息
kubeadm join vip.k8test.com:6443 --token ci73xv.kp35on7vpn75adh4 \ --discovery-token-ca-cert-hash sha256:7f70fccc24d51c0f7a845258204c7fb0a25ed4a029d419d4535728dc2346632a
[root@master1 ~]# kubectl -n kube-system get cm kubeadm-config -o yaml # 查询kubeadm配置信息
2.2.2、获取集群相关数据后启动kubelet服务
[root@master1 ~]# ls /var/lib/kubelet/ config.yaml device-plugins memory_manager_state plugins pod-resources cpu_manager_state kubeadm-flags.env pki plugins_registry pods
2.2.3、获取认证信息后,基于证书方式进行通信
# 加入集群时有提示
3、组件解析
3.1、组件结构
3.1.1、基本组件结构图
3.1.2、组件存活查询的介绍
生产中,当Node节点满足上面三个组件的正常运行,默认kubelet会自动向master注册自己,这样 Node节点就可以动态而且自动的添加到Kubernetes集群中,同时会定时向master汇报自己当前的状态,以 维持整个集群的正常运行。然后kubelet接收从apiserver传递过来的任务并在本地执行。 默认情况下,k8s集群关于节点的控制,是通过 Node Controller 来进行统一管理的。原则上,每 10s 节点上的kubelet将本地节点的状态信息发送给master上,如果超过4次master节点没有收到 kubelet发送的节点状态信息,master就会将当前节点置为NotReady状态。 由于每次传递的状态信息非常多,所以每10s传递一次数据信息的话,导致资源浪费严重。k8s 1.13版 本之后,引入了与节点配套使用的资源对象 -- 节点租约。 # 查询节点状态 [root@master1 ~]# kubectl get ns NAME STATUS AGE default Active 22h kube-flannel Active 21h kube-node-lease Active 22h kube-public Active 22h kube-system Active 22h kubernetes-dashboard Active 140m # 查询节点状态和详细信息 [root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready control-plane 22h v1.25.7 master2 Ready control-plane 21h v1.25.7 master3 Ready control-plane 21h v1.25.7 node1 Ready <none> 21h v1.25.7 node2 Ready <none> 21h v1.25.7 租约原理 1、kubelet仍然每10s向master节点的apiserver同步一下节点状态只不过更新的是租约的有效期限,租约的同步间隔默认是 40s。 2、默认采集到的信息保持到租约对象中。 3、一旦租约存储的数据发生改变的时候 或者 每5分钟才会将node的status信息上报给master节点
3.1.3、组件基本流程图
3.1.4、CNI、CSI、CRI术语介绍
kubernetes的设计初衷是支持可插拔架构,从而利于扩展kubernetes的功能。在此架构思想下, kubernetes提供了3个特定功能的接口,分别是容器网络接口CNI、容器运行时接口CRI和容器存储接口 CSI。kubernetes通过调用这几个接口,来完成相应的功能。
1、CNI - Container Network Interface kubernetes 对于网络的解决方案,只是预留了网络接口,只要符合CNI标准的解决方案都可以使用
2、CSI - Container Storage Interface kubernetes 对于存储的解决方案,只是预留了存储接口,只要符合CSI标准的解决方案都可以使用
3、CRI - Container Runtime Interface kubernetes 对于容器的解决方案,只是预留了容器接口,只要符合CRI标准的解决方案都可以使用
3.1.5、集群节点运行的基本逻辑图
3.2、组件间的通信
3.2.1、组件间通信流程图
三套CA机制介绍 etcd-ca ETCD集群内部的 TLS 通信 kubernetes-ca kubernetes集群内部节点间的双向 TLS 通信 front-proxy-ca Kubernetes集群与外部扩展服务简单双向 TLS 通信
3.3、kubeadm集群结构图
两个参数区分好的 物理主机网络 1、svc网络 --service-cidr=10.96.0.0/12 2、pods网络 --pod-network-cidr=10.244.0.0/16
3.4、企业内dns解决方案
3.4.1、DNS流程图
3.4.2、DNS对应的解析方案
CoreDNS
kubernetes集群内部的pod资源的主机名解析
内网DNS
项目网站架构内部的主机名解析
公网DNS
项目依赖的第三方地址的域名解析