前言

kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:

#创建一个 Master 节点
kubeadm init# 将一个 Node 节点加入到当前集群中
kubeadm join <Master节点的IP和端口 >

使用kubeadm方式搭建K8s集群主要分为以下几步

  • 准备三台虚拟机,同时安装操作系统CentOS 7.x
  • 对三个安装之后的操作系统进行初始化操作
  • 在三个节点安装 docker kubelet kubeadm kubectl
  • 在master节点执行kubeadm init命令初始化
  • 在node节点上执行 kubeadm join命令,把node节点添加到当前集群
  • 配置CNI网络插件,用于节点之间的连通【失败了可以多试几次】
  • 通过拉取一个nginx进行测试,能否进行外网测试

安装要求

在开始之前,部署Kubernetes集群机器需要满足以下几个条件:

  • 一台或多台机器,操作系统 CentOS7.x-86_x64
  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多【注意master需要两核】
  • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
  • 禁止swap分区

准备环境

角色 IP
k8smaster 192.168.2.130
k8snode1 192.168.2.140
k8snode2 192.168.2.141

开始在每台机器上执行以下命令

关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭selinux
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 临时关闭
setenforce 0
关闭swap
# 临时
swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
更改各节点主机名称
# 根据规划设置主机名【master节点上操作】
hostnamectl set-hostname k8smaster
# 根据规划设置主机名【node1节点操作】
hostnamectl set-hostname k8snode1
# 根据规划设置主机名【node2节点操作】
hostnamectl set-hostname k8snode2
在master添加hosts
cat >> /etc/hosts << EOF
192.168.177.130 k8smaster
192.168.177.131 k8snode1
192.168.177.132 k8snode2
EOF
将桥接的IPv4流量传递到iptables的
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
# 生效
sysctl --system
时间同步

可以在 http://www.ntp.org.cn/ 官方网站里查找我们所需要的时间池设置即可
我们这里设置的是阿里云提供的节点

yum install ntpdate -y
ntpdate 120.25.108.11

安装docker / kubeadm / kubelet

所有节点安装Docker/kubeadm/kubelet ,Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker

安装docker

在我们之前的博客中就有安装docker的步骤,参考即可 https://blog.csdn.net/m0_51277041/article/details/123069490
我们直接执行最后一步安装docker

__install_docker() {yum install -y yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repoyum makecache fastyum -y install docker-ceusermod -aG docker rootmkdir -p /etc/dockercat >/etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://bn4ll166.mirror.aliyuncs.com"],"data-root": "/data/docker-root","dns": ["223.5.5.5","119.29.29.29"],"bip": "172.31.255.254/16","storage-driver": "overlay2","storage-opts": ["overlay2.override_kernel_check=true"],"userland-proxy": false,"log-driver": "json-file","log-opts": {"max-size": "100m","max-file": "1"},"exec-opts": ["native.cgroupdriver=systemd"], "live-restore": true
}
EOFsystemctl daemon-reloadsystemctl enable dockersystemctl restart docker}__install_docker
添加kubernetes软件源

然后我们还需要配置一下yum的k8s软件源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
安装kubeadm,kubelet和kubectl

由于版本更新频繁,这里指定版本号部署:

# 安装kubelet、kubeadm、kubectl,同时指定版本
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet

部署Kubernetes Master【master节点】

在 192.168.2.130 执行,也就是master节点

kubeadm init --apiserver-advertise-address=192.168.2.130 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12  --pod-network-cidr=10.244.0.0/16

由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址,【执行上述命令会比较慢,因为后台其实已经在拉取镜像了】,我们 docker images 命令即可查看已经拉取的镜像

当我们出现下面的情况时,表示kubernetes的镜像已经安装成功

使用kubectl工具 【master节点操作】
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

执行完成后,我们使用下面命令,查看我们正在运行的节点

kubectl get nodes


能够看到,目前有一个master节点已经运行了,但是还处于未准备状态
下面我们还需要在Node节点执行其它的命令,将node1和node2加入到我们的master节点上

加入Kubernetes Node【Slave节点】

下面我们需要到 node1 和 node2服务器,执行下面的代码向集群添加新节点
执行在kubeadm init输出的kubeadm join命令:
注意,以下的命令是在master初始化完成后,每个人的都不一样!!!需要复制自己生成的

kubeadm join 192.168.2.130:6443 --token 8fq318.apphpxcg63zkm2lc \--discovery-token-ca-cert-hash sha256:579ab79ec2f342863216b90493c40686640c7e2ead74a1a4551a601c33480287

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要重新创建token,操作如下:

kubeadm token create --print-join-command

当我们把两个节点都加入进来后,我们就可以去Master节点 执行下面命令查看情况

kubectl get node

部署CNI网络插件

上面的状态还是NotReady,下面我们需要网络插件,来进行联网访问

# 下载网络插件配置
yum install wget -y
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

默认镜像地址无法访问,sed命令修改为docker hub镜像仓库

# 添加
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml##首先下载v0.13.1-rc2-amd64 镜像
##参考博客:https://www.cnblogs.com/pyxuexi/p/14288591.html
## 导入镜像,命令,,特别提示,3个机器都需要导入,3个机器都需要导入,3个机器都需要导入,3个机器都需要导入,重要的事情说3遍。不然抱错。如果没有操作,报错后,需要删除节点,重置,在导入镜像,重新加入才行。本地就是这样操作成功的!
docker load < flanneld-v0.13.1-rc2-amd64.docker
#####下载本地,替换将image: quay.io/coreos/flannel:v0.13.1-rc2 替换为 image: quay.io/coreos/flannel:v0.13.1-rc2-amd64# 查看状态 【kube-system是k8s中的最小单元】
kubectl get pods -n kube-system

运行后的结果

运行完成后,我们查看状态可以发现,已经变成了Ready状态了

如果上述操作完成后,还存在某个节点处于NotReady状态,可以在Master将该节点删除

# master节点将该节点删除
kubectl delete node k8snode1
# 然后到k8snode1节点进行重置kubeadm reset
# 重置完后在加入
kubeadm join 192.168.2.130:6443 --token 8fq318.apphpxcg63zkm2lc \
>     --discovery-token-ca-cert-hash sha256:579ab79ec2f342863216b90493c40686640c7e2ead74a1a4551a601c33480287

测试kubernetes集群

我们都知道K8S是容器化技术,它可以联网去下载镜像,用容器的方式进行启动
在Kubernetes集群中创建一个pod,验证是否正常运行:

# 下载nginx 【会联网拉取nginx镜像】
docker pull nginx
# 查看状态
kubectl get pod

如果我们出现Running状态的时候,表示已经成功运行了

下面我们就需要将端口暴露出去,让其它外界能够访问

# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看一下对外的端口
kubectl get pod,svc

能够看到,我们已经成功暴露了 80端口 到 30976上

我们到我们的宿主机浏览器上,访问如下地址

http://192.168.2.130:30976

发现我们的nginx已经成功启动了

到这里为止,我们就搭建了一个单master的k8s集群

错误汇总

错误一

在执行Kubernetes init方法的时候,出现这个问题

error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2

是因为VMware设置的核数为1,而K8S需要的最低核数应该是2,调整核数重启系统即可

错误二

我们在给node1节点使用 kubernetes join命令的时候,出现以下错误

error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR Swap]: running with swap on is not supported. Please disable swap

错误原因是我们需要关闭swap

 关闭swap
# 临时
swapoff -a
# 永久
sed -ri 's/.*swap.*/#&/' /etc/fstab

错误三

在给node1节点使用 kubernetes join命令的时候,出现以下错误

The HTTP call equal to 'curl -sSL http://localhost:10248/healthz' failed with error: Get http://localhost:10248/healthz: dial tcp [::1]:10248: connect: connection refused

解决方法,首先需要到 master 节点,创建一个文件

# 创建文件夹
mkdir /etc/systemd/system/kubelet.service.d
# 创建文件
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 添加如下内容
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true --fail-swap-on=false"
# 重置
kubeadm reset

然后删除刚刚创建的配置目录

rm -rf $HOME/.kube

然后 在master重新初始化

kubeadm init --apiserver-advertise-address=192.168.2.130 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.0 --service-cidr=10.96.0.0/12  --pod-network-cidr=10.244.0.0/16

初始完成后,我们再到 node1节点,执行 kubeadm join命令,加入到master

kubeadm join 192.168.2.130:6443 --token 8fq318.apphpxcg63zkm2lc \
>     --discovery-token-ca-cert-hash sha256:579ab79ec2f342863216b90493c40686640c7e2ead74a1a4551a601c33480287

添加完成后,我们使用下面命令,查看节点是否成功添加

kubectl get nodes

错误四

我们再执行查看节点的时候, kubectl get nodes 会出现问题

Unable to connect to the server: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")

这是因为我们之前创建的配置文件还存在,也就是这些配置

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

我们需要做的就是把配置文件删除,然后重新执行一下

rm -rf $HOME/.kube

然后再次创建一下即可

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

这个问题主要是因为我们在执行 kubeadm reset 的时候,没有把 $HOME/.kube 给移除掉,再次创建时就会出现问题了

错误五

安装的时候,出现以下错误

Another app is currently holding the yum lock; waiting for it to exit...

是因为yum上锁占用,解决方法

yum -y install docker-ce

错误六

在使用下面命令,添加node节点到集群上的时候

kubeadm join 192.168.2.130:6443 --token 8fq318.apphpxcg63zkm2lc \
>     --discovery-token-ca-cert-hash sha256:579ab79ec2f342863216b90493c40686640c7e2ead74a1a4551a601c33480287

然后出现了这个错误

[root@k8smaster ~]# kubeadm join 192.168.177.130:6443 --token jkcz0t.3c40t0bqqz5g8wsb     --discovery-token-ca-cert-hash sha256:bc494eeab6b7bac64c0861da16084504626e5a95ba7ede7b9c2dc7571ca4c9e5
W1117 06:55:11.220907   11230 join.go:346] [preflight] WARNING: JoinControlPane.controlPlane settings will be ignored when control-plane flag is not set.
[preflight] Running pre-flight checks[WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
error execution phase preflight: [preflight] Some fatal errors occurred:[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher

出于安全考虑,Linux系统默认是禁止数据包转发的。所谓转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。也就是说 /proc/sys/net/ipv4/ip_forward 文件的值不支持转发

  • 0:禁止
  • 1:转发
    所以我们需要将值修改成1即可
echo “1” > /proc/sys/net/ipv4/ip_forward

修改完成后,重新执行命令即可

使用kubeadm方式搭建K8S集群相关推荐

  1. centos7中kubeadm方式搭建k8s集群(crio+calico)(k8s v1.21.0)

    文章目录 centos7中kubeadm方式搭建k8s集群(crio+calico)(k8s v1.21.0) 环境说明 注意事项及说明 1.版本兼容问题 2.镜像问题 安装步骤 安装要求 准备环境 ...

  2. kubeadm 方式搭建k8s集群完整版汇总

    本文一共五篇文章,详细的讲解了k8s的相关概念,以及k8s集群的搭建: Kubernetes相关概念入门 k8s核心概念总结版 k8s的集群搭建前的相关操作–必看 kubeadm方式搭建k8s之doc ...

  3. 实战:kubeadm方式搭建k8s集群(k8s-v1.22.2,containerd-v1.5.5)-2023.2.22(测试成功)

    实验环境 1.硬件环境 3台虚机 2c2g,20g.(nat模式,可访问外网) 角色 主机名 ip master节点 master1 172.29.9.51 node节点 node1 172.29.9 ...

  4. kubeadm方式搭建k8s集群

    环境:CentOS7.6 k8s版本:1.8 如果不能重装系统,又装了k8s不行的看这个,新系统无视! 卸载K8S kubeadm reset -f modprobe -r ipip lsmod rm ...

  5. 3、使用二进制方式搭建K8S集群

    文章目录 一.安装要求 二.准备环境 三.系统初始化配置 四.部署 Etcd 集群 4.1 准备 cfssl 证书生成工具 4.2 生成 Etcd 证书 4.3 从 Github 下载二进制文件 4. ...

  6. Kubeadm 快速搭建 k8s 集群安装可视化管理界面

    文章目录 1. 实验准备 2. 安装 docker 3. 配置阿里云 K8S repo 源(三个节点) 4. 安装 kubeadm,kubelet,kubectl(三个节点) 5. 部署 kubern ...

  7. kubeadm方式部署k8s集群(1.18版本,亲测可用)

    文章目录 一.系统环境 1.设置系统主机名以及Host文件 2.关闭防火墙 3.关闭系统Swap 二.安装Docker 1.安装docker 2.所需镜像 三.安装kubelet.kubeadm 和 ...

  8. 搭建K8s集群(kubeadm方式)-操作系统初始化

    使用kubeadm方式搭建K8S集群 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Ma ...

  9. 搭建K8s集群(二进制方式)-搭建步骤介绍

    使用二进制方式搭建K8S集群 注意 [暂时没有使用二进制方式搭建K8S集群,因此本章节内容不完整... 欢迎小伙伴能补充~] 准备工作 在开始之前,部署Kubernetes集群机器需要满足以下几个条件 ...

最新文章

  1. 悬浮球 / 悬浮按钮 / 辅助按钮
  2. 初次使用PyCharm
  3. C标准库assert.h实现
  4. 8-13 刷题 复习 知识点集合
  5. pku1401 Factorial 计算n!末尾有几个0?
  6. 64位虚拟机下asm()语法_一步步学写Windows下的Shellcode
  7. php代码格式化工具 php-cs-fixer的使用
  8. C++存储区域基础概念详解
  9. 【LeetCode笔记】56. 合并区间(Java、排序)
  10. PHP判断浏览器类型和浏览器语言(附各国语言简写代码)
  11. ArrayList和LinkedList(转)
  12. 深入java虚拟机(二) 对象的创建
  13. (转)版本管理工具介绍——SVN篇(二)
  14. 腾讯音乐娱乐集团宣布管理层调整,着眼长远战略发展与行业生态布局
  15. ES6新特性_const声明常量以及特点---JavaScript_ECMAScript_ES6-ES11新特性工作笔记005
  16. 电商巨头Shopify 两名员工被指窃取客户交易详情
  17. 联想换机助手_Smart Switch.apk下载|S换机助手下载 v3.4.04 安卓版_最火软件站
  18. 如何搭建百度局域网离线地图服务器
  19. 四川民办高校计算机专业排名2015,2015中国民办大学最佳专业排行榜10强
  20. 九种常用输入法特殊符号功能大揭密

热门文章

  1. Springboot 系列(十七)迅速使用 Spring Boot Admin 监控你的 Spring Boot 程序
  2. 机器学习-K-近邻算法
  3. 使用Python处理KNN分类算法
  4. P型MOS管的防电源反接电路解析(为什么D极和S极要反过来接)
  5. 向日葵远程控制Ubuntu,鼠标无响应
  6. CloseableHttpClient read time out
  7. c语言二级指针实现队列,C语言二级指针底层实现
  8. 扇形计算公式是怎么得来的?
  9. 惠普暗影精灵5 super 873-068rcn怎样用u盘重装系统win10
  10. 北京大学曹健——Tensorflow笔记 07 卷积神经网络