Appearance
本地搭建 k8s
学习为主,先尝试在本地搭建
下载 iso 镜像
首先下载 iso 的镜像 ITELLYOU 我选的是 Ubuntu24.04 无界面版,迅雷下载即可 安装三个虚拟机,网络部分配置如下


节点规划
192.168.56.110 k8smaster 192.168.56.101 k8snode1 192.168.56.102 k8snode2
基本配置
网络固定 IP
修改/etc/netplan/目录下的配置文件
如果原文件为空,则输入
shell
sudo netplan generate然后编辑 yml 文件(以下是我的 master 节点配置)
yml
network:
version: 2
renderer: networkd
ethernets:
enp0s3:
dhcp4: true
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
enp0s8:
dhcp4: false
addresses: [192.168.56.110/24]
nameservers:
addresses: [8.8.8.8, 114.114.114.114]设置完成后输入
shell
sudo netplan apply至此完成固定 ip 配置
SSH 相关
修改 /etc/ssh/sshd_config文件
shell
vim /etc/ssh/sshd_config把 PermitRootLogin 改成 yes
PermitRootLogin yes然后就可以用 root 用户登录了
配置 hosts 文件
shell
vim /etc/hostsdocker-compose 在 /etc/hosts 文件后边追加
shell
192.168.56.110 k8smaster
192.168.56.101 k8snode1
192.168.56.102 k8snode2时间同步
sudo apt install ntpdate(注意,24.04 不用安装,有 systemd-timesyncd,会冲突)
然后执行
sudo ntpdate ntp.aliyun.com下一步配置自动同步
使用crontab设置定时任务,每天晚上 0 点执行 终端输入
crontab -e
选择一个合适的编辑器,然后在配置末尾加上如下代码,表示每晚 0 点执行同步命令
shell
0 0 * * * ntpdate ntp.aliyun.com配置内核转发、网桥过滤
先写一个配置文件
cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF加在下边两个模块
sh
modprobe overlay
modprobe br_netfilter写到配置文件,实现永久生效
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF应用配置
sysctl --system安装 ipvs
ipvs 一个在内核态提供负载均衡的工具
apt install -y ipset ipvsadm配置 ipvsadm 的模块,这些都是算法模块,目的是为了让开机自动加载
cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_VS_wrr
ip_vs_sh
nf_conntrack
EOF编写脚本自动加载
cat << EOF | tee ipvs.sh
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF执行脚本
sh ipvs.sh验证脚本是否生效
lsmod | grep ip_vs关闭 swap
先临时关闭
sudo swapoff -a然后禁止自动挂载
sudo vim /etc/fstab注释掉这种有 swap 的行
# /swap.img none swap sw 0 0安装 Docker
shell
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin使用 docker --version 即可检查
配置 Docker
修改 /etc/docker/daemon.json
json
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://doublezonline.cloud",
"https://dislabaiot.xyz",
"https://docker.fxxk.dedyn.io",
"https://dockerpull.org",
"https://docker.unsee.tech",
"https://hub.rat.dev",
"https://docker.1panel.live",
"https://docker.nastool.de",
"https://docker.zhai.cm",
"https://docker.5z5f.com",
"https://a.ussh.net",
"https://docker.udayun.com",
"https://hub.geekery.cn"
],
"insecure-registries": ["kubernetes-register.sswang.com"],
"exec-opts": [
"native.cgroupdriver=systemd"
]
}应用配置,重启
shell
systemctl daemon-reload
systemctl restart docker设置开机自启
shell
systemctl enable docker安装 cri-docker
shell
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.2/cri-dockerd_0.4.2.3-0.ubuntu-jammy_amd64.deb
sudo dpkg -i cri-dockerd_0.4.2.3-0.ubuntu-jammy_amd64.deb
sudo apt-get install -f # 修复可能缺失的依赖
sudo systemctl enable --now cri-docker.socket
sudo systemctl enable --now cri-docker.service验证启动信息
shell
ls /var/run | grep docker输出如下:
cri-dockerd.sock
docker
docker.pid
docker.sock
基本工具
更新 apt 包索引并安装相关包:
三台机器都执行
shell
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg公共签名密钥
如果 /etc/apt/keyrings 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。 sudo mkdir -p -m 755 /etc/apt/keyrings
三台机器都执行
shell
sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg验证
shell
ls /etc/apt/keyrings/输出
kubernetes-apt-keyring.gpg
准备源仓库
三台机器都执行
shell
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验证
shell
ls /etc/apt/sources.list.d/输出
kubernetes.list ubuntu.sources.curtin.orig ubuntu.sources
安装
安装默认版本
三台机器都执行
shell
sudo apt-get install -y kubelet kubeadm kubectl禁用自动更新
三台机器都执行
shell
apt-mark hold kubelet kubeadm kubectl解除禁用 x
shell
apt-mark unhold kubelet kubeadm kubectl配置 kubelet
三台机器都执行
shell
vim /etc/default/kubelet添加为如下配置,配置 cgroup 管理
三台机器都执行
ini
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"设置开机自启动
三台机器都执行
shell
systemctl enable kubelet初始化集群
规划集群网段
规划 pod/service 网段与宿主机网段 三个网段不可重复,不可交叉
- 宿主机网段:192.168.56.0/24
- service 网段:10.96.0.0/12
- pod 网段:10.244.0.0/16
初始化集群
执行 kubeadm init 来初始化集群,不要照抄,自行修改参数。
shell
kubeadm init --kubernetes-version=1.32.2 --control-plane-endpoint=k8smaster --apiserver-advertise-address=192.168.56.110 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --upload-certs --v=9执行成功之后命令行会输出命令,按照要求执行即可,master 执行一个,其他 worker 节点也要执行加入集群的命令。注意加入命令也要添加最后一行指定运行时
shell
kubeadm join k8s-master:6443 --token w4tbmq.dllplpuvkoc0g49r \
--discovery-token-ca-cert-hash sha256:c7db1845e4de70f0bfc894f567a1c54d8319c53e88a5d8f201d2f795ade63134 \
--cri-socket=unix:///var/run/cri-dockerd.sock查看单元状态
shell
kubectl get pods -A查看节点状态
shell
kubectl get nodes节点目前还是NoteReady状态,下边需要配置 Pod 网络,才能变成Ready。
shell
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
sudo systemctl start kubelet安装网络插件
在所有节点上运行
下载 Flannel YAML
curl -O https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml编辑 kube-flannel.yml,在 args 里加上 --iface=enp0s8(所需网段 192 的网卡名)。
shell
kubectl apply -f kube-flannel.yml安装 kuboard
版本问题,这个版本没用master标签,所以手动加一下
shell
kubectl label node k8smaster node-role.kubernetes.io/master=安装 kuboard
shell
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
# 镜像
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3-swr.yaml安装 Helm
shell
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash使用外部 ceph 存储
在 pve 节点中新建一个名为 k8s-rbd 的存储池
shell
ceph osd pool create k8s-rbd 128
ceph osd pool application enable k8s-rbd rbd下载https://github.com/rook/rook/blob/release-1.19/deploy/examples/external/create-external-cluster-resources.py
然后运行
shell
python3 create-external-cluster-resources.py \
--ceph-conf /etc/ceph/ceph.conf \
--keyring /etc/ceph/ceph.client.admin.keyring \
--namespace rook-ceph \
--rbd-data-pool-name k8s-rbd \
--skip-monitoring-endpoint \
--format bash > rook-external-secret.sh下载rook-external-secret.sh,https://github.com/rook/rook/blob/release-1.19/deploy/examples/import-external-cluster.sh并上传至 k8s-master
在 k8s-master 上运行
shell
chmod +x rook-external-secret.sh
chmod +x import-external-cluster.sh
./rook-external-secret.sh
./import-external-cluster.sh验证:
shell
kubectl get storageclass
kubectl get secret -n rook-ceph | grep csi
kubectl get configmap -n rook-ceph
确定开机自启
shell
sudo systemctl enable docker
sudo systemctl enable cri-dockerd
sudo systemctl enable cri-dockerd.socket
sudo systemctl enable kubelet问题排查相关命令
查看问题
shell
kubectl describe node k8smaster | grep Conditions -A 15清理 Pod
shell
# 1. 强制清理所有 Evicted 状态的 Pod
kubectl get pods -A | grep Evicted | awk '{print "kubectl delete pod "$2" -n "$1}' | sh
# 2. 强制清理一直卡在 Terminating 的 Pod
kubectl get pods -A | grep Terminating | awk '{print "kubectl delete pod "$2" -n "$1" --force --grace-period=0"}' | sh
# 一键清理该命名空间下所有非 Running 的 Pod
kubectl get pods -n kuboard | grep -v Running | awk '{print $1}' | xargs -r kubectl delete pod -n kuboard --force --grace-period=0shell
# 1. 重启 CoreDNS (最重要的)
kubectl delete pod -n kube-system -l k8s-app=kube-dns
# 2. 重启 Flannel (修复跨节点网络)
kubectl delete pod -n kube-flannel --all
# 3. 重启 Nginx (修复业务)
kubectl delete pod -l app=nginx重置 kubeadm
shell
kubeadm reset -f --cri-socket=unix:///var/run/cri-dockerd.sockk3s
shell
# 创建标准 k8s 存放配置的目录
mkdir -p ~/.kube
# 把 K3s 的配置文件复制过去,重命名为 config
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
# 赋予你当前用户权限(这一步极其重要,否则 Helm 和 karmadactl 会报 Permission Denied)
sudo chown $(id -u):$(id -g) ~/.kube/config
# 创建标准 k8s 配置目录
sudo mkdir -p /etc/kubernetes
# 1. 链接 admin.conf
sudo ln -sf /etc/rancher/k3s/k3s.yaml /etc/kubernetes/admin.conf
# 2. 链接 pki 证书目录
sudo ln -sf /var/lib/rancher/k3s/server/tls /etc/kubernetes/pki
sudo mkdir -p /run/containerd
sudo ln -sf /run/k3s/containerd/containerd.sock /run/containerd/containerd.sock
# 如果存在空的 /var/lib/kubelet 目录先删掉
sudo rm -rf /var/lib/kubelet
# 建立软链接
sudo ln -sf /var/lib/rancher/k3s/agent/kubelet /var/lib/kubelet