前言
本文将演示如何从零搭建一个K8s集群,所有镜像在国内均可以下载,所有步骤均经过实测,只要严格按照步骤执行,最后一定可以完成K8s集群搭建。
正文
一. 机器配置和版本选择
本篇教程搭建的K8s集群规格为一主两从,这里准备了三台虚拟机,每台虚拟机规格参数如下所示。
参数 | |
---|---|
操作系统 | CentOS7 |
CPU | 2核 |
内存 | 2G |
磁盘 | 40G |
K8s版本选择为v1.23.14,Docker版本为20.10.7,选择的网络插件为Calico,版本是3.20。
二. Docker安装
如果虚拟机尚未安装Docker,那么可以跟着本节内容简单的安装一下。
1. 安装前置依赖
这里的前置依赖指:yum-utils,device-mapper-persistent-data和lvm2,作用解释如下。
依赖 | 作用 |
---|---|
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-ce,docker-ce-cli,containerd.io和docker-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
然后打开m的hosts文件,指令如下。
vi /etc/hosts
在主节点的hosts文件中添加集群所有节点的IP和主机名,内容如下所示。
192.168.52.128 m
192.168.52.129 w1
192.168.52.130 w2
同理,分别设置从节点的主机名为w1和w2,指令如下。
sudo hostnamectl set-hostname w1
sudo hostnamectl set-hostname w2
然后分别打开w1和w2的hosts文件,指令如下。
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. 系统相关设置
在三台虚拟机上依次执行如下指令。
- 关闭selinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 关闭swap
swapoff -a
sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab
- 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
- iptables添加ACCEPT规则
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
- 内核参数配置
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的命令行工具,可以理解为客户端。
kubelet是K8s集群中用于启停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-Server,Scheduler等以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
如果均满足,说明集群搭建成功。