kubernets学习笔记——使用kubeadm构建kubernets集群及排错

使用kubeadm构建kubernets集群

Kubernets 为绝大部分的操作系统平台都提供了相应的软件包。通过软件包来安装Kubernets 是一种最为简单的安装方式。对于初学者来说,通过这种方式可以快速搭建起 kubernets 的运行环境。本章我以 CentOS7.9 为例,使用 kubeadm 构架 kubernets 集群。

一、准备工作

操作系统 hostname IP CPU 内存 kubernet version
centos7.9 master 192.168.111.119/24 2核 2G 1.28.12
centos7.9 node1 192.168.111.120/24 2核 2G 1.28.12
centos7.9 node2 192.168.111.121/24 2核 2G 1.28.12
centos7.9 node3 192.168.111.122/24 2核 2G 1.28.12

1、repo源配置:阿里巴巴开源镜像源

shell 复制代码
# 删除系统包管理器下的所有源配置文件
sudo rm -rf /etc/yum.repos.d/*
# 下载阿里巴巴开源镜像源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# 创建 YUM 缓存
sudo yum makecache

2、更新软件包并安装必要的系统工具

shell 复制代码
# 安装必要工具
sudo  yum install -y bash-completion lrzsz ntpdate ntp wget lsof telnet
sudo  yum install -y update
# 修改主机名
hostnamectl set-hostname master
bash
# 修改hosts文件,将hostname、ip更新至/etc/hosts文件中
echo 192.168.111.119 master >> /etc/hosts
echo 192.168.111.120 node1 >> /etc/hosts
echo 192.168.111.121 node2 >> /etc/hosts

3、同步时间

shell 复制代码
sudo ntpdate -u ntp.aliyun.com

4、禁用selinux

shell 复制代码
# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo sestatus
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

5、禁用交换分区swap

shell 复制代码
# 不建议使用 sudo swapoff -a 该命令临时禁用交换分区,而是直接编辑 /etc/fstab 文件,将如下图所示的内容注释掉。
vi /etc/fstab
# 查看修改操作是否生效
sudo grep swap /etc/fstab

6、关闭防火墙

shell 复制代码
sudo systemctl disable firewalld --now
sudo systemctl status firewalld

二、安装docker-ce、docker、cri-docker

1、安装docker-ce

shell 复制代码
# 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# 安装指定版本的Docker-CE:
# 查找Docker-CE的版本:
yum list docker-ce.x86_64 --showduplicates | sort -r|grep 19.03
yum list docker-ce.x86_64 --showduplicates | sort -r|grep 3:19.03.15-3.el7
# 安装指定版本的Docker-CE: (VERSION例如上面的17.03.0.ce.1-1.el7.centos)
sudo yum clean all
sudo yum makecache

sudo  yum install -y docker-ce-19.03.15
sudo systemctl enable docker --now

2、开启内核转发,转发 IPv4 并让 iptables 看到桥接流量,执行下述指令

shell 复制代码
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 应用 sysctl 参数而不重新启动
sudo sysctl --system
# 通过运行以下指令确认 br_netfilter 和 overlay 模块被加载
lsmod | grep br_netfilter
lsmod | grep overlay
# 通过运行以下指令确认 net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

3、安装docker

shell 复制代码
sudo yum install -y  docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 配置 Docker
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "exec-opts": ["native.cgroupdriver=cgroupfs"],
  "registry-mirrors": ["https://cyzzkyky.mirror.aliyuncs.com"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "storage-driver": "overlay2",
  "experimental": true,
  "features": {
    "buildkit": true
  }
}
EOF
sudo systemctl daemon-reload
sudo systemctl enable docker --now
sudo systemctl status docker 

4、安装cri-dockerd

shell 复制代码
sudo wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.14/cri-dockerd-0.3.14-3.el7.x86_64.rpm

sudo rpm -ivh cri-dockerd-0.3.14-3.el7.x86_64.rpm
sudo rpm -ql cri-dockerd
# sudo vi /etc/containerd/config.toml 
# sudo grep disa /etc/containerd/config.toml 
# disabled_plugins = ["cri"]
sudo systemctl enable cri-docker.service --now 
sudo systemctl status cri-docker.service

三、安装kubernets

1、配置源

shell 复制代码
sudo cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF

2、安装kubelet、kubeadm、kubectl

shell 复制代码
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

3、使用 kubeadm 创建集群

(1)查找需要的镜像文件

shell 复制代码
# 查看需要的镜像文件
kubeadm config images list

(2)下载镜像并改成上图需要的名称

shell 复制代码
# 下载镜像
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.12
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.12
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.12
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.12
docker pull registry.aliyuncs.com/google_containers/pause:3.9
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.12-0
docker pull registry.aliyuncs.com/google_containers/coredns:v1.10.1
# 重命名镜像
docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.12 registry.k8s.io/kube-apiserver:v1.28.12
docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.12 registry.k8s.io/kube-controller-manager:v1.28.12
docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.12 registry.k8s.io/kube-scheduler:v1.28.12
docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.28.12 registry.k8s.io/kube-proxy:v1.28.12
docker tag registry.aliyuncs.com/google_containers/pause:3.9 registry.k8s.io/pause:3.9
docker tag registry.aliyuncs.com/google_containers/etcd:3.5.12-0 registry.k8s.io/etcd:3.5.12-0
docker tag registry.aliyuncs.com/google_containers/coredns:v1.10.1 registry.k8s.io/coredns/coredns:v1.10.1

(3)初始化,该步骤只需要在 master 服务器上执行即可。

以下内容只需 master 服务器执行即可

shell 复制代码
# 重置
sudo kubeadm  reset --cri-socket=unix:///var/run/cri-dockerd.sock
# 初始化
sudo  kubeadm init --kubernetes-version=v1.28.10 --pod-network-cidr=10.224.0.0/16 --apiserver-advertise-address=192.168.111.119 --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock

以上内容只需 master 服务器执行即可

当出现如下内容则表示安装成功。

(4)重要信息

根据提示依次执行如下命令

shell 复制代码
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubeadm join 192.168.111.115:6443 --token vhqvk4.fkbpwefn6l2r56wr --discovery-token-ca-cert-hash sha256:116ab3b7ff9f2c5b1658281e0258a9edca724af28f10c4624d219f6c4a4b97ef,该命令是 node 节点加入集群的凭证,需要保存好。

此时执行 kubectl get nodes 命令,会出现 NotReady 状态,这个时候我们就需要安装通信插件。

四、安装通信插件

1、获取 yaml 文件

shell 复制代码
sudo wget https://projectcalico.docs.tigera.io/manifests/calico.yaml

2、查看需要用到的镜像文件

shell 复制代码
grep image calico.yaml

由于一些原因,该镜像无法正常pull,附载链接,请自行下载。

链接:https://pan.baidu.com/s/1UvKWKUz_K-Kierr3ncskdw?pwd=0o0n

提取码:0o0n

3、解压后加载镜像

shell 复制代码
tar zxvf release-v3.25.0.tgz
cd release-v3.25.0/images/
docker load -i calico-cni.tar
docker load -i calico-node.tar
docker load -i calico-kube-controllers.tar

4、执行命令 kubectl apply -f calico.yaml

测试 kubectl get nodes,状态即为 Ready 状态。

5、将 node 节点加入集群。

shell 复制代码
# 在node节点中执行,即可将 node 节点加入集群
kubeadm join 192.168.111.115:6443 --token vhqvk4.fkbpwefn6l2r56wr --discovery-token-ca-cert-hash sha256:116ab3b7ff9f2c5b1658281e0258a9edca724af28f10c4624d219f6c4a4b97ef

五、排错

1、在 node 节点执行命令 kubectl apply -f calico.yaml 时出现如下错误,此时你执行 kubectl get nodes 命令也会出现类似的错误。


原因分析:

报错信息中提到了连接被拒绝,并指出了连接的主机和端口为localhost:8080。这个错误通常是由于kubectl无法与Kubernetes API服务器建立连接导致的。Kubernetes API服务器是集群的控制平面,负责管理集群的各种操作和资源。当kubectl无法连接到API服务器时,就无法获取节点的信息,从而导致了报错。

说的直白一点就是没有找到你的 kubernets API

解决方法:

1、将 master 服务器 /etc/kubernetes/admin.conf 文件拷贝到该节点服务器相对应目录下。

shell 复制代码
scp root@192.168.111.119:/etc/kubernetes/admin.conf /etc/kubernetes/

2、在用户目录下创建文件夹 .kube ,并将 /etc/kubernetes/admin.conf 文件拷贝到 .kube目录下,并命名为config。

shell 复制代码
mkdir -p ~/.kube
cp /etc/kubernetes/admin.conf ~/.kube/config

3、将.kube/config文件的所有者更改为当前用户。

shell 复制代码
chown $(id -u):$(id -g) $HOME/.kube/config

问题解决

写在最后,讲一讲我的排错思路。

首先要确保交换分区已经关闭,

其次查看docker运行状态是否正常,systemctl status docker

再看cri-docker运行状态是否正常,systemctl status cri-docker

再次看kubelet运行状态是否正常,systemctl status kubelet

如果以后都正常,则看容器是否启动。docker ps

本章内容就到这里,大家在安装过程中遇到任何问题,评论区留言,我第一时间为大家解答。

相关推荐
OopspoO36 分钟前
qcow2镜像大小压缩
学习·性能优化
A懿轩A1 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
居居飒1 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
kkflash32 小时前
提升专业素养的实用指南
学习·职场和发展
Hejjon2 小时前
SpringBoot 整合 SQLite 数据库
笔记
1 9 J2 小时前
数据结构 C/C++(实验五:图)
c语言·数据结构·c++·学习·算法
6.943 小时前
Scala——身份证号码查询籍贯
学习·scala
爱吃西瓜的小菜鸡4 小时前
【C语言】矩阵乘法
c语言·学习·算法
探索云原生4 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
启明真纳4 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes