使用 kubeadm 创建集群

    kubeadm 工具很棒,如果你需要:

    • 一个尝试 Kubernetes 的简单方法。
    • 一个现有用户可以自动设置集群并测试其应用程序的途径。
    • 其他具有更大范围的生态系统和/或安装工具中的构建模块。

    你可以在各种机器上安装和使用 kubeadm:笔记本电脑, 一组云服务器,Raspberry Pi 等。无论是部署到云还是本地, 你都可以将 kubeadm 集成到预配置系统中,例如 Ansible 或 Terraform。

    要遵循本指南,你需要:

    • 一台或多台运行兼容 deb/rpm 的 Linux 操作系统的计算机;例如:Ubuntu 或 CentOS。
    • 每台机器 2 GB 以上的内存,内存不足时应用会受限制。
    • 用作控制平面节点的计算机上至少有2个 CPU。
    • 集群中所有计算机之间具有完全的网络连接。你可以使用公共网络或专用网络。

    你还需要使用可以在新集群中部署特定 Kubernetes 版本对应的 kubeadm

    Kubernetes 版本及版本倾斜支持策略 适用于 kubeadm 以及整个 Kubernetes。 查阅该策略以了解支持哪些版本的 Kubernetes 和 kubeadm。 该页面是为 Kubernetes v1.19 编写的。

    kubeadm 工具的整体功能状态为一般可用性(GA)。一些子功能仍在积极开发中。 随着工具的发展,创建集群的实现可能会略有变化,但总体实现应相当稳定。

    目标

    • 安装单个控制平面的 Kubernetes 集群
    • 在集群上安装 Pod 网络,以便你的 Pod 可以相互连通

    查看 “安装 kubeadm”

    初始化控制平面节点

    控制平面节点是运行控制平面组件的机器, 包括 etcd (集群数据库) 和 (命令行工具 kubectl 与之通信)。

    1. (推荐)如果计划将单个控制平面 kubeadm 集群升级成高可用, 你应该指定 --control-plane-endpoint 为所有控制平面节点设置共享端点。 端点可以是负载均衡器的 DNS 名称或 IP 地址。
    2. 选择一个Pod网络插件,并验证是否需要为 kubeadm init 传递参数。 根据你选择的第三方网络插件,你可能需要设置 --pod-network-cidr 的值。 请参阅 。
    3. (可选)从版本1.14开始,kubeadm 尝试使用一系列众所周知的域套接字路径来检测 Linux 上的容器运行时。 要使用不同的容器运行时, 或者如果在预配置的节点上安装了多个容器,请为 kubeadm init 指定 --cri-socket 参数。 请参阅安装运行时
    4. (可选)除非另有说明,否则 kubeadm 使用与默认网关关联的网络接口来设置此控制平面节点 API server 的广播地址。 要使用其他网络接口,请为 kubeadm init 设置 --apiserver-advertise-address=<ip-address> 参数。 要部署使用 IPv6 地址的 Kubernetes 集群, 必须指定一个 IPv6 地址,例如 --apiserver-advertise-address=fd00::101
    5. (可选)在 kubeadm init 之前运行 kubeadm config images pull,以验证与 gcr.io 容器镜像仓库的连通性。

    要初始化控制平面节点,请运行:

    关于 apiserver-advertise-address 和 ControlPlaneEndpoint 的注意事项

    --apiserver-advertise-address 可用于为控制平面节点的 API server 设置广播地址, --control-plane-endpoint 可用于为所有控制平面节点设置共享端点。

    --control-plane-endpoint 允许 IP 地址和可以映射到 IP 地址的 DNS 名称。 请与你的网络管理员联系,以评估有关此类映射的可能解决方案。

    这是一个示例映射:

    1. 192.168.0.102 cluster-endpoint

    其中 192.168.0.102 是此节点的 IP 地址,cluster-endpoint 是映射到该 IP 的自定义 DNS 名称。 这将允许你将 --control-plane-endpoint=cluster-endpoint 传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 稍后你可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。

    kubeadm 不支持将没有 --control-plane-endpoint 参数的单个控制平面集群转换为高可用性集群。

    更多信息

    有关 kubeadm init 参数的更多信息,请参见 。

    有关配置选项的完整列表,请参见配置文件文档

    要自定义控制平面组件,包括可选的对控制平面组件和 etcd 服务器的活动探针提供 IPv6 支持,请参阅。

    要再次运行 kubeadm init,你必须首先卸载集群

    如果将具有不同架构的节点加入集群, 请确保已部署的 DaemonSet 对这种体系结构具有容器镜像支持。

    kubeadm init 首先运行一系列预检查以确保机器 准备运行 Kubernetes。这些预检查会显示警告并在错误时退出。然后 kubeadm init 下载并安装集群控制平面组件。这可能会需要几分钟。 输出应如下所示:

    1. [init] Using Kubernetes version: vX.Y.Z
    2. [preflight] Running pre-flight checks
    3. [preflight] Pulling images required for setting up a Kubernetes cluster
    4. [preflight] This might take a minute or two, depending on the speed of your internet connection
    5. [preflight] You can also perform this action in beforehand using 'kubeadm config images pull'
    6. [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
    7. [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
    8. [kubelet-start] Activating the kubelet service
    9. [certs] Using certificateDir folder "/etc/kubernetes/pki"
    10. [certs] Generating "etcd/ca" certificate and key
    11. [certs] Generating "etcd/server" certificate and key
    12. [certs] etcd/server serving cert is signed for DNS names [kubeadm-cp localhost] and IPs [10.138.0.4 127.0.0.1 ::1]
    13. [certs] Generating "etcd/healthcheck-client" certificate and key
    14. [certs] Generating "etcd/peer" certificate and key
    15. [certs] etcd/peer serving cert is signed for DNS names [kubeadm-cp localhost] and IPs [10.138.0.4 127.0.0.1 ::1]
    16. [certs] Generating "ca" certificate and key
    17. [certs] Generating "apiserver" certificate and key
    18. [certs] Generating "apiserver-kubelet-client" certificate and key
    19. [certs] Generating "front-proxy-ca" certificate and key
    20. [certs] Generating "front-proxy-client" certificate and key
    21. [certs] Generating "sa" key and public key
    22. [kubeconfig] Using kubeconfig folder "/etc/kubernetes"
    23. [kubeconfig] Writing "admin.conf" kubeconfig file
    24. [kubeconfig] Writing "kubelet.conf" kubeconfig file
    25. [kubeconfig] Writing "controller-manager.conf" kubeconfig file
    26. [kubeconfig] Writing "scheduler.conf" kubeconfig file
    27. [control-plane] Using manifest folder "/etc/kubernetes/manifests"
    28. [control-plane] Creating static Pod manifest for "kube-apiserver"
    29. [control-plane] Creating static Pod manifest for "kube-controller-manager"
    30. [control-plane] Creating static Pod manifest for "kube-scheduler"
    31. [etcd] Creating static Pod manifest for local etcd in "/etc/kubernetes/manifests"
    32. [wait-control-plane] Waiting for the kubelet to boot up the control plane as static Pods from directory "/etc/kubernetes/manifests". This can take up to 4m0s
    33. [apiclient] All control plane components are healthy after 31.501735 seconds
    34. [uploadconfig] storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
    35. [kubelet] Creating a ConfigMap "kubelet-config-X.Y" in namespace kube-system with the configuration for the kubelets in the cluster
    36. [patchnode] Uploading the CRI Socket information "/var/run/dockershim.sock" to the Node API object "kubeadm-cp" as an annotation
    37. [mark-control-plane] Marking the node kubeadm-cp as control-plane by adding the label "node-role.kubernetes.io/master=''"
    38. [mark-control-plane] Marking the node kubeadm-cp as control-plane by adding the taints [node-role.kubernetes.io/master:NoSchedule]
    39. [bootstrap-token] Using token: <token>
    40. [bootstrap-token] Configuring bootstrap tokens, cluster-info ConfigMap, RBAC Roles
    41. [bootstraptoken] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
    42. [bootstraptoken] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
    43. [bootstraptoken] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
    44. [bootstraptoken] creating the "cluster-info" ConfigMap in the "kube-public" namespace
    45. [addons] Applied essential addon: CoreDNS
    46. [addons] Applied essential addon: kube-proxy
    47. Your Kubernetes control-plane has initialized successfully!
    48. To start using your cluster, you need to run the following as a regular user:
    49. mkdir -p $HOME/.kube
    50. sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    51. sudo chown $(id -u):$(id -g) $HOME/.kube/config
    52. You should now deploy a Pod network to the cluster.
    53. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
    54. /docs/concepts/cluster-administration/addons/
    55. You can now join any number of machines by running the following on each node
    56. as root:
    57. kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

    要使非 root 用户可以运行 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 用户,则可以运行:

      令牌用于控制平面节点和加入节点之间的相互身份验证。 这里包含的令牌是密钥。确保它的安全, 因为拥有此令牌的任何人都可以将经过身份验证的节点添加到你的集群中。 可以使用 kubeadm token 命令列出,创建和删除这些令牌。 请参阅 。

      一些外部项目为 Kubernetes 提供使用 CNI 的 Pod 网络,其中一些还支持网络策略

      请参阅实现 的附加组件列表。

      你可以使用以下命令在控制平面节点或具有 kubeconfig 凭据的节点上安装 Pod 网络附加组件:

      1. kubectl apply -f <add-on.yaml>

      每个集群只能安装一个 Pod 网络。

      安装 Pod 网络后,您可以通过在 kubectl get pods --all-namespaces 输出中检查 CoreDNS Pod 是否 Running 来确认其是否正常运行。 一旦 CoreDNS Pod 启用并运行,你就可以继续加入节点。

      如果您的网络无法正常工作或CoreDNS不在“运行中”状态,请查看 kubeadm故障排除指南

      控制平面节点隔离

      默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。 如果你希望能够在控制平面节点上调度 Pod, 例如用于开发的单机 Kubernetes 集群,请运行:

      1. kubectl taint nodes --all node-role.kubernetes.io/master-

      输出看起来像:

      这将从任何拥有 node-role.kubernetes.io/master taint 标记的节点中移除该标记, 包括控制平面节点,这意味着调度程序将能够在任何地方调度 Pods。

      加入节点

      节点是你的工作负载(容器和 Pod 等)运行的地方。要将新节点添加到集群,请对每台计算机执行以下操作:

      • SSH 到机器
      • 成为 root (例如 sudo su -
      • 运行 kubeadm init 输出的命令。例如:
      1. kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

      如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:

      1. kubeadm token list

      输出类似于以下内容:

      1. TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
      2. 8ewj1p.9r9hcjoqgajrj4gi 23h 2018-06-12T02:51:28Z authentication, The default bootstrap system:
      3. signing token generated by bootstrappers:
      4. 'kubeadm init'. kubeadm:
      5. default-node-token

      默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:

      1. kubeadm token create

      输出类似于以下内容:

      1. 5didvk.d09sbcov8ph2amjw

      如果你没有 --discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:

      1. openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
      2. openssl dgst -sha256 -hex | sed 's/^.* //'

      输出类似于以下内容:

      输出应类似于:

      1. [preflight] Running pre-flight checks
      2. ... (log output of join workflow) ...
      3. Node join complete:
      4. * Certificate signing request sent to control-plane and response
      5. received.
      6. * Kubelet informed of new secure connection details.
      7. Run 'kubectl get nodes' on control-plane to see this machine join.

      (可选)从控制平面节点以外的计算机控制集群

      为了使 kubectl 在其他计算机(例如笔记本电脑)上与你的集群通信, 你需要将管理员 kubeconfig 文件从控制平面节点复制到工作站,如下所示:

      1. scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
      2. kubectl --kubeconfig ./admin.conf get nodes

      如果要从集群外部连接到 API 服务器,则可以使用 kubectl proxy

      1. scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
      2. kubectl --kubeconfig ./admin.conf proxy

      你现在可以在本地访问API服务器 http://localhost:8001/api/v1

      清理

      如果你在集群中使用了一次性服务器进行测试,则可以关闭这些服务器,而无需进一步清理。你可以使用 kubectl config delete-cluster 删除对集群的本地引用。

      但是,如果要更干净地取消配置群集, 则应首先清空节点并确保该节点为空, 然后取消配置该节点。

      删除节点

      使用适当的凭证与控制平面节点通信,运行:

      1. kubectl drain <node name> --delete-local-data --force --ignore-daemonsets

      在删除节点之前,请重置 kubeadm 安装的状态:

      1. kubeadm reset

      重置过程不会重置或清除 iptables 规则或 IPVS 表。如果你希望重置 iptables,则必须手动进行:

      1. iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

      如果要重置 IPVS 表,则必须运行以下命令:

      现在删除节点:

      1. kubectl delete node <node name>

      如果你想重新开始,只需运行 kubeadm initkubeadm join 并加上适当的参数。

      清理控制平面

      你可以在控制平面主机上使用 kubeadm reset 来触发尽力而为的清理。

      有关此子命令及其选项的更多信息,请参见参考文档。

      • 使用 Sonobuoy 验证集群是否正常运行
      • 有关使用kubeadm升级集群的详细信息,请参阅。
      • kubeadm 参考文档中了解有关高级 kubeadm 用法的信息
      • 了解有关Kubernetes和kubectl的更多信息。
      • 有关Pod网络附加组件的更多列表,请参见页面。
      • 请参阅附加组件列表以探索其他附加组件, 包括用于 Kubernetes 集群的日志记录,监视,网络策略,可视化和控制的工具。
      • 配置集群如何处理集群事件的日志以及 在Pods中运行的应用程序。 有关所涉及内容的概述,请参见。

      反馈

      • 有关 bugs, 访问
      • 有关支持, 访问 #kubeadm Slack 频道
      • General SIG 集群生命周期开发 Slack 频道:
      • SIG 集群生命周期 SIG information
      • SIG 集群生命周期邮件列表:

      版本倾斜政策

      版本 v1.19 的kubeadm 工具可以使用版本 v1.19 或 v1.18 的控制平面部署集群。kubeadm v1.19 还可以升级现有的 kubeadm 创建的 v1.18 版本的集群。

      由于没有未来,kubeadm CLI v1.19 可能会或可能无法部署 v1.20 集群。

      这些资源提供了有关 kubelet 与控制平面以及其他 Kubernetes 组件之间受支持的版本倾斜的更多信息:

      此处创建的集群具有单个控制平面节点,运行单个 etcd 数据库。 这意味着如果控制平面节点发生故障,你的集群可能会丢失数据并且可能需要从头开始重新创建。

      解决方法:

      • 定期。 kubeadm 配置的 etcd 数据目录位于控制平面节点上的 中。

      平台兼容性

      kubeadm deb/rpm 软件包和二进制文件是为 amd64,arm (32-bit),arm64,ppc64le 和 s390x 构建的遵循。

      从 v1.12 开始还支持用于控制平面和附加组件的多平台容器镜像。

      只有一些网络提供商为所有平台提供解决方案。请查阅上方的 网络提供商清单或每个提供商的文档以确定提供商是否 支持你选择的平台。

      故障排除