我在将工作节点加入配置的三个主节点时遇到了问题。值得注意的是,我对网络方面的了解甚少(我宁愿像我五岁的时候一样解释,这样我就可以确保我不会错过任何东西。)
我一直在关注位于以下位置的指南: https://dockerlabs.collabnix.com/kubernetes/beginners/Install-and-configure-a-multi-master-Kubernetes-cluster-with-kubeadm.html 有一些变化 - IP 地址不同,并且当前 K8 不支持 kubeadm.k8s.io/v1alpha3 的配置。我已更新为使用 kubeadm.k8s.io/v1beta3,尽管初始配置中的两个标签似乎没有并行(apiServerCertSANs 和 apiServerExtraArgs),我不知道它们是否必不可少。我拥有的 Kubectl 版本是 1.24.0
主人已经用以下消息初始化:
W0510 09:17:54.102466 8717 initconfiguration.go:306] 错误解组配置模式。GroupVersionKind{Group:“kubeadm.k8s.io”, Version:“v1beta3”, Kind:“ClusterConfiguration”}:严格解码错误:未知字段“apiServerExtraArgs”,未知字段“apiserver-cert-extra-sans” [init] 使用 Kubernetes 版本:v1.24.0 [preflight] 运行飞行前检查 [preflight] 提取设置 Kubernetes 集群所需的映像 [preflight] 这可能需要一两分钟,具体取决于您的互联网连接速度 [preflight] 您也可以使用“kubeadm config images pull”预先执行此操作 [certs] 使用 certificateDir 文件夹“/etc/kubernetes/pki” [certs] 生成“ca”证书和密钥 [certs] 生成“apiserver”证书和密钥[certs] apiserver 服务证书已针对 DNS 名称 [kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local master1] 和 IP [10.96.0.1 10.50.0.50 10.50.0.10] 进行签名 [certs] 生成“apiserver-kubelet-client”证书和密钥 [certs] 生成“front-proxy-ca”证书和密钥 [certs] 生成“front-proxy-client”证书和密钥 [certs] 外部 etcd 模式:跳过 etcd/ca 证书颁发机构生成 [certs] 外部 etcd 模式:跳过 etcd/server 证书生成 [certs] 外部 etcd 模式:跳过 etcd/peer 证书生成 [certs] 外部 etcd 模式:跳过 etcd/healthcheck-client 证书生成 [certs] 外部 etcd 模式:跳过 apiserver-etcd-client 证书生成 [certs] 生成“sa”密钥和公钥[kubeconfig] 使用 kubeconfig 文件夹“/etc/kubernetes” [kubeconfig] 写入“admin.conf”kubeconfig 文件 [kubeconfig] 写入“kubelet.conf”kubeconfig 文件 [kubeconfig] 写入“controller-manager.conf”kubeconfig 文件 [kubeconfig] 写入“scheduler.conf”kubeconfig 文件 [kubelet-start] 将带有标志的 kubelet 环境文件写入文件“/var/lib/kubelet/kubeadm-flags.env” [kubelet-start] 将 kubelet 配置写入文件“/var/lib/kubelet/config.yaml” [kubelet-start] 启动 kubelet [control-plane] 使用清单文件夹“/etc/kubernetes/manifests” [control-plane] 为“kube-apiserver”创建静态 Pod 清单 [control-plane] 为“kube-controller-manager”创建静态 Pod 清单 [control-plane] 为“kube-scheduler” [wait-control-plane] 等待 kubelet 从目录“/etc/kubernetes/manifests”将控制平面作为静态 Pod 启动。这可能需要最多 4 分 0 秒 [apiclient] 6 之后所有控制平面组件均处于健康状态。521293 秒 [upload-config] 将 ConfigMap“kubeadm-config”中使用的配置存储在“kube-system”命名空间中 [kubelet] 使用集群中 kubelet 的配置在命名空间 kube-system 中创建 ConfigMap“kubelet-config” [upload-certs] 跳过阶段。请参阅--upload-certs [mark-control-plane] 通过添加标签将节点master1标记为控制平面:[node-role.kubernetes.io/control-plane node.kubernetes.io/exclude-from-external-load-balancers] [mark-control-plane] 通过添加污点将节点master1标记为控制平面 [node-role.kubernetes.io/master:NoSchedule node-role.kubernetes.io/control-plane:NoSchedule] [bootstrap-token] 使用令牌:1w1x1s.7qwcr1m1e5hj3yp3 [bootstrap-token] 配置引导令牌、cluster-info ConfigMap、RBAC角色 [bootstrap-token] 配置RBAC规则以允许节点引导令牌获取节点 [bootstrap-token] 配置RBAC规则以允许节点引导令牌发布CSR以便节点获取长期证书凭证 [bootstrap-token] 配置 RBAC 规则以允许 csrapprover 控制器自动从节点引导令牌批准 CSR [bootstrap-token] 配置 RBAC 规则以允许对集群中的所有节点客户端证书进行证书轮换 [bootstrap-token] 在“kube-public”命名空间中创建“cluster-info”ConfigMap [kubelet-finalize] 更新“/etc/kubernetes/kubelet.conf”以指向可轮换的 kubelet 客户端证书和密钥 [addons] 应用必备插件:CoreDNS [addons] 应用必备插件:kube-proxyconf” 指向可轮换的 kubelet 客户端证书和密钥 [addons] 应用必备插件:CoreDNS [addons] 应用必备插件:kube-proxyconf” 指向可轮换的 kubelet 客户端证书和密钥 [addons] 应用必备插件:CoreDNS [addons] 应用必备插件:kube-proxy
您的 Kubernetes 控制平面已成功初始化!
但是所有三个节点都在节点中列出(诚然,它们为 NotReady,但我相信那是因为我没有部署像 Calico 这样的东西),并且我已经到了尝试添加工作节点的地步。首先运行提供的 join 命令会给我带来错误:
[preflight] 正在运行预检 [preflight] 正在从集群读取配置... [preflight] 仅供参考:您可以使用“kubectl -n kube-system get cm kubeadm-config -o yaml”查看此配置文件 错误执行阶段预检:托管新控制平面实例的一个或多个条件不满足。
[加载 CA 证书失败:无法加载证书文件 /etc/kubernetes/pki/ca.crt:打开 /etc/kubernetes/pki/ca.crt:没有此文件或目录,加载服务帐户密钥失败:无法加载私钥文件 /etc/kubernetes/pki/sa.key:打开 /etc/kubernetes/pki/sa.key:没有此文件或目录,加载前端代理 CA 证书失败:无法加载证书文件 /etc/kubernetes/pki/front-proxy-ca.crt:打开 /etc/kubernetes/pki/front-proxy-ca.crt:没有此文件或目录]
请确保:
- 集群具有稳定的controlPlaneEndpoint地址。
- 提供控制平面实例之间必须共享的证书。
要查看此错误的堆栈跟踪,请执行 --v=5 或更高版本
为了解决这个问题,我将证书从其中一个主服务器复制到了工作服务器上,/etc/kubernetes/pki/
然后再次运行连接,出现以下错误:
[preflight] 运行预检 [preflight] 从集群读取配置... [preflight] 仅供参考:您可以使用“kubectl -n kube-system get cm kubeadm-config -o yaml”查看此配置文件 [preflight] 在初始化新的控制平面实例错误执行阶段预检之前运行预检: [preflight] 发生了一些致命错误: [ERROR ExternalEtcdClientCertificates]:/etc/etcd/ca.pem 不存在 [ERROR ExternalEtcdClientCertificates]:/etc/etcd/kubernetes.pem 不存在 [ERROR ExternalEtcdClientCertificates]:/etc/etcd/kubernetes-key.pem 不存在 [preflight] 如果您知道自己在做什么,可以使用以下命令进行非致命检查
--ignore-preflight-errors=...
要查看此错误的堆栈跟踪,请使用 --v=5 或更高版本执行
再次,我从 的主服务器复制了证书/etc/etcd/
。最后,我收到此错误:
[preflight] 运行飞行前检查 [preflight] 从集群读取配置... [preflight] 仅供参考:您可以使用“kubectl -n kube-system get cm kubeadm-config -o yaml”查看此配置文件 [preflight] 在初始化新的控制平面实例之前运行飞行前检查 [preflight] 拉取设置 Kubernetes 集群所需的镜像 [preflight] 这可能需要一两分钟,具体取决于您的互联网连接速度 [preflight] 您也可以使用“kubeadm config images pull”预先执行此操作 [certs] 使用 certificateDir 文件夹“/etc/kubernetes/pki” [certs] 使用现有的“front-proxy-client”证书和密钥错误执行阶段 control-plane-prepare/certs:创建 PKI 资产时出错:写入或验证证书失败 “apiserver”:证书 apiserver 无效:x509:证书对 kubernetes、kubernetes.default 有效, kubernetes.default.svc、kubernetes.default.svc.cluster.local、master2,而不是 worker1 要查看此错误的堆栈跟踪,请使用 --v=5 或更高版本执行
如果我从给定的主服务器复制证书,则该证书会显示对该主服务器有效(上面的 master2)。我如何在工作服务器上生成/使用证书,因为这些证书似乎是由 INIT 命令而不是 JOIN 命令生成的?
作为一种潜在的解决方案,我考虑在内部关闭 SSL,如这篇文章所述 https://stackoverflow.com/questions/60970744/how-to-run-kubernetes-without-ssl-network 但我在 YAML 中找不到要修改的相关部分。如果可以的话,我宁愿使用 SSL,但如果需要,我也愿意了解如何禁用它。