环境准备
- 节点数量: 3 台 CentOS7 虚拟机
- 硬件配置: 最少 2G 内存,最少 2个 CPU,最少 30G 硬盘
- 网络要求: 多个节点之间网络互通,每个节点能访问外网
集群规划
我这里准备了三台虚拟机,如下:
- k8s-node1:192.168.95.20
- k8s-node2:192.168.95.21
- k8s-node3:192.168.95.22
配置节点主机名
# 第一个节点执行 $ hostnamectl set-hostname k8s-node1 # 第二个节点执行 $ hostnamectl set-hostname k8s-node2 # 第三个节点执行 $ hostnamectl set-hostname k8s-node3
配置 Hosts 文件
在三台机器上同步执行以下命令即可:
cat >> /etc/hosts <<EOF 192.168.95.20 k8s-node1 192.168.95.21 k8s-node2 192.168.95.22 k8s-node3 EOF
关闭防火墙
关闭三台机器的防火墙,并禁用开机自启动,在三台机器上同步执行以下命令即可:
systemctl stop firewalld && systemctl disable firewalld
关闭 swap 分区
在三台机器上同步执行以下命令即可:
swapoff -a && sed -ri 's/.*swap.*/#&/' /etc/fstab
更新系统时间
在三台机器上同步执行以下命令即可:
yum install ntpdate -y ntpdate time.windows.com
安装容器运行环境 containerd
在三台机器上按照以下步骤同步执行命令即可。
安装 yum-config-manager 相关依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
添加 containerd yum 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 containerd
yum install -y containerd.io cri-tools
配置 containerd
cat > /etc/containerd/config.toml <<EOF disabled_plugins = ["restart"] [plugins.linux] shim_debug = true [plugins.cri.registry.mirrors."docker.io"] endpoint = ["https://frz7i079.mirror.aliyuncs.com"] [plugins.cri] sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2" EOF
启动 containerd 服务并设置开机自启动
systemctl enable containerd && systemctl start containerd && systemctl status containerd
配置 containerd 模块
cat > /etc/modules-load.d/containerd.conf <<EOF overlay br_netfilter EOF
配置 k8s 网络配置
cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF
加载 overlay 和 br_netfilter 模块
modprobe overlay modprobe br_netfilter
查看当前网络配置是否生效
sysctl -p /etc/sysctl.d/k8s.conf
注意:做完以上配置之后需要重启三台机器!
配置 yum 下载源
查看源
yum repolist
添加源 x86(根据服务器架构自行选择)
cat <<EOF > kubernetes.repo [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 mv kubernetes.repo /etc/yum.repos.d/
添加源 ARM(根据服务器架构自行选择)
cat << EOF > kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64 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 mv kubernetes.repo /etc/yum.repos.d/
安装 Kubernetes
安装最新版本
yum install -y kubelet kubeadm kubectl
指定版本安装
yum install -y kubelet-1.26.0 kubectl-1.26.0 kubeadm-1.26.0
启动 kubelet
systemctl enable kubelet && systemctl start kubelet && systemctl status kubelet
初始化集群
初始化 Master 节点
注意: 初始化 K8s 集群仅仅需要再在 Master 节点进行集群初始化!
kubeadm init \ --apiserver-advertise-address=192.168.95.20 \ --pod-network-cidr=10.224.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers \ --cri-socket=unix:///var/run/containerd/containerd.sock
我这里已经将命令中的 IP 地址修改成了我的 Master 服务器。以上命令参数解释如下:
参数 | 意义 |
–apiserver-advertise-address | 用于指定 Kubernetes API Server(kube-apiserver)在集群中对外公布的 IP 地址。它指定了其他节点将用于与 API Server 通信的 IP 地址。 |
–pod-network-cidr | 用于指定 Pod 网络的网段(CIDR)。在 Kubernetes 集群中,每个 Pod 都分配一个独立的 IP 地址,该参数用于定义用于分配这些 IP 地址的网段范围。常用值为:10.244.0.0/16 |
–image-repository | 用于指定 Kubernetes 组件镜像的仓库地址。它定义了从哪个容器镜像仓库获取所需的组件镜像。 |
–cri-socket | 用于指定 Kubernetes 运行时(Container Runtime Interface,CRI)使用的 Unix 域套接字路径或网络套接字地址。 |
初始化完成后需要在 Master 节点依次执行图中 1
的三条命令:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
图中 2
的内容是需要接下来在 K8s 集群中其他非 Master 节点执行的命令,表示将自己加入集群。
在主节点中执行 kubectl get nodes
查询出当前集群中只有一个控制面板节点。
初始化 WorkNode 节点
分别在另外两台机器上执行以下命令,将自己加入 K8s 集群。
kubeadm join 192.168.95.20:6443 --token 39v30v.ekgba508fb08f664 \ --discovery-token-ca-cert-hash sha256:d16ef1480c1288402ffdfa7a500ee44fb9a936b57ec66be526a9186aea1582f0
执行完成后在 Master 节点执行 kubectl get nodes
命令即可查看当前集群中的所有节点。
节点已经加入进来了,但是集群中的这三个节点都是 NotReady 状态,查询所有的 Pod 可以看到 coredns 处于等待状态(Pending),这是由于当前集群缺少前面文章提到的 DNS 插件。
若后面想再次添加新节点,可以使用以下命令,将输出的内容在目标节点执行即可:
$ kubeadm token create --print-join-command --ttl=0
kubeadm join 10.15.0.21:6443 --token xjm7ts.gu3ojvta6se26q8i --discovery-token-ca-cert-hash sha256:14c8ac5c04ff9dda389e7c6c505728ac1293c6aed5978c3ea9c6953d4a79ed34
配置集群网络
配置文件:https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml
根据上面地址下载 Calico 配置文件,之后上传至 Master 节点服务器。之后编辑此配置文件,找到下面的这一行,修改为刚才初始化 Master 节点的 --pod-network-cidr
。
- name: CALICO_IPV4POOL_CIDR value: "10.224.0.0/16"
在 Master 节点执行以下命令即可。
kubectl apply -f calico.yaml
再次在 Master 查询当前节点状态和 Pod。
可以看到当前集群中多了三个 Pod,表示网络连接通道,并且处于初始化的状态,之后稍等几分钟,再次查看集群状态即可。
至此,K8s 集群即搭建完毕~