kubeadm介绍
kubeadm是芬兰一个17岁的高中生写的一个社区项目。目前还不能用于生成环境。
kubeadm能够帮我们省去很多麻烦,而且比较接近原生部署的感觉,这对我们入门学习k8s部署来说,不失为一个利器。
用户只需要执行两条命令就可以完成k8s集群的部署:
1 | # 创建一个 Master 节点 |
那kubeadm究竟做了什么事情呢?
kubeadm init 的工作流程
- kubeadm 首先要做的,是一系列的检查工作,以确定这台机器可以用来部署 Kubernetes。例如内核版本,网络是否可用,必要的命令是否齐全等。
- 在通过了 Preflight Checks 之后,kubeadm 要为你做的,是生成 Kubernetes 对外提供服务所需的各种证书和对应的目录。kubeadm 为 Kubernetes 项目生成的证书文件都放在 Master 节点的 /etc/kubernetes/pki 目录下。
- 证书生成后,kubeadm 接下来会为其他组件生成访问 kube-apiserver 所需的配置文件。这些文件的路径是:/etc/kubernetes/xxx.conf。
接下来,kubeadm 会为 Master 组件生成 Pod 配置文件。 Master 组件 kube-apiserver、kube-controller-manager、kube-scheduler,而它们都会被使用 Pod 的方式部署起来。这些Pod并不会在此阶段被执行,而是等kubelet启动的时候,加载这些文件并执行的。由此可以看出,kubelet在k8s的地位非常高,其他master组件更像是辅助性的系统容器。
在 Kubernetes 中,有一种特殊的容器启动方法叫做“Static Pod”。它允许你把要部署的 Pod 的 YAML 文件放在一个指定的目录里。这样,当这台机器上的 kubelet 启动时,它会自动检查这个目录,加载所有的 Pod YAML 文件,然后在这台机器上启动它们。在 kubeadm 中,Master 组件的 YAML 文件会被生成在 /etc/kubernetes/manifests 路径下。比如,kube-apiserver.yaml。
1
2ls /etc/kubernetes/manifests/
etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml然后,kubeadm 就会为集群生成一个 bootstrap token。在后面,只要持有这个 token,任何一个安装了 kubelet 和 kubadm 的节点,都可以通过 kubeadm join 加入到这个集群当中。
在 token 生成之后,kubeadm 会将 ca.crt 等 Master 节点的重要信息,通过 ConfigMap 的方式保存在 Etcd 当中,供后续部署 Node 节点使用.
kubeadm init 的最后一步,就是安装默认插件。Kubernetes 默认 kube-proxy 和 DNS 这两个插件是必须安装的。它们分别用来提供整个集群的服务发现和 DNS 功能。其实,这两个插件也只是两个容器镜像而已,所以 kubeadm 只要用 Kubernetes 客户端创建两个 Pod 就可以了。
kubeadm join 的工作流程
kubeadm init 生成 bootstrap token 之后,你就可以在任意一台安装了 kubelet 和 kubeadm 的机器上执行 kubeadm join 了。
任何一台机器想要成为 Kubernetes 集群中的一个节点,就必须在集群的 kube-apiserver 上注册,而token就是认证的手段。
配置 kubeadm 的部署参数
可以在初始化的时候传入配置文件:
1 | kubeadm init --config kubeadm.yaml |
下面是kubeadm.yaml的一个示例:
1 | apiVersion: kubeadm.k8s.io/v1alpha2 |
通过制定这样一个部署参数配置文件,你就可以很方便地在这个文件里填写各种自定义的部署参数了。比如,我现在要指定 kube-apiserver 的参数,那么我只要在这个文件里加上这样一段信息:
1 | ... |
然后,kubeadm 就会使用上面这些信息替换 /etc/kubernetes/manifests/kube-apiserver.yaml 里的 command 字段里的参数了。
这个配置文件的可配置项远不止这些,在后面再慢慢探索。