使用 kubeadm 创建一个单主集群

使用 kubeadm 创建一个单主集群 - 图1kubeadm 能帮助您建立一个小型的符合最佳实践的 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
配置文件 APIalpha
自托管alpha
kubeadm alpha 子命令alpha
CoreDNSGA
动态 Kubelet 配置alpha

kubeadm 的整体功能目前还是 Beta 状态,然而很快在 2018 年就会转换成正式发布 (GA) 状态。 一些子功能,比如自托管或者配置文件 API 还在开发过程当中。 随着工具的发展,创建集群的方法可能会有所变化,但是整体部署方案还是比较稳定的。 在 kubeadm alpha 下面的任何命令都只是 alpha 状态,目前只提供初期阶段的服务。

维护周期

Kubernetes 发布的版本通常只维护支持九个月,在维护周期内,如果发现有比较重大的 bug 或者安全问题的话, 可能会发布一个补丁版本。下面是 Kubernetes 的发布和维护周期,同时也适用于 kubeadm

Kubernetes 版本发行月份终止维护月份
v1.6.x2017 年 3 月2017 年 12 月
v1.7.x2017 年 6 月2018 年 3 月
v1.8.x2017 年 9 月2018 年 6 月
v1.9.x2017 年 12 月2018 年 9 月
v1.10.x2018 年 3 月2018 年 12 月
v1.11.x2018 年 6 月2019 年 3 月
v1.12.x2018 年 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 与之交互)。

  1. 选择一个 Pod 网络插件,并检查是否在 kubeadm 初始化过程中需要传入什么参数。这个取决于 您选择的网络插件,您可能需要设置 --Pod-network-cidr 来指定网络驱动的 CIDR。请参阅安装网络插件
  2. (可选) 除非特别指定,kubeadm 会使用默认网关所在的网络接口广播其主节点的 IP 地址。若需使用其他网络接口,请 给 kubeadm init 设置 --apiserver-advertise-address=<ip-address> 参数。如果需要部署 IPv6 的集群,则需要指定一个 IPv6 地址,比如 --apiserver-advertise-address=fd00::101
  3. (可选) 在运行 kubeadm init 之前请先执行 kubeadm config images pull 来测试与 gcr.io 的连接。

现在运行:

  1. kubeadm init <args>

补充信息

想了解更多关于 kubeadm init 的参数, 请参阅kubeadm 参考指南

想了解完整的配置选项,请参阅配置文件

如果想定制控制面组件,包括为活跃性探测和 etcd 服务提供 IPv6 支持以及为各组件提供额外参数,请参阅定制参数

如果需要再次运行 kubeadm init,您必须先卸载集群

如果您需要将不同架构的节点加入您的集群,请单独在这类节点上为 kube-proxykube-dns 创建 Deployment 或 DaemonSet。 这是因为这些组件的 Docker 镜像并不支持多架构。

kubeadm init 首先会执行一系列的运行前检查来确保机器满足运行 Kubernetes 的条件。 这些检查会抛出警告并在发现错误的时候终止整个初始化进程。 然后 kubeadm init 会下载并安装集群的控制面组件,这可能会花费几分钟时间,其输出如下所示:

  1. [init] Using Kubernetes version: vX.Y.Z
  2. [preflight] Running pre-flight checks
  3. [kubeadm] WARNING: starting in 1.8, tokens expire after 24 hours by default (if you require a non-expiring token use --token-ttl 0)
  4. [certificates] Generated ca certificate and key.
  5. [certificates] Generated apiserver certificate and key.
  6. [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]
  7. [certificates] Generated apiserver-kubelet-client certificate and key.
  8. [certificates] Generated sa key and public key.
  9. [certificates] Generated front-proxy-ca certificate and key.
  10. [certificates] Generated front-proxy-client certificate and key.
  11. [certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
  12. [kubeconfig] Wrote KubeConfig file to disk: "admin.conf"
  13. [kubeconfig] Wrote KubeConfig file to disk: "kubelet.conf"
  14. [kubeconfig] Wrote KubeConfig file to disk: "controller-manager.conf"
  15. [kubeconfig] Wrote KubeConfig file to disk: "scheduler.conf"
  16. [controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
  17. [controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml"
  18. [controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml"
  19. [etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml"
  20. [init] Waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests"
  21. [init] This often takes around a minute; or longer if the control plane images have to be pulled.
  22. [apiclient] All control plane components are healthy after 39.511972 seconds
  23. [uploadconfig] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
  24. [markmaster] Will mark node master as master by adding a label and a taint
  25. [markmaster] Master master tainted and labelled with key/value: node-role.kubernetes.io/master=""
  26. [bootstraptoken] Using token: <token>
  27. [bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
  28. [bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
  29. [bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
  30. [addons] Applied essential addon: CoreDNS
  31. [addons] Applied essential addon: kube-proxy
  32. Your Kubernetes master has initialized successfully!
  33. To start using your cluster, you need to run (as a regular user):
  34. mkdir -p $HOME/.kube
  35. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  36. sudo chown $(id -u):$(id -g) $HOME/.kube/config
  37. You should now deploy a Pod network to the cluster.
  38. Run "kubectl apply -f [Podnetwork].yaml" with one of the addon options listed at:
  39. http://kubernetes.io/docs/admin/addons/
  40. You can now join any number of machines by running the following on each node
  41. as root:
  42. kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>

如果需要让普通用户可以运行 kubectl,请运行如下命令,其实这也是 kubeadm init 输出的一部分:

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

或者,如果您是 root 用户,则可以运行:

  1. 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。

您可以使用下列命令安装网络插件:

  1. 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.