Bootstrap

使用kubeadm在VMware虚拟机从0开始搭建k8s集群,踩完所有坑

介绍

官网介绍:概述 | Kubernetes

本次部署将从虚拟机创建到k8s搭建完成,需准备4个虚拟机,宿主机需准备至少12G的运行内存

环境准备

        k8s是一个master节点管理其他所有工作节点,为此准备了一个master虚拟机,三个工作node虚拟机

初始环境要求

  • 一台或多台机器,操作系统 CentOS7.x-86_x64【CentOs官网下载,CentOS国内镜像下载_centos镜像下载官网-CSDN博客

  • 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多

  • 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点

  • 禁止swap分区【会导致shell工具文件上下传功能失效】

  • 每个机器有自己的固定ip

虚拟机创建

准备4个虚拟机

需提前规划号ip,名称尽量主机名与虚拟机名称一致,名称中不要带下划线,带下划线则kubeadm不能正常初始化【踩坑】

虚拟机名称IP
k8smaster192.168.1.201
k8snode1192.168.1.202
k8snode2192.168.1.203
k8snode3192.168.1.204
 虚拟机搭建,基本都是下一步下一步的无脑操作
创建虚拟机

 

 

名称:见名知意即可

位置:自定义的虚拟机位置,我为D盘

 

 

网络尽量使用桥接方式【踩坑】

 

重复上述操作,再创建3个node节点虚拟机,其他步骤都是一模一样,只是虚拟机名称不一样

 

 初始化虚拟机

选择“测试并安装”,回车开始执行

 等待1分钟

把网络连接开启,现在开启就不用后面使用命令开启了【踩坑】

安装位置如果报红,只需要点击进去再点击左上角【完成】按钮即可

 

软件安装

开始安装

设置root用户的密码

密码设置完后点击“完成配置”按钮

重启,等待1分钟即可

使用root用户,与刚才设置的密码登录进去

验证网络是否正常,使用下面两个命令分别查看本机ip与是否能正常使用网络

# 查看本机ip
ip a
# 查看是否可以正常访问互联网
ping www.baidu.com

此时显示的网络配置为ens33,记住这个名称后面要使用

K8S服务搭建

准备软件环境

配置固定ip

为什么要配置固定IP:1.方便使用shell工具;2.后续k8s服务搭建需要使用到固定IP

按照最上面表格的ip与名称的对应关系配置k8smaster虚拟机的固定ip,同一个网段ip值大的一般都不会因为ip重复导致连不了网,比如192.168.1.201

# 配置固定ip,进入ifcfg-ens33,这个网络配置就是上面使用命令【ip a】看到的网卡
vi /etc/sysconfig/network-scripts/ifcfg-ens33
# 键入i进入编辑模式
# 1.把ip配置修改为静态【BOOTPROTO="static"】
BOOTPROTO="static"
# 2.在末尾添加这三个个配置
# ip为最开始准备的固定IP,
# 子码掩网:255.255.255.0表示只要192.168.1.X的就是同一个网段,可相互通信,
# 网关ip:网关IP可以在宿主机的cmd使用命令【ipconfig】可以看到
IPADDR="192.168.1.201"
NETMASK="255.255.255.0"
GATEWAY="192.168.1.1"
# 保存并退出【按esc后,键入冒号【:】再输入wq回车】

# 3.使用命令重启网络服务
service network restart

此处为配置一台虚拟机的示例,其他的node虚拟机也需要安装表格的ip分配,配置自己的固定ip

有了固定的ip,就可以使用shell工具连接虚拟机执行后面操作了,不使用shell工具也可以,但不太方便,我使用的工具是finalshell,官网下载地址【FinalShell SSH工具,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux,版本4.3.10,更新日期2023.12.31 - FinalShell官网 (hostbuf.com)】,使用FinalShell工具的命令窗口时,可使用【Ctrl+Shift+v】快速粘贴命令

yum命令国内镜像源配置【踩坑】

所有机器都要配置,不配置在执行安装时总是会报baseurl不对

# yum 命令安装 ,如果yum命令不能正常使用则需要重新配置源
# 把原配置重命名
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 现在新的配置
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 清除缓存
yum clean all
# 生成缓存
yum makecache
# 查看使用有可用的仓库,如果所有仓库都是禁用,则需要在网上查找可用的yum镜像源,并重新配置
yum repolist all

其他配置

以下命令只在master执行

# 在master添加hosts
# 下面六行是一个命令
cat >> /etc/hosts << EOF
192.168.1.201 k8smaster
192.168.1.202 k8snode1
192.168.1.203 k8snode2
192.168.1.204 k8snode3
EOF
# 使用ping命令测试是否配置成功,都可以ping通则配置成功
ping k8smaster
ping k8snode1
ping k8snode2
ping k8snode3

下面命令需在所有机器都要执行的命令,包括master

# 关闭防火墙
systemctl stop firewalld 		#临时关闭防火墙
systemctl disable firewalld 	#启动时禁用防火墙

# 关闭selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config  # 永久
setenforce 0  # 临时

# 关闭swap,注意swap关闭后将不能使用文件finalshell工具的文件上下传功能【踩坑】
swapoff -a  # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab    # 永久

# 根据规划设置主机名,尽量与虚拟机名称一致
# hostnamectl set-hostname k8smaster
# hostnamectl set-hostname k8snode1
# hostnamectl set-hostname k8snode2
# hostnamectl set-hostname k8snode3
hostnamectl set-hostname <hostname>

# 将桥接的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  # 生效


# wget 安装,wget是k8s用于递归下载文件的工具,如果wget不能使用则需要按钮,-y表示不需要再次输入y确认
yum install wget -y

# vim 文本编辑命令安装
yum install vim -y

# 时间同步
yum install ntpdate -y
ntpdate time.windows.com

安装docker

所有机器都要执行的命令,包括master

# 下载docker的yum命令镜像源
curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 执行安装目录
yum -y install docker-ce-18.06.1.ce-3.el7
# 设置开机启动,并立即启动docker
systemctl enable docker && systemctl start docker
# 检查是否安装成功
docker --version
# 看到下面版本号表示安装成功
# Docker version 18.06.1-ce, build e68fc7a

## 注意,在执行这个步骤之前,需要先测试这个docker源是否还能正常使用,
ping b9pmyelo.mirror.aliyuncs.com
## 若不能使用则需要找到能使用的
# 下面这四行是一个命令
cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
# 重启docker
systemctl restart docker
# 查看docker服务状态
service docker status

安装kubeadm,kubelet和kubectl

所有机器都要执行的命令,包括master

# 在安装之前需要先下载国内k8s的yum镜像源
# 下面十行是一个命令
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

# 执行安装命令,把三个工具一次性安装好
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
# 设置开机启动
systemctl enable kubelet

部署Kubernetes Master

以下命令只在master执行

## 注意apiserver-advertise-address要为master的本机ip,
# 等初始化待命令执行完成
kubeadm init --apiserver-advertise-address=192.168.1.201 --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

# 确保 $HOME/.kube 目录存在,如果不存在则创建
mkdir -p $HOME/.kube
# 将 Kubernetes 集群的管理员配置文件复制到 $HOME/.kube/config,以便 kubectl 命令可以使用它来连接到集群
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 将 $HOME/.kube/config 文件的所有者和所属组修改为当前用户和当前用户的主要组,这样当前用户就有权限读取和修改这个配置文件了
sudo chown $(id -u):$(id -g) $HOME/.kube/config

加入Kubernetes Node

执行创建token的命令,并把创建出来的token在所有node机器上面都执行,在master生成token,在node执行加入节点命令

# 在master执行创建创建token的命令,
# 该token的有效期为24小时,过了24小时重新加入节点则需要重新创建token
kubeadm token create --print-join-command

# 把生成的命令在其他node机器上面都执行一遍
################注意!注意!注意!下面的命令为上面的命令动态生成的################
kubeadm join 192.168.1.201:6443 --token ms93fv.wl4kgvcblos3vcvo     --discovery-token-ca-cert-hash sha256:bff26f8f08e0f0abfc4e0aceb4b021e3132998afbe4b23841f012dcd1ca3fb15

# 在master查看节点是否加入成功,
# 看到有三个node则表示加入成功,但还是未准备状态,还需要继续配置
kubectl get nodes

部署CNI网络插件

CNI为节点与master通信的插件,在master执行以下命令

# 上述网址为国外源,使用下面网址访问
kubectl apply -f https://raw.gitmirror.com/coreos/flannel/master/Documentation/kube-flannel.yml

# 查看docker镜像服务情况
kubectl get pod -A

使用看到命令【kubectl get pod -A】后如果看到Init:ImagePullBackOff,或者其他镜像问题,大概率是kubectl工具根据kube-flannel.yml配置自动拉取镜像拉取失败了,需按下面排查步骤排查【开始踩大坑】

以下排查步骤为【踩坑、踩坑、踩坑】,踩出来的;没有提到所有机器都有执行,则只在master执行

#############问题排查start############### 
# 1.先使用命令【kubectl get pod -A】查看服务的情况,根据镜像的情况,比如检查失败,或者拉取失败等# 执行应对措施
kubectl get pod -A
# 2.1.检查失败,重新拉取
# 2.2.拉取失败,检查docker的镜像源是否可用,不可以则替换为可用的镜像源,参考【https://gitee.com/xxxgod/Java-DevSpace/tree/master/doc】
# 2.3.注意,以下镜像源只是作为参考,需ping通了才算可使用状态,并且是所有机器都要执行的操作
vim /etc/docker/daemon.json # 打开docker镜像源配置文件
# 把下载这些可用ping通的镜像源放置进去,或者自己去网上找可以ping通的docker镜像源
{
    "registry-mirrors": [
        "https://b9pmyelo.mirror.aliyuncs.com",
        "https://ustc-edu-cn.mirror.aliyuncs.com/",
        "https://ccr.ccs.tencentyun.com/",
        "https://docker.m.daocloud.io/"
    ]
}
# 2.4.注意:配置好了需要重启docker,不然配置不生效
systemctl restart docker
# 3.检查【kube-flannel.yml】文件中的【image:】后面的镜像配置与上面看到的是否都拉取到了
# 3.1.在浏览器打开上述【kubectl apply -f https://raw.gitmirror.com/coreos/flannel/master/Documentation/kube-flannel.yml】命令对应的配置文件地址,即可查看到kube-flannel.yml文件的内容
# 4.每台机器都手动执行命令拉取镜像【docker pull docker.io/flannel/flannel:v0.25.4】
docker pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel1
docker pull docker.io/flannel/flannel:v0.25.4
# 5.等待5分钟,等待服务自动恢复,若服务自动恢复则不需要执行下面的步骤,以下命令在master执行
kubectl get pod -A    #查看各个pod的运行状态
kubectl get nodes     #查看节点的运行就绪状态
# 5.1.删除应用,
kubectl delete -f https://raw.gitmirror.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 5.2.重新创建应用
kubectl apply -f https://raw.gitmirror.com/coreos/flannel/master/Documentation/kube-flannel.yml
##############问题排查end################ 

如图所示即表示k8s集群搭建成功

测试kubernetes集群

在master执行以下命令

# 在 Kubernetes 集群中创建一个名为 nginx 的 Deployment,使用的容器镜像是官方的 Nginx 镜像
kubectl create deployment nginx --image=nginx
# 在 Kubernetes 中创建一个名为 nginx 的服务,并将该服务与 nginx Deployment 关联起来
kubectl expose deployment nginx --port=80 --type=NodePort
# 列出当前 Kubernetes 集群中所有的 Pod 和 Service 的信息
kubectl get pod,svc

# 查看拉取到的pod
kubectl get pod

看到以下日志则表示nginx在master与所有node都部署成功了,

通过master或者node的ip:30924即可访问到nginx,分别访问

192.168.1.201:30924 master

192.168.1.202:30924 node1

192.168.1.203:30924 node2

192.168.1.204:30924 node3

可以看到一个master与三个node都可以正常访问

至此K8S使用最简单的部署方式部署就算完成了

;