问题分析
SSH 连接失败通常由以下原因引起:
- SSH 密钥未正确配置:KubeKey 需要免密登录节点。
- SSH 服务未开放或配置错误:目标节点的 SSH 服务未运行或禁止密码/密钥登录。
- 防火墙或安全组阻止连接:端口
22被阻断。 - 网络不可达:控制节点与目标节点之间网络不通。
逐步解决方案
1. 检查目标节点 SSH 服务状态
登录到目标节点 10.0.167.2,执行:
# 查看 SSH 服务状态
systemctl status sshd
# 如果未运行,启动 SSH 服务
systemctl start sshd
systemctl enable sshd
2. 配置 SSH 免密登录
在控制节点(执行 ./kk 的机器)生成 SSH 密钥并分发到目标节点:
# 生成密钥(如果尚未生成)
ssh-keygen -t rsa -b 4096
# 将公钥复制到目标节点
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.167.2
注意:如果目标节点用户不是 root,替换为实际用户名。
3. 检查 SSH 配置文件
在目标节点 10.0.167.2 上编辑 SSH 配置文件:
vi /etc/ssh/sshd_config
确保以下配置项启用:
PermitRootLogin yes # 允许 root 登录
PubkeyAuthentication yes # 启用密钥认证
PasswordAuthentication yes # 临时启用密码认证(测试用)
保存后重启 SSH 服务:
systemctl restart sshd
4. 检查防火墙规则
在目标节点上开放 22 端口:
# 使用 firewalld
firewall-cmd --add-port=22/tcp --permanent
firewall-cmd --reload
# 或临时关闭防火墙(测试用)
systemctl stop firewalld
5. 验证网络连通性
从控制节点测试到目标节点的连通性:
# 测试 ICMP 连通性
ping 10.0.167.2
# 测试 SSH 端口连通性
telnet 10.0.167.2 22
- 如果
telnet失败,检查云服务商安全组或网络 ACL 规则。
6. 调整 KubeKey 命令参数
在 KubeKey 命令中显式指定 SSH 用户和私钥路径:
./kk create cluster \
--with-kubernetes v1.22.10 \
--with-kubesphere v3.3.0 \
--user root \ # 指定 SSH 用户
--pk-file ~/.ssh/id_rsa # 指定私钥路径
验证 SSH 连接
手动测试 SSH 登录:
ssh -i ~/.ssh/id_rsa root@10.0.167.2
如果成功,继续执行 KubeKey 命令。
附录:KubeKey 配置文件示例
创建 config.yaml 文件,明确指定节点信息:
apiVersion: kubekey.kubesphere.io/v1alpha2
kind: Cluster
metadata:
name: my-cluster
spec:
hosts:
- {name: master, address: 10.0.167.2, internalAddress: 10.0.167.2, user: root, privateKeyPath: ~/.ssh/id_rsa}
roleGroups:
etcd:
- master
control-plane:
- master
worker:
- master
controlPlaneEndpoint:
domain: lb.kubesphere.local
address: ""
port: 6443
kubernetes:
version: v1.22.10
clusterName: cluster.local
network:
plugin: calico
kubePodsCIDR: 10.233.64.0/18
kubeServiceCIDR: 10.233.0.0/18
registry:
registryMirrors: []
insecureRegistries: []
addons: []
执行命令:
./kk create cluster -f config.yaml
总结
通过上述步骤,确保:
- SSH 服务在目标节点正常运行。
- 控制节点可通过密钥免密登录目标节点。
- 防火墙和安全组开放端口
22。 - KubeKey 配置文件中指定正确的节点信息和密钥路径。