使用kubeadm构建kubernets集群
- 一、准备工作
- 二、安装docker-ce、docker、cri-docker
-
- 1、安装docker-ce
- [2、开启内核转发,转发 IPv4 并让 iptables 看到桥接流量,执行下述指令](#2、开启内核转发,转发 IPv4 并让 iptables 看到桥接流量,执行下述指令)
- 3、安装docker
- 4、安装cri-dockerd
- 三、安装kubernets
-
- 1、配置源
- 2、安装kubelet、kubeadm、kubectl
- [3、使用 kubeadm 创建集群](#3、使用 kubeadm 创建集群)
-
- (1)查找需要的镜像文件
- (2)下载镜像并改成上图需要的名称
- [(3)初始化,该步骤只需要在 master 服务器上执行即可。](#(3)初始化,该步骤只需要在 master 服务器上执行即可。)
- (4)重要信息
- 四、安装通信插件
-
- [1、获取 yaml 文件](#1、获取 yaml 文件)
- 2、查看需要用到的镜像文件
- 3、解压后加载镜像
- [4、执行命令 kubectl apply -f calico.yaml](#4、执行命令 kubectl apply -f calico.yaml)
- [5、将 node 节点加入集群。](#5、将 node 节点加入集群。)
- 五、排错
-
- [1、在 node 节点执行命令 kubectl apply -f calico.yaml 时出现如下错误,此时你执行 kubectl get nodes 命令也会出现类似的错误。](#1、在 node 节点执行命令 kubectl apply -f calico.yaml 时出现如下错误,此时你执行 kubectl get nodes 命令也会出现类似的错误。)
- 写在最后,讲一讲我的排错思路。
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
本章内容就到这里,大家在安装过程中遇到任何问题,评论区留言,我第一时间为大家解答。