概要

kubeadm init是Kubernetes集群初始化的命令。它负责创建并启动一个Kubernetes集群的控制平面。

在这里插入图片描述

1. 环境检查

kubeadm init会首先检查一些条件,例如系统配置和环境变量是否满足要求,以确保能够成功初始化集群。

[init] Using Kubernetes version: v1.20.2
[preflight] Running pre-flight checks
	[WARNING SystemVerification]: this Docker version is not on the list of validated versions: 25.0.2. Latest validated version: 19.03
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'

为创建一个Kubernetes集群拉取镜像,依赖网络连接等1~2分钟,或者在先前用kubeadm config images pull准备好镜像。

2. 生成证书

kubeadm init会生成用于集群身份验证和通信的TLS证书。这些证书用于保证集群的安全性。 这样,kubeadm就会自动跳过证书生成的步骤,从而交给用户自己处理。

[certs] Using certificateDir folder "/etc/kubernetes/pki"
[certs] Generating "ca" certificate and key
[certs] Generating "apiserver" certificate and key
[certs] apiserver serving cert is signed for DNS names [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master master-virtual-machine] and IPs [10.96.0.1 192.168.159.146]
[certs] Generating "apiserver-kubelet-client" certificate and key
[certs] Generating "front-proxy-ca" certificate and key
[certs] Generating "front-proxy-client" certificate and key
[certs] Generating "etcd/ca" certificate and key
[certs] Generating "etcd/server" certificate and key
[certs] etcd/server serving cert is signed for DNS names [localhost master-virtual-machine] and IPs [192.168.159.146 127.0.0.1 ::1]
[certs] Generating "etcd/peer" certificate and key
[certs] etcd/peer serving cert is signed for DNS names [localhost master-virtual-machine] and IPs [192.168.159.146 127.0.0.1 ::1]
[certs] Generating "etcd/healthcheck-client" certificate and key
[certs] Generating "apiserver-etcd-client" certificate and key
[certs] Generating "sa" key and public key

3. 初始化etcd

kubeadm init会启动一个内嵌的etcd数据库。etcd是Kubernetes集群中用于存储配置信息的分布式键值存储系统。

4. 初始化控制平面组件

kubeadm init会启动Kubernetes控制平面组件,包括kube-apiserver、kube-controller-manager和kube-scheduler。它们负责集群的管理、调度和控制。

Master
kubelet
kube-proxy
API-Server
Controller-Manager
etcd
node

运行在master上的组件:

1️⃣ Kubernetes API Server(kube-apiserver)
Kubernetes API,集群的统一入口,各组件协调者,以HTTP API提供接口服务,Kubernetes里所有资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

2️⃣ Kubernetes Controller Manager(kube-controller-manager)
Kubernetes里所有资源对象的自动化控制中心,可以理解为资源对象的大总管

3️⃣ kube-scheduler
负责资源调度(Pod调度)的进程

运行在node上的组件:
1️⃣ kubelet
kubelet是Master在Node节点上的Agent,负责与master节点的apiserver进行通信,管理本机运行容器的生命周期,负责Pod对应容器的创建、启停等任务。同时与Master密切协作,实现集群管理的基本功能,获取Node节点上Pod的运行状态等

2️⃣ kube-proxy
在Node节点上实现Pod网络代理,实现Kubernetes Service的通信和负载均衡机制的重要组件。

在这里插入图片描述

5. 生成kubeconfig文件

kubeadm init会生成一个kubeconfig文件,用于后续的集群管理操作。kubeconfig文件包含了集群的连接信息和凭证。

[kubeconfig] Using kubeconfig folder "/etc/kubernetes"
[kubeconfig] Writing "admin.conf" kubeconfig file
[kubeconfig] Writing "kubelet.conf" kubeconfig file
[kubeconfig] Writing "controller-manager.conf" kubeconfig file
[kubeconfig] Writing "scheduler.conf" kubeconfig file


......

这些文件记录了当前Master节点的服务器地址、监视端口、证书目录等信息。这样,对应的客户端(如:scheduler和kubelet)对自动加载对应的文件,从而使其中的信息与kube-apiserver进行安全对接。

/etc/kubernetes
admin.conf
controller-manager.conf
kubelet.conf
scheduler.conf

控制面操作包括生成etcd的static pod yaml、更新kube-system命名空间下的configmap对象kubeadm-config,将该控制节点信息更新进去、将该master节点打上污点,不作为计算节点数据面使用;至此,kubeadm join流程结束。

6. 部署网络插件

安装默认插件,kubernetes默认必须安装的两个插件为:kube-proxyDNS,分别用来提供集群的服务发现和DNS功能,且均以容器镜像的方式启动。

[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
addon
CoreDNS
kube-proxy

7. 完成集群初始化

kubeadm init会输出一些信息和命令,以供用户配置集群的工作节点。这些命令需要在每个工作节点上运行,以加入集群。

`Your Kubernetes control-plane has initialized successfully!`

通过以上步骤,kubeadm init成功完成集群初始化,并提供了进一步操作集群的指导。用户可以根据输出的信息和命令,完成集群的配置和管理。

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

图文参考:

K8S 源码探秘 之 kubeadm init 执行流程分析
kubeadm工作原理-kubeadm init原理分析-kubeadm join原理分析
kubernetes各组件介绍

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐