K8s与CICD 部署 - 2. 安装k8s

3 阅读2分钟

我是搞了一台物理机56C+128G+1T 的E52680v4 + X99 洋垃圾,没条件就不搞集群了。开虚拟机搞集群太折腾(已踩坑) 直接搞个单节点省事,更省事的可以搞k3s。

注意不能有swap分区(已踩坑),注意默认安装位置都是/ 目录下,我们在安装的时候就应该提前移动/home/${user}/k8s 下 一般来说/home比/ 空间大,到后面微服务和上传的镜像和各种数据100G不够用(已踩坑)。最好服务器提前科学上网因为我们很多镜像默认是国外的,搞源太费劲

我是

nvme0n1 259:0 0 931.5G 0 disk

├─nvme0n1p1 259:1 0 489M 0 part /boot/efi

├─nvme0n1p2 259:2 0 93.1G 0 part /

└─nvme0n1p3 259:3 0 837.9G 0 part /home

root@cy-X99:/home/cy/k8s#

第一步:系统初始化与依赖安装

# 1. 切换到 root 用户 (或者直接在这些命令前加 sudo)
sudo -i

# 2. 关闭 Swap (K8s 强制要求)
swapoff -a
# 永久关闭:编辑 /etc/fstab,注释掉 swap 相关行
sed -i '/swap/d' /etc/fstab

# 3. 加载内核模块
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

modprobe overlay
modprobe br_netfilter

# 4. 设置内核参数(网络桥接)
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

sysctl --system

# 5. 安装基础工具
apt-get update
apt-get install -y curl apt-transport-https ca-certificates software-properties-common

第二步:安装并配置 Containerd (数据迁移关键点 1)

# 1. 安装 containerd
apt-get install -y containerd

# 2. 创建配置目录
mkdir -p /etc/containerd

# 3. 生成默认配置
containerd config default > /etc/containerd/config.toml

# 4. 【关键】修改配置:指定数据目录到 /home/cy/k8s
# 我们需要把默认路径 /var/lib/containerd 修改为 /home/cy/k8s/containerd
sed -i 's|state_dir = "/run/containerd"|state_dir = "/home/cy/k8s/containerd/run"|g' /etc/containerd/config.toml
sed -i 's|root = "/var/lib/containerd"|root = "/home/cy/k8s/containerd"|g' /etc/containerd/config.toml

# 5. 确保 SystemdCgroup 为 true (K8s 推荐)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 6. 重启 containerd
systemctl daemon-reload
systemctl enable --now containerd
systemctl restart containerd

第三步:安装 K8s 组件 (kubeadm, kubelet, kubectl)

# 1. 添加 K8s 官方源密钥和仓库
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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://pkgs.k8s.io/core:/stable:/v1.29/deb/ /" > /etc/apt/sources.list.d/kubernetes.list

# 2. 安装组件
apt-get update
apt-get install -y kubelet kubeadm kubectl

# 3. 锁定版本防止自动更新
apt-mark hold kubelet kubeadm kubectl

第四步:配置 Kubelet 数据目录 (数据迁移关键点 2)

# 1. 编辑 kubelet 的 systemd 配置文件
mkdir -p /etc/systemd/system/kubelet.service.d/

# 在 [Service] 部分添加 --root-dir 参数
cat <<EOF > /etc/systemd/system/kubelet.service.d/10-kubeadm-custom.conf
[Service]
ExecStart=
ExecStart=/usr/bin/kubelet --root-dir=/home/cy/k8s/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
EOF

# 2. 重新加载 systemd 配置
systemctl daemon-reload

第五步:初始化集群

注意--pod-network-cidr=172.20.0.0/16这里

合法私有内网 IP 范围(只有这 3 段)

10.0.0.0 ~ 10.255.255.255子网:10.0.0.0/8→ 整个 10 开头都是内网

172.16.0.0 ~ 172.31.255.255子网:172.16.0.0/12→ 注意:只有 172.16~172.31 是内网→ 172.32 及以上就不是了!

192.168.0.0 ~ 192.168.255.255子网:192.168.0.0/16→ 整个 192.168 开头都是内网

因为10.0.0.0/24被wireguard占用了,

# 1. 创建 K8s 数据根目录 (确保权限正确)
mkdir -p /home/cy/k8s
chown -R root:root /home/cy/k8s

# 2. 初始化 Master 节点
# --pod-network-cidr 是必须的,这里使用172.20.0.0/16是因为192.168.0.0/16被公司用了
kubeadm init --pod-network-cidr=172.20.0.0/16 --ignore-preflight-errors=Swap

第六步:配置 kubectl 和网络插件

# 1. 配置 kubectl 权限 (切回普通用户或保持 root 均可,这里假设您在 root 下)
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 2. 安装 Calico 网络插件
# 下载并应用 Calico 配置
curl https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml -O

# 修改网段 (对应您初始化时的 172.20.0.0/16)
sed -i 's|192.168.0.0/16|172.20.0.0/16|g' calico.yaml

kubectl apply -f calico.yaml

# 3. 允许 Master 节点调度 Pod (单节点模式常用)
kubectl taint nodes --all node-role.kubernetes.io/control-plane:NoSchedule-

验证

kubectl get nodes
kubectl get pods -n kube-system
#kubelet 是不是移动到了/home/cy/k8s内

❯ sudo du -sh /home/cy/k8s/*

240K    /home/cy/k8s/calico.yaml
1.8G    /home/cy/k8s/containerd
❯ ls -A /var/lib/kubelet 2>/dev/null || echo "目录为空或不存在"

config.yaml  cpu_manager_state  device-plugins  kubeadm-flags.env  .kubelet-keep  memory_manager_state  pki  plugins  plugins_registry  pod-resources  pods
❯ ls -A /var/lib/containerd 2>/dev/null || echo "目录为空或不存在"

目录为空或不存在
  ~ ❯  ❯ ps -ef | grep kubelet | grep -- --root-dir

❯ grep "root =" /etc/containerd/config.toml

root = "/home/cy/k8s/containerd"
        runtime_root = ""
          runtime_root = ""
        runtime_root = ""
    runtime_root = ""

强制 Kubelet 指向新目录

1. 编辑配置文件

sudo vim /etc/default/kubelet
#在文件中添加或修改 KUBELET_EXTRA_ARGS 这一行:
KUBELET_EXTRA_ARGS=--root-dir=/home/cy/k8s/kubelet

2. 停止服务并迁移数据

# 1. 停止 kubelet
sudo systemctl stop kubelet

# 2. 创建新目录
sudo mkdir -p /home/cy/k8s/kubelet

# 3. 将旧数据迁移到新目录 (如果旧目录有内容)
sudo rsync -av /var/lib/kubelet/ /home/cy/k8s/kubelet/

3. 重启服务并验证


# 1. 停止 kubelet
sudo systemctl stop kubelet

# 2. 重新加载 systemd 配置
sudo systemctl daemon-reload

# 3. 启动 kubelet
sudo systemctl start kubelet

# 4. 验证进程参数 (这次应该能看到 --root-dir 了)
ps -ef | grep kubelet | grep -- --root-dir

# 检查新目录是否有数据
sudo du -sh /home/cy/k8s/kubelet

# 检查 Pod 状态
kubectl get pods -A