欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 会展 > k8s进阶之路:本地集群环境搭建

k8s进阶之路:本地集群环境搭建

2025/4/5 10:51:47 来源:https://blog.csdn.net/yhflyl/article/details/146996125  浏览:    关键词:k8s进阶之路:本地集群环境搭建

概述

文章将带领大家搭建一个 master 节点,两个 node 节点的 k8s 集群,容器基于 docker,k8s 版本 v1.32。

一、系统安装

安装之前请大家使用虚拟机将 ubuntu24.04 系统安装完毕,我是基于 mac m1 的系统进行安装的,所以下载的时候 arm64 的系统镜像,另外还需要注意,机器的内存和磁盘需要有一定的限制,最低 2 核 CPU,内存最低 4G,配置不够 k8s 主节点初始化的时候会报错,无法初始化成功的。

上面准备好之后,我们先初始化系统,为安装 k8s 做准备。

配置好之后我们就启动虚拟机开始安装 Ubuntu24.04系统了!启动之后再这个页面直接回车就可以;启动之后再这个页面直接回车就可以。

直接就进去了选择语言的步骤,选择英语直接回车就可以了;接下来就是选择键盘的设置,直接 Done 上回车,进入下一步;接着我们选择最小安装模式,后选择 Done 上回车,进入下一步。

接下来是配置网络、配置代理服务、配置源和配置guied 布局,直接 Done 回车,下一步,这里我们不配置。接着是分区配置,这里我们也不动,直接 Done 下一步,接着会弹窗选择 continue就可以了。

接下来就是配置服务器名称和用户名密码了,这里需要注意下 servers name这个位置,这里的值是后面会用到,还是和上面一样 Done 下一步就可以。

接着会让选择 Ubuntu Pro,选择 Skip for now,选择 Continue 就可以了。

接着会提示安装 OpenSSH,选择安装,选择 Done 下一步。

接着会让和我们选择安装那些软件,这里也不选择,直接 Done下一步。

这里就会开始正式安装系统了,等待一会儿安装成功,成功之后会出现 Reboot Now 的选择,选择重新启动(第一次重启需要一点时间,耐心等待就可以)。

重启的时候会出现下面这个步骤,我们直接回车就可以了。

到此系统就安装成功了。

二、系统初始化

首先需要修改 ubuntu24.04 的源,先备份下系统默认源,然后更新下系统。

# 备份下
sudo mv /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
# 修改国内源
sudo tee /etc/apt/sources.list.d/ubuntu.sources <<EOF
Types: deb
URIs: http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpgTypes: deb
URIs: http://mirrors.ustc.edu.cn/ubuntu-ports/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpgTypes: deb
URIs: http://mirrors.aliyun.com/ubuntu-ports/
Suites: noble noble-updates noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF
# 更新系统
sudo apt update && sudo apt upgrade
# 接着安装一些必要的软件
sudo apt install vim telnet curl net-tools inetutils-ping

接着配置网络,设置静态 IP 地址

# 清空文件内容
sudo truncate -s 0 /etc/netplan/50-cloud-init.yaml
# 配置网络
sudo tee /etc/netplan/50-cloud-init.yaml <<EOF
network:renderer: networkdethernets:enp0s5:dhcp4: noaddresses:- 10.211.55.7/24routes:- to: defaultvia: 10.211.55.1nameservers:addresses: [114.114.114.114,8.8.8.8]        version: 2
EOF
# 配置生效
sudo netplan apply

禁用交换内存

# 临时关闭
sudo swapoff -a 
# 永久关闭
sudo systemctl mask swap.img.swap

加载内核模块,并设置 IP 转发的内核参数

# 加载内核模块
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
# 配置IP转发
sudo tee /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
# 配置生效
sudo sysctl -p /etc/sysctl.d/k8s.conf

安装网络优化工具

# 安装ipset和ipvsadm
sudo apt install ipset ipvsadm
# 配置 ipvsadm 模块加载,在 modules-load.d 中添加配置文件
sudo tee /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 创建加载模块脚本文件
sudo tee /root/ipvs.sh <<EOF
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
# 执行脚本,让其生效
sudo bash /root/ipvs.sh
# 查看是否生效
sudo lsmod | grep ip_vs

时间同步

# 安装 ntpdate 和 cron 两个软件
sudo apt install -y ntpdate cron
# 设置时区
sudo timedatectl set-timezone Asia/Shanghai
# 使用 ntpdate 进行时间同步
sudo ntpdate time1.aliyun.com
# 通过计划任务实现时间同步
echo "0 0 * * * ntpdate time1.aliyun.com" | sudo tee -a $(crontab -l | grep -q 'ntpdate time1.aliyun.com' || crontab -l) | sudo crontab -

最后添加主机 hosts 文件,提前配置下另外两台的 host

# 先去掉127.0.0.1 k8s-master这行
sudo sed -i '/^127\.0\.1\.1[[:space:]]\+k8s-master$/d' /etc/hosts
# 在/etc/hosts文件末尾追加
sudo tee -a /etc/hosts << EOF
10.211.55.7 k8s-master
10.211.55.8 k8s-node1
10.211.55.9 k8s-node2
EOF

三、安装 docker 和 cri-dockerd

docker 可以通过安装包直接解压安装:https://download.docker.com/linux/static/stable/aarch64/,安装步骤如下:

# 下载安装包
wget https://download.docker.com/linux/static/stable/aarch64/docker-28.0.4.tgz
# 解压安装
tar -zxvf docker-28.0.4.tgz
sudo chown root:root docker/*
sudo cp docker/* /usr/bin# 配置 service 文件
sudo tee /usr/lib/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s[Install]
WantedBy=multi-user.target
EOF# 添加配置文件
sudo mkdir /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{"registry-mirrors": ["https://registry.docker-cn.com"],"exec-opts": ["native.cgroupdriver=systemd"],"insecure-registries": ["10.211.55.10:8082"],"max-concurrent-downloads": 10,"live-restore": true,"log-driver": "json-file","log-level": "warn","log-opts": {"max-size": "100m","max-file": "3"},"storage-driver": "overlay2"
}
EOF# 重载配置,启动 docker
sudo systemctl daemon-reload
sudo systemctl enable docker
sudo systemctl start docker
# 创建用户组
sudo groupadd docker
sudo chgrp docker /var/run/docker.sock
sudo gpasswd -a long docker
sudo systemctl restart docker

上面执行完成之后,需要退出当前终端,重新进入,docker 命令才会生效;接着安装 cri-docker,地址:https://github.com/Mirantis/cri-dockerd/releases,下载之后解压安装,步骤如下:

# 下载安装包
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.17/cri-dockerd-0.3.17.arm64.tgz# 解压安装
tar -zxvf cri-dockerd-0.3.17.arm64.tgz
sudo chown root:root cri-dockerd/cri-dockerd
sudo cp cri-dockerd/cri-dockerd /usr/bin# 添加配置文件
sudo tee /lib/systemd/system/cri-docker.service <<EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd://  --pod-infra-container-image registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity
Delegate=yes
KillMode=process[Install]
WantedBy=multi-user.target
EOF# 添加socket文件
sudo tee /lib/systemd/system/cri-docker.socket <<EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker[Install]
WantedBy=sockets.target
EOF# 启动
sudo systemctl daemon-reload
sudo systemctl enable cri-docker.service
sudo systemctl enable --now cri-docker.socket
sudo systemctl start cri-docker

四、安装 k8s 软件

接下来我们需要安装k8s的三件套: kubeadmkubeletkubectl。首先安装一些基础软件:

# 安装基础软件
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# 下载用于 Kubernetes 软件包仓库的公共签名密钥。所有仓库都使用相同的签名密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# 接下来需要添加 kubernetes 的 apt 仓库
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 更新 apt 包索引,安装kubelet、kubeadm 和 kubectl,并锁定其版本
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 锁定版本

配置kubelet

sudo mkdir /etc/sysconfig
# 文件内容
sudo tee /etc/sysconfig/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --container-runtime=remote --container-runtime-endpoint=/var/run/cri-dockerd.sock"
EOF
# 开机自启
sudo systemctl enable kubelet

五、配置 k8s 集群

上面我们已经把需要准备的工作都做完了,将主机关闭,创建快照,克隆三台主机,然后进行简单的修改就可以初始化我们的 k8s 集群了。

这样克隆三台之后,启动克隆的主机,进入系统之后修改网络配置:

  • k8s-master:10.211.55.7
  • k8s-node1:10.211.55.8
  • k8s-node2:10.211.55.9

修改完之后执行:sudo netplan apply,让配置生效。接着修改克隆后主机的名称:

# 在10.211.55.8的主机上执行
sudo hostnamectl set-hostname k8s-node1# 在10.211.55.9的主机上执行
sudo hostnamectl set-hostname k8s-node2

这样我们就可以开始初始化,k8s-master 节点了。

# 查看需要的镜像列表
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
# 提前拉去镜像
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers
# 初始化主节点
sudo kubeadm init \--image-repository=registry.aliyuncs.com/google_containers \--kubernetes-version=v1.32.3 \--pod-network-cidr=10.20.0.0/16 \--service-cidr=10.50.0.0/12 \--cri-socket=/var/run/cri-dockerd.sock

等待执行成功,出现下面的输出,显示说明主节点已经初始化成功,按照提示执行下面的命令就可以了。

如果在这个过程遇到初始化失败,可以执行kubeadm reset 重置

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

此时执行 kubectl get nodes,可以看到已经初始化好的主节点。

接着我们按照提示初始化工作节点。

sudo kubeadm join 10.211.55.7:6443 --token 356ws4.sq5ic626obrlxczw \--discovery-token-ca-cert-hash sha256:3f872b98a5ef9bbbaaf779e2985637ae3a8a062ef1979c10a6d15cf03064685f

在两台 node 节点上,执行成功之后,我们的集群就初始化成功。

此时再次执行 kubectl get nodes,就可以看到我们加入 node 节点了。

六、安装网络插件

从上面看到我们的三个节点的状态是:NotReady 状态(未就绪),此时我们还需要安装网络插件:calico,让集群就绪。

文档地址:https://docs.tigera.io/calico/3.27/getting-started/kubernetes/quickstart

这里我们使用 v3.29.3 的版本。先按照官方步骤安装tigera-operator.yaml:

# 下载配置文件
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.3/manifests/tigera-operator.yaml
kubectl create -f tigera-operator.yaml

接着安装 calico 的自定义资源配置,但是这里需要按照我们 k8s 的安装情况修改下配置:

wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.3/manifests/custom-resources.yaml# 修改custom-resoures.yaml
vim custom-resoures.yamlapiVersion: operator.tigera.io/v1
kind: Installation
metadata:name: default
spec:# Configures Calico networking.calicoNetwork:ipPools:- name: default-ipv4-ippoolblockSize: 26# 这里需要和上面初始化 k8s的配置参数 --pod-network-cidr=10.20.0.0/16cidr: 10.20.0.0/16encapsulation: VXLANCrossSubnetnatOutgoing: EnablednodeSelector: all()---# This section configures the Calico API server.
# For more information, see: https://docs.tigera.io/calico/latest/reference/installation/api#operator.tigera.io/v1.APIServer
apiVersion: operator.tigera.io/v1
kind: APIServer
metadata:name: default
spec: {}

保存之后,执行:kubectl create -f custom-resoures.yaml

等待镜像下载完成。

watch kubectl get pods -n calico-system

出现如下就说明安装成功了。

此时在看集群状态就会变成就绪状态:

但是如果在执行 kubectl create -f custom-resoures.yaml大概率会出现镜像拉取失败的问题,此时就需要科学上网。

# 查看状态
kubectl get pods -n calico-system
# 查看某一个pod的执行日志
kubectl logs calico-node-8vdtl -n calico-system
# 查看pod的详情
kubectl describe pod calico-node-8vdtl -n calico-system

出现下面这种情况就是拉取镜像失败了,这是就需要下载指定版本的 calico 镜像了。

我们需要的是 v3.29.3 的版本


接下来就可以开始 k8s 的学习了!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词