[实战]从0到1搭建k8s无坑版-手里的小鸡不再吃灰

手里的吃灰小鸡实在是太多,一直想串起来搞个集群架构,虽然小鸡多,但是单台小鸡的算力略微小了点,所以搭建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无坑版-手里的小鸡不再吃灰 - 主机优选-主机优选
架构图

初始化系统

(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

这里注意了,如果准备搭建公网集群的话,需要写node的公网ip,如果内网集群,则写的是内网ip

如果像阿里云这种没有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无坑版-手里的小鸡不再吃灰 - 主机优选-主机优选

如果你的节点没有显示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无坑版-手里的小鸡不再吃灰 - 主机优选-主机优选

后续

后续带领大家安装最新版Dashboard,可视化管理

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容