Skip to content

本地搭建 k8s

学习为主,先尝试在本地搭建

下载 iso 镜像

首先下载 iso 的镜像 ITELLYOU 我选的是 Ubuntu24.04 无界面版,迅雷下载即可 安装三个虚拟机,网络部分配置如下

image.pngimage.png

节点规划

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/hosts

docker-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

image.png

确定开机自启

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=0
shell
# 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.sock

k3s

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