![Search icon](https://hackernoon.imgix.net/search-new.png?w=19&h=19)
在本 Kubeadm 教程中,我们将探讨您需要了解的有关 Kubeadm 命令的所有信息,以及如何使用它们在Kubernetes (K8s) 中创建集群和管理集群组件。
您不仅将学习如何使用 Kubeadm 创建自己的 Kubernetes 集群,还将掌握管理集群组件的艺术,并发现 Kubeadm 的最佳实践。
加入我们进入 Kubeadm 世界的激动人心的旅程,在这里您将释放轻松编排容器的能力。
让我们一起潜入 Kubeadm 专家吧!在深入了解kubeadm
之前,我们先来了解一下自托管 Kubernetes (K8s) 到底是什么?
自托管 Kubernetes,也称为“裸机”或“本地”Kubernetes 部署,是指直接在物理机或虚拟机上运行 Kubernetes,而不依赖于云提供商提供的托管 Kubernetes 服务(例如 AWS 的 EKS) )。
以下是自托管 Kubernetes 的一些优点和缺点:
通过自托管 Kubernetes,您可以完全控制集群配置、网络和基础设施。这允许您根据您的特定要求和基础设施功能自定义和优化集群。
与使用经常产生额外费用的托管 Kubernetes 服务相比,自托管 Kubernetes 更具成本效益,尤其是对于长期部署。自托管允许您利用现有硬件资源并避免托管服务的管理费用。 (并节省大量金钱)
自托管 Kubernetes 使您可以直接控制安全措施,例如网络策略、加密、访问控制和合规性要求。这使您能够根据组织的需求和监管标准实施最佳的 Kubernetes 安全实践。 (log4j,敲响警钟吗?)
自托管 Kubernetes 允许您将资源专门分配给您的集群,而无需与其他租户共享。这可以实现更好的资源利用率,并避免共享环境中的资源争用可能引起的潜在性能问题。
自托管 Kubernetes 需要管理和维护底层基础设施的专业知识。
您负责供应、配置和监控集群的服务器、网络、存储和其他组件。这可能非常耗时,并且需要专门的资源和额外的招聘。
与提供自动扩展功能的托管服务相比,扩展自托管 Kubernetes 集群可能更加复杂。
您需要提前规划和调配资源来处理峰值负载,并且添加或删除节点可能需要手动干预。
自托管 Kubernetes 引入了额外的操作复杂性,例如管理升级、补丁、备份和高可用性。这些任务需要仔细规划、测试和协调,以确保对集群和应用程序的干扰最小化,否则会增加生产停机时间。
Kubeadm 是一个命令行工具,可以简化设置和管理 Kubernetes 集群的过程,使技术社区成员更轻松地深入容器编排的世界。
将kubeadm
视为您值得信赖的助手,负责处理集群设置的具体细节,让您能够专注于大局。
它可以自动执行复杂的任务,例如配置基本组件、生成证书以及确保您的集群遵循最佳实践。
让我们看一些示例和命令,以更好地理解kubeadm
工作原理。
示例命令 #1:` kubeadm init
`
下面介绍如何使用上述命令。
kubeadm init --pod-network-cidr=192.168.0.0/16
该命令初始化主节点上的控制平面。它生成必要的证书,设置 API 服务器、etcd 和其他重要组件。
` --pod-network-cidr ` 标志指定集群中 pod 网络的 IP 地址范围。
示例命令 #2:` kubeadm join
`
kubeadm join <master-node-ip>:<master-node-port> --token <token> --discovery-token-ca-cert-hash <hash>
此命令将工作节点加入集群。您需要提供主节点的 IP 和端口,以及令牌和发现令牌 CA 证书哈希,这些可以在控制平面初始化期间获取。
命令:` kubeadm reset
`
kubeadm reset --force
此命令会重置集群,删除所有已安装的组件并将节点返回到 Kubernetes 之前的状态。 ` --force`标志确保彻底重置。
命令:` kubeadm upgrade
`
以下是如何使用上述kubeadm
命令。
kubeadm upgrade plan
此命令可帮助您升级 Kubernetes 版本。它检查可用的升级并提供升级控制平面组件的计划。
以下是常用 kubeadm 命令的列表,后面是相关示例。
kubeadm init --pod-network-cidr=192.168.0.0/16
在上面的示例中,该命令初始化主节点上的控制平面,生成证书并设置必要的组件。 ` --pod-network-cidr ` 标志指定 pod 网络 IP 地址范围。
kubeadm join <master-node-ip>:<master-node-port> --token <token> --discovery-token-ca-cert-hash <hash>
上述命令通过使用令牌和发现令牌 CA 证书哈希连接到指定的主节点,将工作节点加入集群。
kubeadm reset --force
上述命令会重置节点,删除所有已安装的 Kubernetes 组件并将其返回到 Kubernetes 之前的状态。 ` --force`标志确保彻底重置。
kubeadm upgrade plan
上述命令提供升级计划,检查控制平面组件的可用升级。
kubeadm token create
此 kubeadm 命令管理用于将节点加入集群的身份验证令牌。此示例生成一个新令牌。
kubeadm config print init-defaults
上述命令管理 kubeadm 配置文件。此示例打印集群初始化的默认配置。
kubeadm version
上面的命令打印 kubeadm 的版本。
kubeadm config images list
使用上述命令打印当前 Kubernetes 版本所需的镜像列表。
此命令可帮助您确定手动容器映像管理所需的容器映像。将 ` list`替换为 ` pull`以拉取配置映像。
kubeadm token create --print-join-command
上述命令生成一个新令牌,可用于将节点加入集群。 ` --print-join-command ` 标志显示要在工作节点上执行的连接命令。
kubeadm token list
上面的命令列出了活动令牌及其关联的创建时间和到期时间。
kubeadm token delete <token_value>
使用上述命令删除特定令牌,使其无法用于节点连接。
kubeadm config migrate --old-config kubeadm.conf --new-config kubeadm.yaml
上述命令将配置文件从旧版本迁移到新版本,实现配置的平滑升级。
kubeadm certs check-expirationkubeadm certs certificate-key
上述命令检查控制平面组件使用的证书的过期状态,并为即将过期的证书提供警告。第二个命令生成密钥。
kubeadm init phase kubelet-start --config config.yaml
上面的命令从 InitConfiguration 文件创建一个带有 kubelet 标志的动态环境文件。
kubeadm join phase control-plane-prepare
上述命令在工作节点加入控制平面期间执行特定阶段。此示例运行“控制平面准备”阶段,该阶段准备工作节点成为控制平面节点。
kubeadm kubeconfig user --client-name=foo --config=bar
使用上述命令使用 kubeadm 配置文件 bar 为名为foo的附加用户输出kubeconfig
文件。
kubeadm reset phase preflight
上述命令执行节点重置过程中的特定阶段。此示例运行“ preflight
”阶段,该阶段在删除 Kubernetes 组件之前执行预重置检查。
kubeadm upgrade plan
上述命令显示控制平面组件的升级计划,显示可用版本以及升级所需的任何操作。
kubeadm upgrade apply v1.22.2
使用上述命令将特定的 Kubernetes 版本应用到控制平面,将其组件升级到指定版本。
kubeadm upgrade node
此命令升级工作节点上的kubelet
和kube-proxy以匹配控制平面的版本。
要使用kubeadm
创建 Kubernetes 集群,您需要确保您的环境满足必要的先决条件。
以下是有关如何使用kubeadm
创建 Kubernetes 集群的分步指南,包括先决条件、详细说明、示例和命令。
两台或多台运行受支持的 Linux 发行版(例如 Ubuntu、CentOS 或 Red Hat Enterprise Linux)并安装了 Docker 的计算机。
建议每台机器 2 GiB 或更多 RAM;任何不足都会为您的软件留下有限的空间。
禁用所有计算机上的交换空间。
为每台计算机设置唯一的主机名、MAC 地址和 Product_uuid。
集群中的所有机器都具有完整的网络连接。您可以连接到公共或专用网络。
在防火墙中打开必要的端口(例如,6443、2379-2380、10250、10251、10252)。
在所有计算机上,使用适用于您的 Linux 发行版的Docker 指南安装Docker 。
在所有机器上使用以下命令安装“ kubeadm
”、“ kubelet
”和“ kubectl
”:
sudo apt-get update && sudo apt-get install -y apt-transport-https curlcurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.listsudo apt-get updatesudo apt-get install -y kubelet kubeadm kubectlsudo apt-mark hold kubelet kubeadm kubectl
在所需的控制平面节点上,使用kubeadm init
命令初始化集群:
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
注意:如果您计划使用不同的 Pod 网络,请调整 ` --pod-network-cidr ` 标志。
初始化完成后,该命令将输出带有令牌和哈希的“ kubeadm join
”命令。确保复制此命令,因为稍后将使用它将工作节点加入集群。
kubectl
设置集群配置在控制平面节点上,创建必要的目录并复制kubeconfig
文件:
mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/config
在控制平面节点上,部署 Pod 网络插件。例如,您可以使用 Calico:
kubectl apply -f https://docs.projectcalico.org/v3.21/manifests/calico.yaml
在每个工作节点上,运行在控制平面初始化期间(从步骤 2 开始)生成的“ kubeadm join
”命令。该命令通常如下所示:
sudo kubeadm join <control_plane_IP>:6443 --token <token> --discovery-token-ca-cert-hash <hash>
在控制平面节点上,使用kubectl
检查集群的状态:
kubectl get nodes
恭喜!您已使用“ kubeadm
”成功创建了 Kubernetes 集群。您现在可以在集群上部署和管理应用程序。
kubeadm
管理集群组件要使用kubeadm
管理集群组件,您可以使用各种命令来执行任务,例如升级集群、添加或删除节点以及管理控制平面。
这是有关如何使用kubeadm
管理集群组件的分步指南,包括带有代码注释的详细命令。
检查控制平面节点上当前 Kubernetes 版本:
kubectl version --short
在所有节点上升级` kubeadm
、` kubelet
和` kubectl
以匹配所需的Kubernetes版本:
# Upgrade kubeadmsudo apt-get updatesudo apt-get install -y kubeadm=<desired_version># Upgrade kubelet and kubectlsudo apt-get updatesudo apt-get install -y kubelet=<desired_version> kubectl=<desired_version># Hold the packages to prevent automatic upgradessudo apt-mark hold kubeadm kubelet kubectl
在控制平面节点上,启动升级过程:
sudo kubeadm upgrade plansudo kubeadm upgrade apply <desired_version>
Upgrade the kubelet configuration on all nodes:
sudo kubeadm upgrade node
验证升级状态:
kubectl get nodeskubectl version --short
在控制平面节点上,生成新的kubeadm join命令:
sudo kubeadm token create --print-join-command
在工作节点上,运行kubeadm join命令将它们加入集群:
sudo kubeadm join <control_plane_IP>:6443 --token <token> --discovery-token-ca-cert-hash <hash>
验证新工作节点的状态:
kubectl get nodes
排空要删除的节点:
kubectl drain <node_name> --ignore-daemonsets
在控制平面节点上,删除该节点:
sudo kubeadm reset
在控制平面节点上,从集群中删除该节点:
kubectl delete node <node_name>
升级控制平面节点上的控制平面组件:
sudo apt-get update sudo apt-get install -y kubeadm=<desired_version> kubelet=<desired_version> kubectl=<desired_version> sudo kubeadm upgrade plan sudo kubeadm upgrade apply <desired_version> sudo systemctl restart kubelet
验证升级状态:
kubectl get nodes kubectl version --short
Drain the control plane node you want to remove:
kubectl drain <control_plane_node> --ignore-daemonsets
在控制平面节点上,使用以下kubeadm命令删除控制平面组件。
sudo kubeadm reset
在控制平面节点上,从集群中删除控制平面节点:
kubectl delete node <control_plane_node>
注意:使用kubeadm管理集群组件需要谨慎,因为它可能会影响集群的稳定性和可用性。确保您有备份计划并遵循官方 Kubernetes 文档,获取针对您的设置和要求的详细说明。
当用于其预期目的时,Kubeadm 是一个出色的工具。为了使用正确的工具来完成工作并充分利用 kubeadm,请记住以下三个最佳实践。
一般来说,kubeadm 不应该用于生产集群,因为它缺乏节点和集群自动缩放功能。这是因为节点自动缩放需要控制底层基础设施和硬件,而 kubeadm 将其委托给其他工具。
Kubeadm 默认情况下没有用于存储集群状态的多 etcd 集群。定期备份 etcd,以防出现问题。
Kubeadm 无法关闭未使用的机器。
因此,为了使用kubeadm
优化 Kubernetes 集群的成本,您需要使用外部解决方案来跟踪工作节点及其资源利用率。