文章目录
1. 集群规划
本文基于 vmware 安装的三台 ubuntu 22.04 虚拟机,准备安装以下内容:
kubernetes 1.28.15
containerd 1.7.27
calico 3.27.3
小版本不一致没什么影响,只要确保使用到的命令中版本号一致即可
三台虚拟机网络为NAT模式,分别设置固定IP及对应主机名:
192.168.168.150/24 k8s-master
192.168.168.151/24 node-01
192.168.168.152/24 node-02
2. 环境准备(三节点都需要执行)
- 为了方便,本文默认三个节点都使用root账户进行操作。
- curl等一些常用软件安装过程忽略,请提前准备好。
2.1. 设置主机名和静态IP
在第一台虚拟机执行以下命令,修改主机名
hostnamectl set-hostname k8s-master
配置固定ip,首先使用命令ip a或者ipconfig先查看网络情况,记下网段和网关配置
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:1e:e9:2c brd ff:ff:ff:ff:ff:ff
altname enp2s1
inet 192.168.168.150/24 brd 192.168.168.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
如果不带GUI桌面,编辑/etc/netplan/01-network-manager-all.yaml添加以下内容
network:
version: 2
ethernets:
ens33: # 替换为你的网卡名
dhcp4: no
addresses: [192.168.168.150/24] # 静态IP/子网掩码
routes:
- to: default
via: 192.168.168.2 # 网关
如果是带GUI桌面的ubuntu22,该文件只配置renderer: NetworkManager表示使用网络管理器进行管理,而不是手动设置。因此直接在设置中找到网络,通过UI界面进行设置,截图示例如下

按照以上步骤,在第二台和第三台依次配置以下固定ip和主机名
192.168.168.151/24 node-01
192.168.168.152/24 node-02
配置完成以后,检查一下网络连接情况,看是否可以正常联网
2.2. 关闭防火墙
查看防火墙状态
ufw status
如果是开启状态,关闭防火墙
ufw disable
2.3. 关闭交换分区
临时关闭
swapoff -a
永久关闭
sed -i '/swap/d' /etc/fstab
也可以直接编辑 /etc/fstab 文件,注释到有 swap 那一行
2.4. 设置时区
timedatectl set-timezone Asia/Shanghai
2.5. 设置/etc/hosts
增加以下三行
192.168.168.150 k8s-master
192.168.168.151 node-01
192.168.168.152 node-02
3. 环境准备脚本
为了简化环境准备操作,编写了一个shell脚本(不含修改静态ip部分)
#!/bin/bash
# Ubuntu 20.04 环境初始化脚本
echo "=============================="
echo " Ubuntu 20.04 环境初始化脚本 "
echo "=============================="
# 0. 基本功能检查
echo "步骤 0: 基本功能检查"
# 检查是否支持 overlay
if lsmod | grep -q overlay; then
echo " ✓ overlay 模块已加载"
else
echo " ⚠ 警告: overlay 模块未加载,Docker等可能无法正常工作"
fi
# 检查是否支持 iptables(强制要求)
if command -v iptables &> /dev/null; then
echo " ✓ iptables 已安装"
else
echo " ✗ 错误: 系统未安装 iptables,这是强制要求"
exit 1
fi
# 检查 cgroup 版本是否为 v1(强制要求)
if [ -d "/sys/fs/cgroup/systemd" ]; then
echo " ✓ cgroup v1 已启用"
else
echo " ✗ 错误: 系统未使用 cgroup v1,这是强制要求"
exit 1
fi
# 1. 修改 hostname
echo ""
echo "步骤 1: 修改 hostname"
read -p "请输入新的主机名 (必填): " new_hostname
if [ -z "$new_hostname" ]; then
echo " ✗ 错误: 主机名不能为空"
exit 1
fi
current_hostname=$(hostname)
if [ "$current_hostname" != "$new_hostname" ]; then
hostnamectl set-hostname "$new_hostname"
echo " ✓ 主机名已从 '$current_hostname' 修改为 '$new_hostname'"
else
echo " ✓ 主机名已经是 '$new_hostname'"
fi
# 2. 检查并修改时区
echo ""
echo "步骤 2: 检查并修改时区"
read -p "请输入时区 (默认: Asia/Shanghai): " timezone
timezone=${timezone:-"Asia/Shanghai"}
current_timezone=$(timedatectl show -p Timezone --value)
if [ "$current_timezone" != "$timezone" ]; then
timedatectl set-timezone "$timezone"
echo " ✓ 时区已从 '$current_timezone' 修改为 '$timezone'"
else
echo " ✓ 时区已经是 '$timezone'"
fi
# 3. 检查并关闭 swap 交换空间
echo ""
echo "步骤 3: 检查并关闭 swap 交换空间"
if swapon --show | grep -q .; then
echo " 发现启用的 swap 分区,正在关闭..."
swapoff -a
echo " ✓ swap 已临时关闭"
# 永久关闭 swap
if [ -f /etc/fstab ]; then
cp /etc/fstab /etc/fstab.bak
grep -v "swap" /etc/fstab > /tmp/fstab_new && mv /tmp/fstab_new /etc/fstab
echo " ✓ swap 已在 /etc/fstab 中注释,永久关闭"
fi
else
echo " ✓ swap 已经关闭"
fi
# 4. 检查并关闭防火墙
echo ""
echo "步骤 4: 检查并关闭防火墙"
if command -v ufw &> /dev/null; then
if ufw status | grep -q "Status: active"; then
ufw disable
echo " ✓ ufw 防火墙已关闭"
else
echo " ✓ ufw 防火墙未启用"
fi
elif command -v iptables &> /dev/null; then
if iptables -L | grep -q "Chain INPUT"; then
echo " 发现 iptables 规则,正在清除..."
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
echo " ✓ iptables 规则已清除"
else
echo " ✓ iptables 无活动规则"
fi
else
echo " ✓ 未检测到活动的防火墙服务"
fi
echo ""
echo "=============================="
echo " 环境初始化完成! "
echo "=============================="
4. 安装k8s集群
4.1. 安装容器运行时环境(三节点都需要执行)
下载安装包(可能需要一点魔法):
curl -L -O https://github.com/containerd/containerd/releases/download/v1.7.27/cri-containerd-cni-1.7.27-linux-amd64.tar.gz
解压安装并设置容器运行时开机自启动
tar -xzf cri-containerd-cni-1.7.27-linux-amd64.tar.gz -C /
systemctl enable --now containerd
以上步骤可能存在网络或者其他问题,可自行搜索containerd的安装教程进行尝试,后续配置是一致的
接下来配置containerd容器运行时,首先生成默认配置
containerd config default > /etc/containerd/config.toml
编辑/etc/containerd/config.toml文件,改的以下内容:
...
#大约67行,配置沙箱pause镜像为阿里云
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
#大约139行,配置systemd作为Cgroup管理器(与k8s保持一致)
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
#大约170行,添加国内镜像仓库
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = [
"https://proxy.1panel.live",
"https://docker.1panel.top",
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.ketches.cn"
]
此时使用crictl工具查看镜像等操作会报运行时配置错误(k8s1.24开始不支持docker),执行以下命令指定运行时endpoint为containerd即可
tee /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
重启containerd服务
systemctl restart containerd.service
4.2. 安装kubectl、kubeadm、kubelet(三节点都需要执行)
设置apt源
apt-get update && apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
通过apt-cache madison kubelet命令,查看支持的k8s版本,我这里选择最新的1.28.15版本
kubelet | 1.28.15-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.14-2.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.13-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.12-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.11-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.10-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.9-2.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.8-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.7-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.6-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.5-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.4-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.3-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.2-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.1-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
kubelet | 1.28.0-1.1 | https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/deb Packages
安装相应工具,并锁定版本防止意外升级
apt install -y kubelet kubeadm kubectl
systemctl enable kubelet
apt-mark hold kubeadm kubelet kubectl
以上命令默认安装当前apt源的最新版本,也可以使用以下命令安装指定版本
apt install kubelet=1.28.2-1.1 kubeadm=1.28.2-1.1 kubectl=1.28.2-1.1
4.3. 安装master节点(仅master节点执行)
查看并确认kubeadm默认配置的k8s镜像清单
kubeadm config images list
输出
registry.k8s.io/kube-apiserver:v1.28.15
registry.k8s.io/kube-controller-manager:v1.28.15
registry.k8s.io/kube-scheduler:v1.28.15
registry.k8s.io/kube-proxy:v1.28.15
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.15-0
registry.k8s.io/coredns/coredns:v1.10.1
确认无误,通过阿里云拉取相关镜像,注意版本号与你选择的一致。
kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.15 --cri-socket /run/containerd/containerd.sock
使用kubeadm工具初始化master节点,注意替换你自己的--apiserver-advertise-address
kubeadm init \
--apiserver-advertise-address=192.168.168.150 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.15 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--ignore-preflight-errors=all \
--cri-socket /run/containerd/containerd.sock
成功安装会输出以下提示,照着操作才能正常使用kubectl工具
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
注意!!!
- 可以把root用户的export命令写入 /root/.bashrc 文件中,否则每次登录都需要执行才能使用kubectl工具
- 如果出现错误,可以使用 journalctl -xeu kubelet 命令查看问题
以上步骤完成后,即可使用kubectl工具查看集群信息
kubectl get node
此时会发现k8s-master节点状态为 NotReady,等Calico网络插件安装完成,节点注册上来,状态就会正常
4.4. 安装calico网络插件(仅master节点执行)
下载calico插件部署配置(可能需要魔法)
curl -L -O https://raw.githubusercontent.com/projectcalico/calico/v3.27.3/manifests/calico.yaml
执行安装
kubectl apply -f calico.yaml
执行以上步骤后,由于没有节点可以调度,
calico相关pod状态处于Pending状态。等节点注册上来就好了。
4.5. 注册节点
在master节点,执行以下命令获取注册节点的命令
kubeadm token create --print-join-command
示例:(不要直接使用以下命令,请执行上述命令生成)
kubeadm join 192.168.168.150:6443 \
--token 693a14.qscb38iemcyw3gkb \
--discovery-token-ca-cert-hash sha256:0f6d7c738f931127ef83ce1594e8366a540fc439fea9720faba0ca37c1aeb5fa
在两个node节点,执行上面生成的命令,将节点注册到master节点
至此,不出意外的话整个集群已经安装好了。可以在master节点使用kubectl get nodes查看节点状态。
小tips
通常手动输入kubectl xxx等命令比较麻烦,因此可以将以下内容贴到~/.bashrc或者其包含的文件中
alias kg='kubectl get'
alias kgp='kubectl get pods'
alias kgs='kubectl get svc'
alias kgd='kubectl get deploy'
alias kgn='kubectl get nodes'
alias k='kubectl'
alias kd='kubectl describe'
alias kl='kubectl logs'
alias kdel='kubectl delete'

4179

被折叠的 条评论
为什么被折叠?



