手里的吃灰小鸡实在是太多,一直想串起来搞个集群架构,虽然小鸡多,但是单台小鸡的算力略微小了点,所以搭建k8s合理利用是一个很好的契机,所有小鸡串起来,统一部署,集群管理,做一个‘‘打不死’’的网站
搭建前站长说
本文有点长哈,大家可能会有点害怕,博主这里给大家打包票,只要按照本文流程,只要自己敢于动手,敢于粘贴,复制命令,敢于找错,你肯定会成为高手!
软件版本
- docker:20.10.17
- kubelet:1.24.3
搭建工具
kubeadm 个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个 kubernetes 集群的部署
--创建一个 master 节点
# kubeadm init
--将 node 节点加入到当前集群中
kubeadm join <master-ip && master-port>
环境要求
- 目前笔者用的centos7.x,centos8和其他系统没有试过,大家可以自行尝试,注意,master节点必须要2核心cpu,所有操作系统关闭swap
- 集群中所有机器之间网络互通(注意,这里最好是内网互通,如果只有公网互通,则下面有特殊说明)
- 禁止swap分区
系统架构
![图片[1]-[实战]从0到1搭建k8s无坑版-手里的小鸡不再吃灰 - 主机优选-主机优选](https://img.hostprefer.com/upload/2022/08/14/631dce5427f82.png)
初始化系统
(1)关闭防火墙(三台机器都要做)
--关闭防火墙
# systemctl stop firewalld.service
--禁止防火墙开机自启
# systemctl disable firewalld.service
--查看防火墙是否已经关闭
# firewall-cmd --state
(2)关闭 selinux(三台机器都要做)
--关闭方式1:永久关闭
# sed -i 's/enforcing/disabled/' /etc/selinux/config
--关闭方式2:临时关闭
# setenforce 0
(3)关闭 swap(三台机器都要做)
如果free -m看到的swap都是0,这一步可以跳过,说明系统开机默认没有启用swap
--关闭方式1:永久关闭
# sed -ri 's/.*swap.*/#&/' /etc/fstab
--关闭方式2:临时关闭
# swapoff -a
(4)分别设置各个机器的主机名
--在k8s-master节点上设置
# hostnamectl set-hostname k8s-master
--在k8s-node-01节点上设置
# hostnamectl set-hostname k8s-node-01
--在k8s-node-02节点上设置
# hostnamectl set-hostname k8s-node-02
(5)在 k8s-master 节点添加 hosts
# cat >> /etc/hosts << EOF
192.168.1.40 k8s-master
192.168.1.41 k8s-node-01
192.168.1.42 k8s-node-02
EOF
如果像阿里云这种没有bind公网ip,且内网不通,不是对等互联这种,必须用公网来集群
(6)将桥接的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
(7)时间同步(三台机器都要做)
# yum install ntpdate -y
# ntpdate edu.ntp.org.cn
--重启机器
# reboot
环境安装
首先请,执行一遍update,更新下系统依赖,并且统一下master和node的环境以及内核
yum -y update
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
yum -y install docker-ce
--查看版本
# docker --version
--开机自启
# systemctl enable docker
--启动docker
# systemctl start docker
--查看运行状态
# systemctl status docker
所有节点安装kubeadm,kubelet和kubectl
# yum install -y kubelet kubeadm kubectl
#博主当前最新版本是1.24.3
--开机自启
# systemctl enable kubelet
初始化,部署k8s集群
(1)初始化kubeadm(只在master上进行)
注意!
公网集群的话,且主机没有bind公网地址,而是上游nat过来需要建立虚拟网卡才能正常部署
# 所有主机都要创建虚拟网卡,并绑定对应的公网 ip
# 临时生效,重启会失效
ifconfig eth0:1 <你的公网IP>
# 永久生效
cat > /etc/sysconfig/network-scripts/ifcfg-eth0:1 <<EOF
BOOTPROTO=static
DEVICE=eth0:1
IPADDR=<你的公网IP>
PREFIX=32
TYPE=Ethernet
USERCTL=no
ONBOOT=yes
EOF
执行初始化命令
# kubeadm init \
--apiserver-advertise-address=192.168.1.40 \
--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
其中apiserver-advertise-address就是你master节点的的公网ip地址,如果内网集群,则是内网地址
运行上面的命令后会生成node节点加入的命令,复制下来,下面将会用到
类似于这样
kubeadm join 192.168.1.40:6443 --token hfvz04.xuni7ajz7tu47x3t \
--discovery-token-ca-cert-hash sha256:5932a3b1cf44c00cefe168cc0b308b25dacb3899530f06de6a3d91b3889c7e23
(2)使用 kubectl 工具。
# mkdir -p $HOME/.kube
# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# chown $(id -u):$(id -g) $HOME/.kube/config
--查看正在运行的节点
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 103s v1.24.3
加入node
(1)分别在 k8s-node-01、k8s-node-02 执行下面命令,将自己加入到 k8s-master 节点中。
# kubeadm join 192.168.1.40:6443 --token hfvz04.xuni7ajz7tu47x3t \
--discovery-token-ca-cert-hash sha256:5932a3b1cf44c00cefe168cc0b308b25dacb3899530f06de6a3d91b3889c7e23
默认token有效期为24小时,如果过期之后,该token就不可用了。这时就需要在 k8s-master 节点重新创建token。
# kubeadm token create --print-join-command
(2)在 k8s-master 节点查看加入的节点。
]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 26m v1.24.3
k8s-node-01 NotReady <none> 100s v1.24.3
k8s-node-02 NotReady <none> 95s v1.24.3
类似于如图
![图片[2]-[实战]从0到1搭建k8s无坑版-手里的小鸡不再吃灰 - 主机优选-主机优选](https://img.hostprefer.com/upload/2022/08/14/72539bfb6cb3a.png)
如果你的节点没有显示ready,那么别担心,下面装好网络插件就ok
安装 Pod 网络插件(CNI)(只在 k8s-master 节点操作)
下载文件 kube-flannel.yml
并应用
# wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# kubectl apply -f kube-flannel.yml
--查看准备状态
# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7ff77c879f-jsgpq 0/1 Pending 0 11m
coredns-7ff77c879f-rktjc 0/1 Pending 0 11m
etcd-k8s-master 1/1 Running 0 11m
kube-apiserver-k8s-master 1/1 Running 0 11m
kube-controller-manager-k8s-master 1/1 Running 0 11m
kube-flannel-ds-p7jk8 0/1 Init:1/2 0 37s
kube-flannel-ds-tqc4d 0/1 Init:1/2 0 37s
kube-flannel-ds-zbhx4 0/1 Init:1/2 0 37s
kube-proxy-hzskp 1/1 Running 0 8m22s
kube-proxy-j9rkt 1/1 Running 0 8m18s
kube-proxy-pf4pl 1/1 Running 0 11m
kube-scheduler-k8s-master 1/1 Running 0 11m
然后等待部署,可以看到所有node都会ready
这里集群基本就搭建好啦!
容易出现的问题
1,如果出现类似如下报错
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: E0725 08:28:43.725092 27421 remote_runtime.go:925] "Status from runtime service failed" err="rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
time="2022-07-25T08:28:43+08:00" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 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
则需要修改下container配置
rm -rf /etc/containerd/config.toml
systemctl restart containerd,2
2,验证成功的标志
执行下面代码,回显namespace为kube-system和kube-flannel的pod都是running的时候说明集群很健康
并且node都是ready可用的情况
kubectl get pods -A
![图片[3]-[实战]从0到1搭建k8s无坑版-手里的小鸡不再吃灰 - 主机优选-主机优选](https://img.hostprefer.com/upload/2022/08/14/93e2390e06b03.png)
后续
后续带领大家安装最新版Dashboard,可视化管理
暂无评论内容