Kubernetes 入门 篇 Master 节点的安装与部署

在安装K8s 的时候,遇到了很多问题,花了几天的时间排错,记录一下环境搭建的完整过程,希望对入门K8s 的朋友有所帮助

操作系统版本: CentOS Linux 8
Docker 版本: Docker version 23.0.1

运行 Kubernetes 服务前 的准备工作:

  1. 关闭防火墙 firewalld 服务
systemctl stop firewalld.service 
systemctl disable firewalld.service
  1. 关闭 交换分区 swap
swapoff -a 
### 修改 fstab 文件,将 swap 的配置 注释掉(在行首加一个 # )
#/dev/mapper/cl-swap     none                    swap    defaults        0 0 
systemctl daemon-reload
  1. 禁用 Selinux
setenforce 0
### 修改 /etc/sysconfig/selinux 文件,将 SELINUX=permissive 修改成 SELINUX=disabled 
sed -i 's#SELINUX=permissive#SELINUX=disabled#' /etc/sysconfig/selinux
  1. 配置 kubernetes 的 yum 源
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
  1. 使用配置好的 yum 安装 kubelet, kubeadm, kubectl
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 

Kubernetes 入门 篇 Master 节点的安装与部署_第1张图片
Kubernetes 入门 篇 Master 节点的安装与部署_第2张图片
7. 使用 kubeadm 安装并初始化 Master 节点,运行 以下命令

kubeadm init  

注意: 这一步常常会报错,原因 是 默认的镜像库 registry.k8s.io 访问 不畅导致无法拉取需要的镜像
[ERROR ImagePull]: failed to pull image registry.k8s.io/kube-apiserver:v1.26.1
Kubernetes 入门 篇 Master 节点的安装与部署_第3张图片
运行如下的命令,确认一下需要安装的镜像列表(不同的操作系统版本,得到的结果可能不一样,大家按照自己的实际情况做相应的修改):

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
Kubernetes 入门 篇 Master 节点的安装与部署_第4张图片
解决上面的问题,需要将默认的镜像库 registry.k8s.io 更改一下,进入 docker 官方镜像库: https://hub.docker.com/, 搜索 上面镜像列表中的镜像名称 kube-apiserver ,选择一个 下载量多的镜像库进去看看,我选的是 k8simage/kube-apiserver
Kubernetes 入门 篇 Master 节点的安装与部署_第5张图片

根据 上面的 镜像列表 registry.k8s.io/kube-apiserver:v1.26.1 ,筛选相应的 tag v1.26.1

Kubernetes 入门 篇 Master 节点的安装与部署_第6张图片
找到目标镜像库之后,修改初始化配置文件,将默认的 镜像库 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
Kubernetes 入门 篇 Master 节点的安装与部署_第7张图片
根据上面的 提示信息 ,运行 以下命令 查看报错的具体日志信息

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 入门 篇 Master 节点的安装与部署_第8张图片
总结: 新手在 学习 Kubernetes 的安装 与配置 的 时候可能会遇到很多问题,因为 Kubernetes 还在快速的更新迭代中,跟之前的版本 相比,可能会有变动。遇到报错时,要学会使用 journalctl 日志工具 定位具体的报错信息,具体问题具体分析

你可能感兴趣的:(K8s,kubernetes,docker,容器)