使用 kubeadm 快速搭建生产级 Kubernetes 集群:从工具介绍到完整实战
教程云原生容器编排【免费下载链接】kubernetes-handbookKubernetes 架构与生态从云原生到 AI 原生基础设施的构建指南项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-handbook点击查看免费下载Kubernetes 集群的搭建一直是初学者和运维人员面前的第一道坎证书签发、各组件启动顺序、网络插件选择任何一步出错都可能导致集群无法工作。kubeadm正是为解决这一问题而生的集群引导工具它在 Kubernetes 1.13 中正式 GAGeneral Availability被官方定位为以简单、合理安全且可扩展的方式引导最佳实践集群的标准工具。本文以 kubeadm 工具介绍 为骨架结合本书的 Ubuntu 上 kubeadm 实战安装文档完整讲解 kubeadm 的能力边界、成熟度现状以及从节点规划、软件安装、master 初始化、节点加入、网络插件部署到集群验收的全过程让读者在阅读后能够独立搭建一套可用于学习与测试的 Kubernetes 集群。kubeadm 基本介绍kubeadm是一个工具包可帮助用户以简单、合理安全和可扩展的方式引导遵循最佳实践的 Kubernetes 集群。它同时支持为您管理 Bootstrap Tokens引导令牌并支持集群的升级与降级操作。kubeadm 的设计目标非常明确建立一个通过 Kubernetes Conformance tests一致性测试的最小可行集群但它不会替您安装任何附加功能插件。具体而言它在其设计上并未为您安装网络解决方案需要用户自行安装第三方符合 CNI 的网络解决方案如 flannel、calico、canal 等。kubeadm 可以在多种设备上运行既可以是 Linux 笔记本电脑、虚拟机、物理/云服务器也可以是 Raspberry Pi这使得 kubeadm 非常适合与不同种类的配置系统如 Terraform、Ansible 等集成。它的适用人群也很广对于新用户kubeadm 是一种简单的方式让您开始尝试 Kubernetes对于现有用户它可能是第一次让您轻松测试自己的应用程序并缝合到一起的方式对于生态工具链它可以作为其他安装工具、更大范围部署体系中的构建块。kubeadm 可以在支持安装 deb 或 rpm 软件包的操作系统上非常轻松地安装。SIG Cluster Lifecyclekubeadm 所属的 Kubernetes 特别兴趣小组的维护者提供了预编译的软件包同时 kubeadm 也可以在其他操作系统上使用。与本书另一套 在 CentOS 上使用二进制方式部署 Kubernetes 集群 的方案相比二进制部署需要手动完成 TLS 证书签发、kubeconfig 创建、各组件 systemd 单元编写等大量步骤可参见仓库中的 kubelet 服务单元 与 kubelet 环境变量配置而 kubeadm 将生成证书 → 生成 kubeconfig → 写 Static Pod 清单 → 引导 kubelet → 下发引导令牌这一整条链路自动化大幅降低了门槛。二进制部署适合深度学习各组件交互原理kubeadm 则适合快速获得一个标准、可复现的集群。kubeadm 成熟度kubeadm 的整体功能状态曾长期处于Beta阶段并于 2018 年 12 月 3 日发布的 Kubernetes 1.13 版本中宣布GA可以支持生产。下表反映了其 GA 前各子功能的成熟度分级帮助读者理解哪些能力是稳定可用的、哪些仍在演进中分类成熟度 LevelCommand line UXbetaImplementationbetaConfig file APIalphaSelf-hostingalphakubeadm alpha subcommandsalphaCoreDNSalphaDynamicKubeletConfigalpha从表中可以看到命令行体验Command line UX与核心实现Implementation最先成熟而配置文件 APIConfig file API、自托管Self-hosting、kubeadm alpha 子命令、CoreDNS 集成以及 DynamicKubeletConfig 等子功能在早期仍处于 alpha 级别处于积极开发中。随着工具的发展创建集群的实现细节可能会稍有调整但总体实现已经相当稳定。需要说明的是按照 kubeadm 的定义任何kubeadm alpha子命令都在 alpha 级别上受支持生产环境中应谨慎使用。支持时间表Kubernetes 版本通常支持九个月在此期间如果发现严重的错误或安全问题官方可能会从发布分支发布补丁程序版本。这一支持周期同样适用于 kubeadm。下表是早期 Kubernetes 版本的发布与停止支持时间表Kubernetes versionRelease monthEnd-of-life-monthv1.6.xMarch 2017December 2017v1.7.xJune 2017March 2018v1.8.xSeptember 2017June 2018v1.9.xDecember 2017September 2018v1.10.xMarch 2018December 2018v1.11.xJune 2018March 2019v1.12.xSeptember 2018June 2019v1.13.xDecember 2018September 2019读者在实际使用中应始终选择当前仍在支持窗口内的版本并及时关注发布分支的补丁更新生产环境还需要参考官方最新的支持周期表。实战用 kubeadm 搭建 Kubernetes 测试集群下面以仓库中 Ubuntu 上 kubeadm 实战安装文档 为例完整演示从零开始搭建一套包含 1 个 master 与 3 个 node 的 Kubernetes 测试集群。该方案适用于学习和测试用途生产用途的环境需要考虑各个组件的高可用建议参考 Kubernetes 官方相关安装文档。节点规划与系统准备本次安装建议至少 4 台服务器或虚拟机每台服务器 4G 内存、2 个 CPU 核心以上基本架构为 1 台 master 节点、3 台 slave 节点。节点信息如下角色主机名IP 地址MasterUbuntu-master192.168.5.200Slaveubuntu-1192.168.5.201Slaveubuntu-2192.168.5.202Slaveubuntu-3192.168.5.203准备工作包括默认方式安装 Ubuntu Server 版本 16.04在每个节点配置主机名映射/etc/hosts# cat /etc/hosts 127.0.0.1 localhost 192.168.0.200 Ubuntu-master 192.168.0.201 Ubuntu-1 192.168.0.202 Ubuntu-2 192.168.0.203 Ubuntu-3如果连接 gcrGoogle Container Registry网站不方便、无法下载镜像安装过程会卡在拉取镜像阶段。此时可以预先准备离线镜像包解压后得到多个 tar 包使用docker load xxxx.tar逐个导入即可。在所有节点上安装 kubeadmkubeadm、kubelet、kubectl 通过 apt 软件源安装。为了在国内网络环境下顺利安装可以使用阿里云的系统源与 Kubernetes 源配置/etc/apt/sources.list如下$ cat /etc/apt/sources.list # 系统安装源 deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted deb http://mirrors.aliyun.com/ubuntu/ xenial universe deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse # kubeadm及kubernetes组件安装源 deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main安装 Docker可以使用系统源的 docker.io 软件包版本 1.13.1# apt-get install docker.io Reading package lists... Done Building dependency tree Reading state information... Done docker.io is already the newest version (1.13.1-0ubuntu1~16.04.2). 0 upgraded, 0 newly installed, 0 to remove and 4 not upgraded.更新源可以不理会 GPG 的报错信息# apt-get update Hit:1 http://mirrors.aliyun.com/ubuntu xenial InRelease Hit:2 http://mirrors.aliyun.com/ubuntu xenial-updates InRelease Hit:3 http://mirrors.aliyun.com/ubuntu xenial-backports InRelease Get:4 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease [8,993 B] Ign:4 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease Fetched 8,993 B in 0s (20.7 kB/s) Reading package lists... Done W: GPG error: https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldnt be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB W: The repository https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease is not signed. N: Data from such a repository cant be authenticated and is therefore potentially dangerous to use. N: See apt-secure(8) manpage for repository creation and user configuration details.在源未签名的情况下使用--allow-unauthenticated强制安装 kubelet、kubeadm、kubectl 软件包会同时安装依赖的 kubernetes-cni 与 socat# apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: kubernetes-cni socat The following NEW packages will be installed: kubeadm kubectl kubelet kubernetes-cni socat 0 upgraded, 5 newly installed, 0 to remove and 4 not upgraded. Need to get 56.9 MB of archives. After this operation, 410 MB of additional disk space will be used. WARNING: The following packages cannot be authenticated! kubernetes-cni kubelet kubectl kubeadm Authentication warning overridden. Get:1 http://mirrors.aliyun.com/ubuntu xenial/universe amd64 socat amd64 1.7.3.1-1 [321 kB] Get:2 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 kubernetes-cni amd64 0.6.0-00 [5,910 kB] Get:3 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 kubelet amd64 1.10.1-00 [21.1 MB] Get:4 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 kubectl amd64 1.10.1-00 [8,906 kB] Get:5 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 kubeadm amd64 1.10.1-00 [20.7 MB] Fetched 56.9 MB in 5s (11.0 MB/s)kubeadm 安装完成后就可以使用它来快速安装部署 Kubernetes 集群了。使用 kubeadm 初始化 master 节点在 master 节点上执行kubeadm init。因为要使用 canal 网络插件需要在初始化时加上网络配置参数将 Kubernetes 的 Pod 子网设置为10.244.0.0/16——注意此处不要随意修改为其他地址因为这个值必须与后续 canal 的 yaml 中的配置保持一致如果修改请一并修改。说明初始化过程需要从 gcr 站点拉取控制平面容器镜像kube-apiserver、kube-controller-manager、kube-scheduler、etcd 等。如果网络不便可以使用上文准备工作中提到的离线镜像包预先导入。# kubeadm init --pod-network-cidr10.244.0.0/16 --apiserver-advertise-address192.168.0.200 [init] Using Kubernetes version: v1.10.1 [init] Using Authorization modes: [Node RBAC] [preflight] Running pre-flight checks. [WARNING FileExisting-crictl]: crictl not found in system path Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl [preflight] Starting the kubelet service [certificates] Generated ca certificate and key. [certificates] Generated apiserver certificate and key. [certificates] apiserver serving cert is signed for DNS names [ubuntu-master kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 192.168.0.200] [certificates] Generated apiserver-kubelet-client certificate and key. [certificates] Generated etcd/ca certificate and key. [certificates] Generated etcd/server certificate and key. [certificates] etcd/server serving cert is signed for DNS names [localhost] and IPs [127.0.0.1] [certificates] Generated etcd/peer certificate and key. [certificates] etcd/peer serving cert is signed for DNS names [ubuntu-master] and IPs [192.168.0.200] [certificates] Generated apiserver-etcd-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: /etc/kubernetes/admin.conf [kubeconfig] Wrote KubeConfig file to disk: /etc/kubernetes/kubelet.conf [kubeconfig] Wrote KubeConfig file to disk: /etc/kubernetes/controller-manager.conf [kubeconfig] Wrote KubeConfig file to disk: /etc/kubernetes/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 might take a minute or longer if the control plane images have to be pulled. [apiclient] All control plane components are healthy after 28.003828 seconds [uploadconfig] Storing the configuration used in ConfigMap kubeadm-config in the kube-system Namespace [markmaster] Will mark node ubuntu-master as master by adding a label and a taint [markmaster] Master ubuntu-master tainted and labelled with key/value: node-role.kubernetes.io/master [bootstraptoken] Using token: rw4enn.mvk547juq7qi2b5f [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] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster [bootstraptoken] Creating the cluster-info ConfigMap in the kube-public namespace [addons] Applied essential addon: kube-dns [addons] Applied essential addon: kube-proxy Your Kubernetes master has initialized successfully! To start using your cluster, you need to run the following 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 options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ You can now join any number of machines by running the following on each node as root: kubeadm join 192.168.0.200:6443 --token rw4enn.mvk547juq7qi2b5f --discovery-token-ca-cert-hash sha256:ba260d5191213382a806a9a7d92c9e6bb09061847c7914b1ac584d0c69471579从这段输出可以完整看到 kubeadm 的工作流程理解它在后台替我们做了什么Preflight 检查检查系统环境端口、内核参数、crictl 是否存在等并启动 kubelet 服务证书生成在/etc/kubernetes/pki下生成 ca、apiserver、etcd、front-proxy、sa 等全套证书与密钥——这正是二进制部署中最繁琐的环节可对照 创建 TLS 证书和秘钥 一文kubeconfig 写入为 admin、kubelet、controller-manager、scheduler 分别生成 kubeconfig 文件控制平面部署将 kube-apiserver、kube-controller-manager、kube-scheduler、etcd 以Static Pod 清单的形式写入/etc/kubernetes/manifests由 kubelet 负责拉起——这就是 kubeadm 实现控制平面自举的核心机制标记 master给 master 节点打上node-role.kubernetes.io/master标签与污点taint默认阻止业务 Pod 调度到 master 上引导令牌生成 bootstrap token并配置好 RBAC 规则使节点可以通过 Bootstrap Token 提交 CSR 获取长期证书、自动审批 CSR、并支持节点客户端证书轮换基础插件应用 kube-dnskube-system 命名空间与 kube-proxy 两个必要插件。配置 kubectl 访问集群按初始化输出末尾的提示在 master 节点执行如下命令配置 kubectlmkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config这样 master 节点就配置好了可以使用 kubectl 进行各种操作。Slave 节点加入集群在每台 slave 节点执行kubeadm init输出的 join 命令包含 API Server 地址、bootstrap token 与 CA 证书哈希指纹即可将节点加入集群# kubeadm join 192.168.0.200:6443 --token rw4enn.mvk547juq7qi2b5f --discovery-token-ca-cert-hash sha256:ba260d5191213382a806a9a7d92c9e6bb09061847c7914b1ac584d0c69471579 [preflight] Running pre-flight checks. [WARNING FileExisting-crictl]: crictl not found in system path Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl [discovery] Trying to connect to API Server 192.168.0.200:6443 [discovery] Created cluster-info discovery client, requesting info from https://192.168.0.200:6443 [discovery] Requesting info from https://192.168.0.200:6443 again to validate TLS against the pinned public key [discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server 192.168.0.200:6443 [discovery] Successfully established connection with API Server 192.168.0.200:6443 This node has joined the cluster: * Certificate signing request was sent to master and a response was received. * The Kubelet was informed of the new secure connection details. Run kubectl get nodes on the master to see this node join the cluster.join 过程中值得关注的细节--discovery-token-ca-cert-hash提供了CA 证书指纹校验slave 节点会通过cluster-info获取集群信息并用固定的公钥校验 TLS防止中间人攻击节点通过 Bootstrap Token 向 master 提交CSR证书签名请求获得长期有效的客户端证书之后 kubelet 即使用该证书与 API Server 安全通信。检查节点与系统组件状态在所有节点完成 join 后在 master 上查看节点状态此时节点通常处于 NotReady 状态——这是正常的因为还没有安装网络插件# kubectl get node NAME STATUS ROLES AGE VERSION ubuntu-1 NotReady none 6m v1.10.1 ubuntu-2 NotReady none 6m v1.10.1 ubuntu-3 NotReady none 6m v1.10.1 ubuntu-master NotReady master 10m v1.10.1查看 kube-system 命名空间中的系统组件 PodrootUbuntu-master:~# kubectl get pod -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE etcd-ubuntu-master 1/1 Running 0 21m 192.168.0.200 ubuntu-master kube-apiserver-ubuntu-master 1/1 Running 0 21m 192.168.0.200 ubuntu-master kube-controller-manager-ubuntu-master 1/1 Running 0 22m 192.168.0.200 ubuntu-master kube-dns-86f4d74b45-wkfk2 0/3 Pending 0 22m none none kube-proxy-6ddb4 1/1 Running 0 22m 192.168.0.200 ubuntu-master kube-proxy-7ngb9 1/1 Running 0 17m 192.168.0.202 ubuntu-2 kube-proxy-fkhhx 1/1 Running 0 18m 192.168.0.201 ubuntu-1 kube-proxy-rh4lq 1/1 Running 0 18m 192.168.0.203 ubuntu-3 kube-scheduler-ubuntu-master 1/1 Running 0 21m 192.168.0.200 ubuntu-master可以看到etcd、kube-apiserver、kube-controller-manager、kube-scheduler 与各节点的 kube-proxy 均已正常运行只有 kube-dns 处于 Pending 状态——它需要在网络插件完成安装后才会正常运行。安装 CNI 网络插件 canal正如 kubeadm 的设计初衷所述它不负责安装网络解决方案需要用户自行部署 CNI 网络插件。本例选用canalCalico 与 Flannel 的组合方案兼具 Flannel 的简单性与 Calico 的 NetworkPolicy 能力。部署两个文件一个是配置 canal 的 RBAC 权限一个是部署 canal 的 DaemonSet# kubectl apply -f https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/canal/rbac.yaml clusterrole.rbac.authorization.k8s.io calico created clusterrole.rbac.authorization.k8s.io flannel created clusterrolebinding.rbac.authorization.k8s.io canal-flannel created clusterrolebinding.rbac.authorization.k8s.io canal-calico created # kubectl apply -f https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/canal/canal.yaml configmap canal-config created daemonset.extensions canal created customresourcedefinition.apiextensions.k8s.io felixconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io bgpconfigurations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io ippools.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io clusterinformations.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io globalnetworkpolicies.crd.projectcalico.org created customresourcedefinition.apiextensions.k8s.io networkpolicies.crd.projectcalico.org created serviceaccount canal created安装完成后查看 canal 与 kube-dns 的状态# kubectl get pod -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE canal-fc94k 3/3 Running 10 4m 192.168.0.201 ubuntu-1 canal-rs2wp 3/3 Running 10 4m 192.168.0.200 ubuntu-master canal-tqd4l 3/3 Running 10 4m 192.168.0.202 ubuntu-2 canal-vmpnr 3/3 Running 10 4m 192.168.0.203 ubuntu-3 etcd-ubuntu-master 1/1 Running 0 28m 192.168.0.200 ubuntu-master kube-apiserver-ubuntu-master 1/1 Running 0 28m 192.168.0.200 ubuntu-master kube-controller-manager-ubuntu-master 1/1 Running 0 29m 192.168.0.200 ubuntu-master kube-dns-86f4d74b45-wkfk2 3/3 Running 0 28m 10.244.2.2 ubuntu-3 kube-proxy-6ddb4 1/1 Running 0 28m 192.168.0.200 ubuntu-master kube-proxy-7ngb9 1/1 Running 0 24m 192.168.0.202 ubuntu-2 kube-proxy-fkhhx 1/1 Running 0 24m 192.168.0.201 ubuntu-1 kube-proxy-rh4lq 1/1 Running 0 24m 192.168.0.203 ubuntu-3 kube-scheduler-ubuntu-master 1/1 Running 0 28m 192.168.0.200 ubuntu-master可以看到 canal 和 kube-dns 都已经运行正常kube-dns Pod 获得了10.244.2.2的 Pod 网段地址说明 Pod 网络已经打通。此时再查看集群节点状态# kubectl get node NAME STATUS ROLES AGE VERSION ubuntu-1 Ready none 27m v1.10.1 ubuntu-2 Ready none 27m v1.10.1 ubuntu-3 Ready none 27m v1.10.1 ubuntu-master Ready master 31m v1.10.1四个节点全部进入Ready状态一个基本功能正常的 Kubernetes 测试环境就部署完毕了。可选让 master 节点也运行 Pod默认情况下 master 节点带node-role.kubernetes.io/master污点不会调度业务 Pod。在测试环境可以移除该污点让 master 也运行 Pod不建议在生产环境如此操作# kubectl taint nodes --all node-role.kubernetes.io/master- node ubuntu-master untainted taint node-role.kubernetes.io/master: not found taint node-role.kubernetes.io/master: not found taint node-role.kubernetes.io/master: not found集群初始化后的扩展与验证一套通过 kubeadm 引导的集群已经具备核心控制平面与 kube-proxy/kube-dns 基础插件之后可以按需扩展。这里列出几个与仓库配套的常用扩展方向集群 DNSCoreDNS/kube-dnskubeadm 在早期版本默认部署 kube-dns新版本默认部署 CoreDNS。仓库中提供了 CoreDNS 部署模板其中CLUSTER_DOMAIN、REVERSE_CIDRS、CLUSTER_DNS_IP是需要根据集群实际配置替换的占位符Corefile 中的kubernetes插件块负责将 Service 名解析为集群域名prometheus :9153暴露 DNS 指标cache 30设置 30 秒缓存集群监控可参考 使用 Prometheus 监控 Kubernetes 集群 与 heapster 安装其中 HPA 示例清单位于 manifests/HPAIngress 控制器可参考 Traefik Ingress 安装仓库中的 traefik.yaml 以 DaemonSet 加hostNetwork: true方式部署 Traefik 并监听 80 端口ingress-rbac.yaml 为 ingress ServiceAccount 绑定 cluster-admin 角色以读取 Ingress 规则存储与中间件后台存储可参考本书最佳实践中的 存储管理 相关内容如 NFS、Ceph、OpenEBS 等方案。常见问题与注意事项结合 Ubuntu 上 kubeadm 实战安装文档 中的实操经验总结以下常见问题镜像拉取卡住kubeadm init需要从 gcr 拉取控制平面镜像网络受限时安装会卡在[init] Waiting for the kubelet to boot up the control plane as Static Pods。解决方案是提前docker load导入离线镜像包或使用可访问的镜像仓库节点一直 NotReady绝大多数情况是未安装 CNI 网络插件或--pod-network-cidr与网络插件 yaml 中的 CIDR 不一致如本例统一为10.244.0.0/16。注意 Pod 子网与 Service 子网默认10.96.0.0/12是两套独立的网段从初始化输出可以看到 apiserver 证书中同时签发了 Service IP10.96.0.1与节点地址192.168.0.200apt 源 GPG 报错未签名源导致的NO_PUBKEY报错可以忽略安装时使用--allow-unauthenticated参数即可生产环境建议正确导入官方 GPG 公钥kube-dns 处于 Pending这是网络插件尚未就绪的正常表现网络插件安装完成后会自动变为 Running加入集群的 token 过期kubeadm init输出的 token 默认有效期 24 小时过期后可在 master 上执行kubeadm token create --print-join-command重新生成版本一致性kubelet、kubeadm、kubectl 应尽量保持相同版本避免组件间 API 不兼容同时应关注 支持时间表 中的版本支持周期。总结kubeadm 将 Kubernetes 集群引导过程中最繁琐、最容易出错的环节证书、kubeconfig、控制平面自举、引导令牌、CSR 自动审批全部自动化同时刻意将网络插件等附加组件的选择权留给用户保持了最小可行集群的简洁与可组合性。它既适合新用户快速上手也适合作为 Terraform、Ansible 等更大规模部署体系中的构建块。通过本文的完整实战读者已经可以独立完成一套包含多节点的 Kubernetes 集群的搭建、网络打通与基础插件扩展。需要更深入理解集群内部工作原理的读者可以继续阅读本书的 二进制方式部署 Kubernetes 集群 系列含 创建 TLS 证书和秘钥、创建 kubeconfig 文件、部署 master 节点 等章节从手动部署的角度理解 kubeadm 自动化的每一步背后究竟发生了什么。赞分享教程云原生容器编排【免费下载链接】kubernetes-handbookKubernetes 架构与生态从云原生到 AI 原生基础设施的构建指南项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-handbook点击查看免费下载相关推荐Kubernetes集群引导神器kubeadm快速创建生产级K8s集群的完整指南Kubernetes集群引导神器kubeadm快速创建生产级K8s集群的完整指南 kubeadm是Kubernetes官方提供的集群引导工具能够帮助用户快速robosuite渲染系统深度解析从基础渲染到照片级真实感的完整实现robosuite渲染系统深度解析从基础渲染到照片级真实感的完整实现 robosuite是一个模块化的机器人学习仿真框架和基准测试平台其强大的渲染系统支持从强化学习物理引擎终极指南使用CRI-O和kubeadm快速部署生产级Kubernetes集群终极指南使用CRI O和kubeadm快速部署生产级Kubernetes集群 想要快速搭建稳定可靠的Kubernetes生产环境CRI O作为专为Kuber云原生容器运行时创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

多点位移计安装与监测全解析:测点布置、灌浆到数据计算

多点位移计安装与监测全解析:测点布置、灌浆到数据计算

简介:这是一份系统讲解多点位移计安装与监测技术的PPT学习教案,面向水利水电、岩土工程、边坡与地下工程等领域的监测人员、工程师及相关专业学生。内容从多点位移计的布设原则入手,依次介绍其组成结构、工作原理、现场检验、率定设备与操作方…

2026/9/23 16:40:36 阅读更多 →
华为交换机路由器VLAN配置实例:从Access到VLANIF实战

华为交换机路由器VLAN配置实例:从Access到VLANIF实战

简介:一份以华为路由器R2621与交换机S3026e为例的VLAN配置实战文档,面向网络工程初学者、运维人员及华为设备认证备考者,解决多VLAN组网中的地址规划、虚拟网与物理网互通及访问控制问题。文档从4台PC的实验拓扑出发,给出各终端IP…

2026/9/23 16:40:36 阅读更多 →
博客系统开发实战:Vue3与Pinia构建轻量级个人站点

博客系统开发实战:Vue3与Pinia构建轻量级个人站点

我无法根据当前输入内容生成符合要求的博文。原因如下:项目标题“屌丝网,上线了 哈哈,”属于无实质技术/功能指向的网络调侃式表达,缺乏明确领域归属(科技/生活/职场/手工等)、无具体功能描述、无技术动因或…

2026/9/23 16:40:36 阅读更多 →

最新新闻

EMC Isilon X400换内存指南:集群节点维护的完整闭环

EMC Isilon X400换内存指南:集群节点维护的完整闭环

简介:一份面向存储运维与硬件维护人员的EMC Isilon X400 DIMM内存更换手册PDF文档,专门解决X400节点内存故障时的合规更换问题。手册完整覆盖更换生命周期:前期下载Field Replacement Unit(FRU)包并收集日志&#xff0…

2026/9/23 20:03:16 阅读更多 →
Python KNN手写数字识别课程设计:源码解析与调参避坑指南

Python KNN手写数字识别课程设计:源码解析与调参避坑指南

简介:这是一份面向高校学生与Python初学者的KNN手写数字识别实战项目,可直接用于课程设计、期末大作业或算法入门练习。项目以Python实现KNN分类算法,配套完整手写数字数据集,代码含详细注释,新手也能看懂并快速部署运…

2026/9/23 20:03:16 阅读更多 →
淘宝美工收费表源码解析:从入门到精通的避坑指南

淘宝美工收费表源码解析:从入门到精通的避坑指南

淘宝美工收费表源码解析:从入门到精通的避坑指南 刚入行的朋友常陷入误区,以为背熟 CSS 语法就能直接上手电商详情页。现实是, 学会语法却不知怎么搭项目…

2026/9/23 20:03:16 阅读更多 →
OpenGL环境搭建全指南:GLFW与GLAD跨平台配置详解

OpenGL环境搭建全指南:GLFW与GLAD跨平台配置详解

1. 开始之前:OpenGL 到底是什么在聊环境搭建之前,我必须先泼一盆冷水:很多人买了 OpenGL 的书、保存了一堆教程,结果连第一个三角形都没看到,问题几乎都出在同一件事——他们以为 OpenGL 是一个“库”,下载…

2026/9/23 20:03:16 阅读更多 →
MFC屏幕截图实战:从GDI BitBlt到DPI与多显示器适配

MFC屏幕截图实战:从GDI BitBlt到DPI与多显示器适配

简介:面向 MFC/C 开发者的屏幕截图示例工程,基于 Visual Studio 和 MFC 框架,演示如何借助 GDI、CDC、CBitmap、BitBlt 等核心 API 捕获整个屏幕或指定窗口,并保存为 BMP/JPEG 文件。工程代码包含对话框界面与完整截屏实现&#x…

2026/9/23 20:03:16 阅读更多 →
做视频监控别再求人!EasyCVR一套平台,把14种协议的摄像头全接进同一个大屏

做视频监控别再求人!EasyCVR一套平台,把14种协议的摄像头全接进同一个大屏

做安防和弱电的朋友,大概率都经历过这样的“至暗时刻”:公司楼下是新装的智能枪机,仓库里还有十年前的老球机;总部用海康,分公司用大华,办公网里还“顺手”挂着几台萤石云、乐橙云的家用摄像头。每路摄像头…

2026/9/23 20:02:15 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →