在安装K8s 的时候,遇到了很多问题,花了几天的时间排错,记录一下环境搭建的完整过程,希望对入门K8s 的朋友有所帮助
操作系统版本: CentOS Linux 8
Docker 版本: Docker version 23.0.1
运行 Kubernetes 服务前 的准备工作:
systemctl stop firewalld.service
systemctl disable firewalld.service
swapoff -a
### 修改 fstab 文件,将 swap 的配置 注释掉(在行首加一个 # )
#/dev/mapper/cl-swap none swap defaults 0 0
systemctl daemon-reload
setenforce 0
### 修改 /etc/sysconfig/selinux 文件,将 SELINUX=permissive 修改成 SELINUX=disabled
sed -i 's#SELINUX=permissive#SELINUX=disabled#' /etc/sysconfig/selinux
vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes repository
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
yum install -y kubelet kubeadm kubectl
完成上面的准备工作之后,下面开始配置与启动 kubernetes Master 节点
6. 启动 docker 与 kubelet 服务
systemctl enable docker.service
systemctl start docker.service
systemctl enable kubelet.service
systemctl start kubelet.service
7. 使用 kubeadm 安装并初始化 Master 节点,运行 以下命令
kubeadm init
注意: 这一步常常会报错,原因 是 默认的镜像库 registry.k8s.io 访问 不畅导致无法拉取需要的镜像
[ERROR ImagePull]: failed to pull image registry.k8s.io/kube-apiserver:v1.26.1
运行如下的命令,确认一下需要安装的镜像列表(不同的操作系统版本,得到的结果可能不一样,大家按照自己的实际情况做相应的修改):
kubeadm config images list
registry.k8s.io/kube-apiserver:v1.26.1
registry.k8s.io/kube-controller-manager:v1.26.1
registry.k8s.io/kube-scheduler:v1.26.1
registry.k8s.io/kube-proxy:v1.26.1
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.6-0
registry.k8s.io/coredns/coredns:v1.9.3
解决上面的问题,需要将默认的镜像库 registry.k8s.io 更改一下,进入 docker 官方镜像库: https://hub.docker.com/, 搜索 上面镜像列表中的镜像名称 kube-apiserver ,选择一个 下载量多的镜像库进去看看,我选的是 k8simage/kube-apiserver
根据 上面的 镜像列表 registry.k8s.io/kube-apiserver:v1.26.1 ,筛选相应的 tag v1.26.1
找到目标镜像库之后,修改初始化配置文件,将默认的 镜像库 registry.k8s.io 更改成 k8simage
### 生成 默认的初始化配置文件
kubeadm config print init-defaults > /etc/kubernetes/init-default.yaml
cat /etc/kubernetes/init-default.yaml | grep imageRepository ### 查看默认镜像库
### 将默认的镜像仓库 registry.k8s.io 修改成 k8simage( 之前在 docker 官方镜像库筛选出来的)
sed -i 's#registry.k8s.io#k8simage#' /etc/kubernetes/init-default.yaml
### 将 配置文件 init-default.yaml 里面 advertiseAddress: 1.2.3.4 中 的 ip 地址 改成你自己的 ip 地址
sed -i 's#advertiseAddress: 1.2.3.4#advertiseAddress: 10.0.2.5#' /etc/kubernetes/init-default.yaml
运行 以下的命令,重新安装并初始化 Master 节点
### 重置 kubeadm
kubeadm reset
### 使用配置文件 安装并初始化 Master 节点
kubeadm init --config="/etc/kubernetes/init-default.yaml"
上面那个步骤通常还是会报错,错误信息: [kubelet-check] Initial timeout of 40s passed. Unfortunately, an error has occurred: timed out waiting for the condition
根据上面的 提示信息 ,运行 以下命令 查看报错的具体日志信息
journalctl -xeu kubelet
查看到 具体的报错信息:“Failed to create sandbox for pod” err="rpc error: code = Unknown desc = failed to get sandbox image “registry.k8s.io/pause:3.6”: failed to pull image “registry.k8s.io/pause:3.6” ,从错误信息来看,像是拉取 registry.k8s.io/pause:3.6 镜像失败 导致sandbox 创建不了而报错 。要解决这个问题,就需要重新配置 sandbox 镜像 仓库,将默认的 registry.k8s.io/pause:3.6 修改成 “k8simage/pause:3.6” ,具体操作如下
### 生成 containerd 的默认配置文件
containerd config default > /etc/containerd/config.toml
### 查看 sandbox 的默认镜像仓库在文件中的第几行
cat /etc/containerd/config.toml | grep -n "sandbox_image"
### 使用 vim 编辑器 定位到 sandbox_image,将 仓库地址修改成 k8simage/pause:3.6
vim /etc/containerd/config.toml
sandbox_image = "k8simage/pause:3.6"
### 重启 containerd 服务
systemctl daemon-reload
systemctl restart containerd.service
运行下面的命令,重置 kubeadm, 并重新初始化,安装 Master 节点
### 重置
kubeadm reset
### 初始化
kubeadm init --config="/etc/kubernetes/init-default.yaml"
如果看到下面的信息,就是 Master 节点 已经创建成功了 Your Kubernetes control-plane has initialized successfully!
总结: 新手在 学习 Kubernetes 的安装 与配置 的 时候可能会遇到很多问题,因为 Kubernetes 还在快速的更新迭代中,跟之前的版本 相比,可能会有变动。遇到报错时,要学会使用 journalctl 日志工具 定位具体的报错信息,具体问题具体分析