首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
安装 kubeadm
kubeadm故障排查方法
通过Kubeadm 创建集群
Kubernetes组件介绍
Kubernetes中的API
Kubernetes对象
Kubernetes对象管理
Kubernetes对象名称和 ID
Kubernetes对象标签和选择算符
Kubernetes对象名字空间
Kubernetes对象注解
Kubernetes对象字段选择器
Kubernetes对象Finalizers
Kubernetes对象属主与附属
Kubernetes对象推荐使用的标签
Kubernetes节点
Kubernetes节点与控制面之间的通信
Kubernetes控制器
Kubernetes云控制器管理器
Kubernetes关于 cgroup v2
Kubernetes容器运行时接口(CRI)
Kubernetes垃圾收集
当前位置:
首页>>
技术小册>>
Kubernetes中文教程(一)
小册名称:Kubernetes中文教程(一)
使用 kubeadm,你能创建一个符合最佳实践的最小化 Kubernetes 集群。 事实上,你可以使用 kubeadm 配置一个通过 Kubernetes 一致性测试的集群。 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.25 编写的。 kubeadm 工具的整体功能状态为一般可用性(GA)。一些子功能仍在积极开发中。 随着工具的发展,创建集群的实现可能会略有变化,但总体实现应相当稳定。 **目标** - 安装单个控制平面的 Kubernetes 集群 - 在集群上安装 Pod 网络,以便你的 Pod 可以相互连通 **操作指南** 主机准备 在所有主机上安装 容器运行时 和 kubeadm。 **准备所需的容器镜像** 这个步骤是可选的,只适用于你希望 kubeadm init 和 kubeadm join 不去下载存放在 registry.k8s.io 上的默认的容器镜像的情况。 当你在离线的节点上创建一个集群的时候,Kubeadm 有一些命令可以帮助你预拉取所需的镜像。 Kubeadm 允许你给所需要的镜像指定一个自定义的镜像仓库。 **初始化控制平面节点** 控制平面节点是运行控制平面组件的机器, 包括 etcd (集群数据库) 和 API Server (命令行工具 kubectl 与之通信)。 - (推荐)如果计划将单个控制平面 kubeadm 集群升级成高可用, 你应该指定 --control-plane-endpoint 为所有控制平面节点设置共享端点。 端点可以是负载均衡器的 DNS 名称或 IP 地址。 - 选择一个 Pod 网络插件,并验证是否需要为 kubeadm init 传递参数。 根据你选择的第三方网络插件,你可能需要设置 --pod-network-cidr 的值。 请参阅安装 Pod 网络附加组件。 - (可选)kubeadm 试图通过使用已知的端点列表来检测容器运行时。 使用不同的容器运行时或在预配置的节点上安装了多个容器运行时,请为 kubeadm init 指定 --cri-socket 参数。 请参阅安装运行时。 - (可选)除非另有说明,否则 kubeadm 使用与默认网关关联的网络接口来设置此控制平面节点 API server 的广播地址。 要使用其他网络接口,请为 kubeadm init 设置 --apiserver-advertise-address=<ip-address> 参数。 要部署使用 IPv6 地址的 Kubernetes 集群, 必须指定一个 IPv6 地址,例如 --apiserver-advertise-address=2001:db8::101 要初始化控制平面节点,请运行: ```asp kubeadm init <args> ``` **安装 Pod 网络附加组件** 你可以使用以下命令在控制平面节点或具有 kubeconfig 凭据的节点上安装 Pod 网络附加组件: ```asp kubectl apply -f <add-on.yaml> ``` 每个集群只能安装一个 Pod 网络。 安装 Pod 网络后,你可以通过在 kubectl get pods --all-namespaces 输出中检查 CoreDNS Pod 是否 Running 来确认其是否正常运行。 一旦 CoreDNS Pod 启用并运行,你就可以继续加入节点。 **托管节点标签** 默认情况下,kubeadm 启用 NodeRestriction 准入控制器来限制 kubelets 在节点注册时可以应用哪些标签。准入控制器文档描述 kubelet --node-labels 选项允许使用哪些标签。 其中 node-role.kubernetes.io/control-plane 标签就是这样一个受限制的标签, kubeadm 在节点创建后使用特权客户端手动应用此标签。 你可以使用一个有特权的 kubeconfig,比如由 kubeadm 管理的 /etc/kubernetes/admin.conf, 通过执行 kubectl label 来手动完成操作。 **控制平面节点隔离** 默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。 如果你希望能够在控制平面节点上调度 Pod,例如单机 Kubernetes 集群,请运行: ```asp kubectl taint nodes --all node-role.kubernetes.io/control-plane- node-role.kubernetes.io/master- ``` 输出看起来像: ```asp node "test-01" untainted ``` 这将从任何拥有 node-role.kubernetes.io/control-plane:NoSchedule 污点的节点(包括控制平面节点)上移除该污点。 这意味着调度程序将能够在任何地方调度 Pod。 **加入节点** 节点是你的工作负载(容器和 Pod 等)运行的地方。要将新节点添加到集群,请对每台计算机执行以下操作: **SSH 到机器** 成为 root (例如 sudo su -) 必要时安装一个运行时 运行 kubeadm init 输出的命令,例如: ```asp kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash> ``` 如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌: ```asp kubeadm token list ``` 输出类似于以下内容: ```asp TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS 8ewj1p.9r9hcjoqgajrj4gi 23h 2018-06-12T02:51:28Z authentication, The default bootstrap system: signing token generated by bootstrappers: 'kubeadm init'. kubeadm: default-node-token ``` 默认情况下,令牌会在 24 小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌: ```asp kubeadm token create ``` 输出类似于以下内容: ```asp 5didvk.d09sbcov8ph2amjw ``` 如果你没有 --discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它: openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //' 输出类似于以下内容: ```asp 8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78 ``` 说明: 要为 `<control-plane-host>:<control-plane-port>` 指定 IPv6 元组,必须将 IPv6 地址括在方括号中,例如:[2001:db8::101]:2073 输出应类似于: ```asp [preflight] Running pre-flight checks ... (log output of join workflow) ... Node join complete: * Certificate signing request sent to control-plane and response received. * Kubelet informed of new secure connection details. Run 'kubectl get nodes' on control-plane to see this machine join. ``` 几秒钟后,当你在控制平面节点上执行 kubectl get nodes,你会注意到该节点出现在输出中。 说明: 由于集群节点通常是按顺序初始化的,CoreDNS Pod 很可能都运行在第一个控制面节点上。 为了提供更高的可用性,请在加入至少一个新节点后 使用 kubectl -n kube-system rollout restart deployment coredns 命令,重新平衡这些 CoreDNS Pod。 (可选)从控制平面节点以外的计算机控制集群 为了使 kubectl 在其他计算机(例如笔记本电脑)上与你的集群通信, 你需要将管理员 kubeconfig 文件从控制平面节点复制到工作站,如下所示: ```asp scp root@<control-plane-host>:/etc/kubernetes/admin.conf . kubectl --kubeconfig ./admin.conf get nodes ``` 说明: 上面的示例假定为 root 用户启用了 SSH 访问。如果不是这种情况, 你可以使用 scp 将 admin.conf 文件复制给其他允许访问的用户。 admin.conf 文件为用户提供了对集群的超级用户特权。 该文件应谨慎使用。对于普通用户,建议生成一个你为其授予特权的唯一证书。 你可以使用 kubeadm alpha kubeconfig user --client-name <CN> 命令执行此操作。 该命令会将 KubeConfig 文件打印到 STDOUT,你应该将其保存到文件并分发给用户。 之后,使用 kubectl create (cluster)rolebinding 授予特权。 (可选)将 API 服务器代理到本地主机 如果要从集群外部连接到 API 服务器,则可以使用 kubectl proxy: ```asp scp root@<control-plane-host>:/etc/kubernetes/admin.conf . kubectl --kubeconfig ./admin.conf proxy ``` 你现在可以在本地访问 API 服务器 http://localhost:8001/api/v1。 **清理** 如果你在集群中使用了一次性服务器进行测试,则可以关闭这些服务器,而无需进一步清理。你可以使用 kubectl config delete-cluster 删除对集群的本地引用。 但是,如果要更干净地取消配置集群, 则应首先清空节点并确保该节点为空, 然后取消配置该节点。 **删除节点** 使用适当的凭证与控制平面节点通信,运行: ```asp kubectl drain <node name> --delete-emptydir-data --force --ignore-daemonsets ``` 在删除节点之前,请重置 kubeadm 安装的状态: ```asp kubeadm reset ``` 重置过程不会重置或清除 iptables 规则或 IPVS 表。如果你希望重置 iptables,则必须手动进行: ```asp iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X ``` 如果要重置 IPVS 表,则必须运行以下命令: ```asp ipvsadm -C ``` 现在删除节点: ```asp kubectl delete node <node name> ``` 如果你想重新开始,只需运行 kubeadm init 或 kubeadm join 并加上适当的参数。 **清理控制平面** 你可以在控制平面主机上使用 kubeadm reset 来触发尽力而为的清理
上一篇:
kubeadm故障排查方法
下一篇:
Kubernetes组件介绍
该分类下的相关小册推荐:
Kubernets合辑11-持续集成
Kubernets合辑5-Pod控制器
Kubernets合辑7-存储
Kubernets合辑8-权限控制
Kubernets合辑15-持续部署
Kubernets合辑13-集群监控
Kubernetes中文教程(三)
Kubernetes中文教程(二)
Kubernets合辑9-资源约束
Kubernets合辑2-部署Ingress
Kubernets合辑10-网络
Kubernets合辑6-服务发现