使用 kubeadm 创建一个单主集群
kubeadm 能帮助您建立一个小型的符合最佳实践的 Kubernetes 集群。通过使用 kubeadm, 您的集群会符合 Kubernetes 合规性测试的要求. Kubeadm 也支持其他的集群生命周期操作,比如升级、降级和管理启动引导令牌。
因为您可以在不同类型的机器(比如笔记本、服务器和树莓派等)上安装 kubeadm,因此它非常适合与 Terraform 或 Ansible 这类自动化管理系统集成。
kubeadm 的简单便捷为大家带来了广泛的用户案例:
- 新用户可以从 kubeadm 开始来试用 Kubernetes。
- 熟悉 Kubernetes 的用户可以使用 kubeadm 快速搭建集群并测试他们的应用。
- 大型的项目可以将 kubeadm 和其他的安装工具一起形成一个比较复杂的系统。
kubeadm 的设计初衷是为新用户提供一种便捷的方式来首次试用 Kubernetes, 同时也方便老用户搭建集群测试他们的应用。 此外 kubeadm 也可以跟其它生态系统与/或安装工具集成到一起,提供更强大的功能。
您可以很方便地在支持 rpm 或 deb 软件包的操作系统上安装 _kubeadm_。对应 kubeadm 的 SIG, SIG Cluster Lifecycle, 提供了预编译的这类安装包,当然您也可以自己基于源码为其它操作系统来构造安装包。
kubeadm 成熟程度
功能 | 成熟程度 |
---|---|
命令行用户体验 | beta |
功能实现 | beta |
配置文件 API | alpha |
自托管 | alpha |
kubeadm alpha 子命令 | alpha |
CoreDNS | GA |
动态 Kubelet 配置 | alpha |
kubeadm 的整体功能目前还是 Beta 状态,然而很快在 2018 年就会转换成正式发布 (GA) 状态。 一些子功能,比如自托管或者配置文件 API 还在开发过程当中。 随着工具的发展,创建集群的方法可能会有所变化,但是整体部署方案还是比较稳定的。 在 kubeadm alpha
下面的任何命令都只是 alpha 状态,目前只提供初期阶段的服务。
维护周期
Kubernetes 发布的版本通常只维护支持九个月,在维护周期内,如果发现有比较重大的 bug 或者安全问题的话, 可能会发布一个补丁版本。下面是 Kubernetes 的发布和维护周期,同时也适用于 kubeadm
。
Kubernetes 版本 | 发行月份 | 终止维护月份 |
---|---|---|
v1.6.x | 2017 年 3 月 | 2017 年 12 月 |
v1.7.x | 2017 年 6 月 | 2018 年 3 月 |
v1.8.x | 2017 年 9 月 | 2018 年 6 月 |
v1.9.x | 2017 年 12 月 | 2018 年 9 月 |
v1.10.x | 2018 年 3 月 | 2018 年 12 月 |
v1.11.x | 2018 年 6 月 | 2019 年 3 月 |
v1.12.x | 2018 年 9 月 | 2019 年 6 月 |
准备开始
- 一个或者多个兼容 deb 或者 rpm 软件包的操作系统,比如 Ubuntu 或者 CentOS
- 每台机器 2 GB 以上的内存,内存不足时应用会受限制
- 主节点上 2 CPU 以上
- 集群里所有的机器有完全的网络连接,公有网络或者私有网络都可以
目标
- 搭建一个单主 Kubernetes 集群或者高可用集群
- 在集群上安装 Pod 网络组件以便 Pod 之间可以互相通信
步骤
在您的机器上安装 kubeadm
请查阅安装 kubeadm。
注意:
如果您的机器已经安装了 kubeadm, 请运行
apt-get update && apt-get upgrade
或者yum update
来升级至最新版本的 kubeadm.升级过程中,kubelet 会每隔几秒钟重启并陷入了不断循环等待 kubeadm 发布指令的状态。 这个死循环的过程是正常的,当升级并初始化完成您的主节点之后,kubelet 才会正常运行。
初始化您的主节点
主节点是集群里运行控制面的机器,包括 etcd (集群的数据库)和 API 服务(kubectl CLI 与之交互)。
- 选择一个 Pod 网络插件,并检查是否在 kubeadm 初始化过程中需要传入什么参数。这个取决于 您选择的网络插件,您可能需要设置
--Pod-network-cidr
来指定网络驱动的 CIDR。请参阅安装网络插件。 - (可选) 除非特别指定,kubeadm 会使用默认网关所在的网络接口广播其主节点的 IP 地址。若需使用其他网络接口,请 给
kubeadm init
设置--apiserver-advertise-address=<ip-address>
参数。如果需要部署 IPv6 的集群,则需要指定一个 IPv6 地址,比如--apiserver-advertise-address=fd00::101
。 - (可选) 在运行
kubeadm init
之前请先执行kubeadm config images pull
来测试与 gcr.io 的连接。
现在运行:
kubeadm init <args>
补充信息
想了解更多关于 kubeadm init
的参数, 请参阅kubeadm 参考指南。
想了解完整的配置选项,请参阅配置文件。
如果想定制控制面组件,包括为活跃性探测和 etcd 服务提供 IPv6 支持以及为各组件提供额外参数,请参阅定制参数。
如果需要再次运行 kubeadm init
,您必须先卸载集群。
如果您需要将不同架构的节点加入您的集群,请单独在这类节点上为 kube-proxy
和 kube-dns
创建 Deployment 或 DaemonSet。 这是因为这些组件的 Docker 镜像并不支持多架构。
kubeadm init
首先会执行一系列的运行前检查来确保机器满足运行 Kubernetes 的条件。 这些检查会抛出警告并在发现错误的时候终止整个初始化进程。 然后 kubeadm init
会下载并安装集群的控制面组件,这可能会花费几分钟时间,其输出如下所示:
[init] Using Kubernetes version: vX.Y.Z
[preflight] Running pre-flight checks
[kubeadm] WARNING: starting in 1.8, tokens expire after 24 hours by default (if you require a non-expiring token use --token-ttl 0)
[certificates] Generated ca certificate and key.
[certificates] Generated apiserver certificate and key.
[certificates] apiserver serving cert is signed for DNS names [kubeadm-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 10.138.0.4]
[certificates] Generated apiserver-kubelet-client certificate and key.
[certificates] Generated sa key and public key.
[certificates] Generated front-proxy-ca certificate and key.
[certificates] Generated front-proxy-client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "scheduler.conf"
[controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
[controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml"
[controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml"
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml"
[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests"
[init] This often takes around a minute; or longer if the control plane images have to be pulled.
[apiclient] All control plane components are healthy after 39.511972 seconds
[uploadconfig] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[markmaster] Will mark node master as master by adding a label and a taint
[markmaster] Master master tainted and labelled with key/value: node-role.kubernetes.io/master=""
[bootstraptoken] Using token: <token>
[bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run (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
You should now deploy a Pod network to the cluster.
Run "kubectl apply -f [Podnetwork].yaml" with one of the addon options listed at:
http://kubernetes.io/docs/admin/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
如果需要让普通用户可以运行 kubectl,请运行如下命令,其实这也是 kubeadm init
输出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
或者,如果您是 root
用户,则可以运行:
export KUBECONFIG=/etc/kubernetes/admin.conf
请备份好 kubeadm init
输出中的 kubeadm join
命令,因为您会需要这个命令来给集群添加节点。
令牌是主节点和新添加的节点之间进行相互身份验证的,因此请确保其安全。任何人只要知道了这些令牌,就可以随便给您的集群添加节点。 可以使用 kubeadm token
命令来列出、创建和删除这类令牌。 请参阅kubeadm 参考指南。
安装 Pod 网络插件
警告: 注意: 这一节包含了安装和部署顺序的重要信息,执行之前请仔细阅读。
您必须先安装 Pod 网络插件,以便您的 Pod 可以互相通信。
网络必须在部署任何应用之前部署好。此外,在网络安装之前是 CoreDNS 不会启用的。 kubeadm 只支持基于容器网络接口(CNI)的网络而且不支持 kubenet 。
有一些项目为 Kubernetes 提供使用 CNI 的 Pod 网络,其中一些也支持网络策略. 请参阅插件页面了解可用网络插件的完整列表。 - CNI v0.6.0 也提供了 IPv6 的支持。 - CNI 网桥 和 local-ipam 是 Kubernetes 1.9 版本里提供的唯一支持 IPv6 的网络插件。
注意 kubeadm 默认会创建一个比较安全的集群并强制启用RBAC。 请确保您的网络方案支持 RBAC。
您可以使用下列命令安装网络插件:
kubectl apply -f <add-on.yaml>
<!– You can install only one Pod network per cluster.
Please select one of the tabs to see installation instructions for the respective third-party Pod Network Provider.