在 Linux 系统中安装 Kubernetes (K8s) 时遇到问题是常见的,因为涉及多个组件和配置。下面是一些常见的安装问题和排查解决办法:
1. 检查系统要求
Kubernetes 安装前需要满足一些基本的系统要求。请确保你的系统符合以下要求:
Linux 内核版本:至少 3.10 以上。
交换空间(Swap):禁用交换空间,Kubernetes 要求禁用 swap,可以通过以下命令禁用:
sudo swapoff -a
永久禁用交换空间(编辑 /etc/fstab 文件,注释掉 swap 行):
sudo nano /etc/fstab
系统要求:确保你在虚拟机或裸机服务器上运行 Kubernetes,并且有足够的资源(如 CPU、内存)。
2. 检查网络设置
Kubernetes 是一个分布式系统,要求网络配置正确。检查以下几项:
2.1 禁用防火墙
防火墙可能会阻止 Kubernetes 组件之间的通信。可以临时禁用防火墙:
sudo systemctl stop firewalld
sudo systemctl disable firewalld
如果使用的是 UFW,也可以禁用:
sudo ufw disable
2.2 配置网络插件
Kubernetes 使用 网络插件(如 Calico、Flannel、Weave)来管理集群内的网络。确保你已安装并正确配置网络插件。如果网络插件未正确安装,节点之间的通信可能会中断。
2.3 IP 转发
Kubernetes 需要启用 IP 转发:
sudo sysctl net.ipv4.ip_forward=1
并确保该设置在重启后仍然生效:
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
3. Docker 配置
Kubernetes 节点通常依赖 Docker 容器运行时。如果 Docker 配置不正确,Kubernetes 可能无法启动。
3.1 确认 Docker 安装和配置
首先确认 Docker 是否已经正确安装:
docker --version
如果没有安装,可以通过以下命令安装 Docker:
sudo yum install -y docker
启动 Docker 服务:
sudo systemctl start docker
sudo systemctl enable docker
3.2 配置 Docker 容器运行时
Kubernetes 默认使用 Docker 作为容器运行时。在 Kubernetes 1.20 之后,它开始支持多种容器运行时(containerd、CRI-O)。确保你的 kubelet 配置与 Docker 容器运行时兼容。
检查 kubelet 配置,修改 /etc/default/kubelet,确保容器运行时为 Docker:
KUBELET_EXTRA_ARGS="--container-runtime=docker"
4. 确保正确安装 kubeadm、kubelet 和 kubectl
kubeadm 用于初始化 Kubernetes 集群,kubelet 是 Kubernetes 节点的主要组件,kubectl 是用于管理集群的命令行工具。
4.1 安装 kubeadm、kubelet 和 kubectl
确保你已安装了最新版本的 kubeadm、kubelet 和 kubectl。可以通过以下命令安装:
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
4.2 启动和启用 kubelet
kubelet 是负责节点上容器运行的主要组件。确保 kubelet 启动并且设置为开机自启动:
sudo systemctl start kubelet
sudo systemctl enable kubelet
5. 初始化 Kubernetes 集群
如果你遇到问题时,尝试使用 kubeadm 来初始化集群。
5.1 初始化控制平面节点
在主节点上执行以下命令来初始化集群:
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
注意:--pod-network-cidr 参数指定了 Pod 网络地址范围,这对某些网络插件(如 Flannel)至关重要。
执行成功后,会输出一些信息,包括加入工作节点的命令,记下它们。
5.2 配置 kubectl
执行完 kubeadm init 后,你需要配置 kubectl 访问 Kubernetes 集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6. 配置网络插件
Kubernetes 需要一个网络插件来处理 Pod 之间的网络通信。最常见的插件是 Flannel、Calico 和 Weave。
6.1 安装 Flannel
在主节点上,使用以下命令安装 Flannel 网络插件:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
6.2 安装 Calico
或者,使用 Calico 作为网络插件:
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
安装后,检查网络插件是否正常工作:
kubectl get pods --all-namespaces
7. 加入工作节点
在工作节点上运行 kubeadm join 命令,该命令是在主节点上初始化集群时输出的,用于将工作节点加入集群。
8. 常见错误及排查
8.1 错误:kubelet 启动失败
如果 kubelet 启动失败,检查日志:
journalctl -xeu kubelet
常见问题包括:Docker 未正确安装、swap 未禁用、网络插件未配置等。
8.2 错误:kubectl 无法连接
如果 kubectl 无法连接集群,检查控制平面节点上的 API server 是否正常运行:
kubectl get pods -n kube-system
8.3 错误:节点状态不正常
节点状态为 NotReady 时,检查日志:
kubectl describe node
8.4 错误:kubeadm init 失败
如果 kubeadm init 失败,通常是由于网络配置、端口冲突、Docker 容器运行时等问题。检查具体的错误日志,确保所有网络端口(如 6443、2379-2380)未被防火墙拦截,Docker 正常工作。
通过按照上述步骤逐步排查,通常可以解决大部分安装问题。