从零搭建K8s集群

前言

本文将演示如何从零搭建一个K8s集群,所有镜像在国内均可以下载,所有步骤均经过实测,只要严格按照步骤执行,最后一定可以完成K8s集群搭建。

正文

一. 机器配置和版本选择

本篇教程搭建的K8s集群规格为一主两从,这里准备了三台虚拟机,每台虚拟机规格参数如下所示。

参数
操作系统 CentOS7
CPU 2
内存 2G
磁盘 40G

K8s版本选择为v1.23.14Docker版本为20.10.7,选择的网络插件为Calico,版本是3.20

二. Docker安装

如果虚拟机尚未安装Docker,那么可以跟着本节内容简单的安装一下。

1. 安装前置依赖

这里的前置依赖指:yum-utilsdevice-mapper-persistent-datalvm2,作用解释如下。

依赖 作用
yum-utils CentOS官方开发的Linux包管理工具,是yum包管理器的扩展,提供了一系列额外的命令和脚本
device-mapper-persistent-data 是储存设备映射必须的软件包
lvm2 是储存设备映射必须的软件包

安装指令如下。

sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

2. 设置Docker源

要通过yum方式来安装Docker,就需要设置Docker仓库对应的repo文件,指令如下。

sudo yum-config-manager --add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

上述是Docker官方的源,如果慢的话,可以考虑替换为阿里云的源,指令如下。

sudo yum-config-manager --add-repo \

http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 安装Docker的组件

安装docker-cedocker-ce-clicontainerd.iodocker-compose-plugin,指令如下。

sudo yum install -y docker-ce-20.10.7 docker-ce-cli-20.10.7 containerd.io docker-compose-plugin

4. 启动Docker

指令如下。

sudo systemctl start docker

5. 设置Docker开机启动

指令如下。

sudo systemctl enable docker

6. 查看是否安装成功

通过docker -v指令查看Docker版本,如果能打印如下信息,则安装成功。

Docker version 20.10.7, build f0df350

三. K8s集群搭建

1. 安装前置依赖

需要在三台虚拟机上安装如下依赖。

依赖 说明
curl 利用URL语法在命令行下工作的文件传输工具
ipvsadm LVS管理工具
conntrack 连接跟踪
iptables 基于数据包过滤的防火墙工具
ipset iptables的扩展
jq Linux下的Json格式化工具
sysstat Linux下的性能监控工具软件包
libseccomp \

安装指令如下。

yum install -y curl ipvsadm conntrack iptables ipset jq sysstat libseccomp

2. Hosts文件修改

首先设置主节点的主机名为m,指令如下。

sudo hostnamectl set-hostname m

然后打开mhosts文件,指令如下。

vi /etc/hosts

在主节点的hosts文件中添加集群所有节点的IP和主机名,内容如下所示。

192.168.52.128 m

192.168.52.129 w1

192.168.52.130 w2

同理,分别设置从节点的主机名为w1w2,指令如下。

sudo hostnamectl set-hostname w1
sudo hostnamectl set-hostname w2

然后分别打开w1w2hosts文件,指令如下。

vi /etc/hosts

在从节点的hosts文件中添加集群所有节点的IP和主机名,内容如下所示。

192.168.52.128 m

192.168.52.129 w1

192.168.52.130 w2

最后,在三个节点上分别执行如下ping指令,确保三个节点之间通过主机名能ping通。

ping m
ping w1
ping w2

3. 系统相关设置

在三台虚拟机上依次执行如下指令。

  1. 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  1. 关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
  1. 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
  1. iptables添加ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
  1. 内核参数配置
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

4. 设置K8s的yum源

使用阿里云的yum源,在三台虚拟机上依次执行如下指令。

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

5. 安装kubeadm,kubectl和kubelet

kubeadm用于引导安装K8s集群,是谷歌推出的自动化安装工具。

kubectl是操作K8s的命令行工具,可以理解为客户端。

kubeletK8s集群中用于启停pod和容器的组件。

在三台虚拟机上依次执行如下指令。

yum install -y kubeadm-1.23.14 kubectl-1.23.14 kubelet-1.23.14

6. 设置Docker和K8s为同一个cgroup

在三台虚拟机上,依次执行如下指令。

# 打开Docker配置文件
vi /etc/docker/daemon.json
# 在配置文件中添加如下内容
{
    "exec-opts": ["native.cgroupdriver=systemd"]
}
# 重启Docker并设置开机启动
systemctl restart docker && systemctl enable docker
# 配置kubelet
sed -i "s/cgroup-driver=systemd/cgroup-driver=cgroupfs/g" /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 重启kubelet并设置开机启动
systemctl restart kubelet && systemctl enable kubelet

特别注意,如果在配置kubelet时提示如下。

sed:无法读取 /etc/systemd/system/kubelet.service.d/10-kubeadm.conf:没有那个文件或目录

这是正常的,不用担心。

7. 拉取K8s组件镜像

我们最终的目的是把K8s的核心组件比如Api-ServerScheduler等以pod形式跑起来,那么现在就需要将这些组件的镜像下载下来。需要的镜像如下所示。

k8s.gcr.io/kube-apiserver:v1.23.14
k8s.gcr.io/kube-controller-manager:v1.23.14
k8s.gcr.io/kube-scheduler:v1.23.14
k8s.gcr.io/kube-proxy:v1.23.14
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.5-0
k8s.gcr.io/coredns/coredns:v1.8.6

这里推荐使用国内的镜像仓库下载镜像,然后重新为镜像打TAG的方式。首先在三台虚拟机上把镜像全部下载下来,指令如下。

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.14
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.14
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.14
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.14
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.5-0
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6

然后通过如下指令给镜像打TAG

docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.23.14 k8s.gcr.io/kube-apiserver:v1.23.14
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.23.14 k8s.gcr.io/kube-controller-manager:v1.23.14
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.23.14 k8s.gcr.io/kube-scheduler:v1.23.14
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.23.14 k8s.gcr.io/kube-proxy:v1.23.14
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.6 k8s.gcr.io/pause:3.6
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.5-0 k8s.gcr.io/etcd:3.5.5-0
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:v1.8.6 k8s.gcr.io/coredns/coredns:v1.8.6

8. 搭建主节点

在主节点上执行如下指令进行初始化。

kubeadm init --kubernetes-version=1.23.14 --apiserver-advertise-address=192.168.52.128 --pod-network-cidr=10.244.0.0/16

等待初始化完毕,在输出的日志中找到如下内容并执行。

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

在输出的日志中找到如下内容,作为从节点加入集群的Token,保存下来,用于后续从节点加入集群。

kubeadm join 192.168.52.128:6443 --token syk1mr.jqjdqlj72okian6u \

        --discovery-token-ca-cert-hash sha256:aaa94f4d01e2464657d2248c6e44011b54f43af85911198926987dc62bfee197

现在安装calico网络插件,首先拉取相关镜像,指令如下。

docker pull docker.io/calico/kube-controllers:v3.20.3
docker pull docker.io/calico/pod2daemon-flexvol:v3.20.3
docker pull docker.io/calico/node:v3.20.3
docker pull docker.io/calico/cni:v3.20.3

然后执行如下指令完成calico安装。

kubectl apply -f https://docs.projectcalico.org/v3.20/manifests/calico.yaml

最后通过如下指令查看K8s核心组件的pod的状态。

watch kubectl get pods --all-namespaces

所有pod的状态都是Running,表示主节点搭建成功。

9. 从节点加入集群

从节点使用第8小节保存的Token加入集群,如下所示。

kubeadm join 192.168.52.128:6443 --token syk1mr.jqjdqlj72okian6u \

        --discovery-token-ca-cert-hash sha256:aaa94f4d01e2464657d2248c6e44011b54f43af85911198926987dc62bfee197

至此,K8s集群搭建完毕。

总结

搭建完毕后,可以通过如下指令查看所有K8s组件的STATUS是否为Running

kubectl get pods --all-namespaces

以及还可以通过如下指令查看主从节点的STATUS是否为Ready

kubectl get nodes

如果均满足,说明集群搭建成功。

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYqWG2tE' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片