离线部署kubernetes v1.34.3
镜像用的在线下载的方式,如果需要完全离线,搭建私有镜像仓库,把需要的镜像上传到镜像仓库。
环境信息
- virtualbox 虚拟机
- os: ubuntu 24.04.3
- kernel: 6.8.0-90-generic
- 网卡1: 10.0.2.15/fd17:625c:f037:2:a00:27ff:fe3e:462e(网络地址转换NAT,默认网络用于连接互联网)
- 网卡2: 192.168.56.101/fd00:db1::101(仅主机网络,管理+业务)
安装容器运行时containerd
https://blog.csdn.net/s7799653/article/details/155524556
配置容器运行时 containerd
- 首先导出containerd的默认配置文件
shell
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
- 修改pause镜像
测试环境可以用渡渡鸟的容器镜像小站来获取镜像。正式环境建议自己搭建镜像仓库
toml
[plugins]
...
[plugins.'io.containerd.grpc.v1.cri']
...
sandbox_image = 'swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.10.1'
这里还有一个类似配置是[plugins.'io.containerd.cri.v1.images'.pinned_images],这个是配置在垃圾回收的过程中,不删除这个镜像,这个也是要改的,或者删除这个配置,否则还是会去下载registry.k8s.io/pause:3.10.1。左边的名字只是key,不影响使用,不固定为sandbox,比如固定配置为
toml
[plugins]
...
[plugins.'io.containerd.cri.v1.images'.pinned_images]
sandbox = 'swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/pause:3.10.1'
coredns = 'swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/coredns/coredns:v1.12.1'
重启containerd
shell
systemctl daemon-reload
systemctl restart containerd
- 配置使用systemd cgroup驱动
https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#cgroup-drivers
cgroup是用来限制容器资源使用的,如cpu、内存等,kubelet 和容器运行时需使用相同的 cgroup 驱动并且采用相同的配置。可用的 cgroup 驱动有两个cgroupfs和systemd
cgroupfs 驱动是 kubelet 中默认的 cgroup 驱动。 当使用 cgroupfs 驱动时, kubelet 和容器运行时将直接对接 cgroup 文件系统来配置 cgroup。
当 systemd 是初始化系统时, 不 推荐使用 cgroupfs 驱动,因为 systemd 期望系统上只有一个 cgroup 管理器。 此外,如果你使用 cgroup v2, 则应用 systemd cgroup 驱动取代 cgroupfs 。
要判断 Linux 系统是否以 systemd 作为初始化系统(init system),可以通过以下命令:
shell
# 方法 1.1:使用 ps 命令
ps -p 1 -o comm=
# 方法 1.2:直接读取 /proc 文件系统(更简洁)
cat /proc/1/comm
- 如果输出为 systemd,则说明当前系统使用 systemd 作为初始化系统。
- 如果输出为 init(或其他如 upstart、sysvinit等),则说明不是 systemd。
同时存在两个 cgroup 管理器将造成系统中针对可用的资源和使用中的资源出现两个视图。某些情况下, 将 kubelet 和容器运行时配置为使用 cgroupfs、但为剩余的进程使用 systemd 的那些节点将在资源压力增大时变得不稳定。
toml
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc]
...
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options]
SystemdCgroup = true
配置网络转发
shell
cat <<EOF | sudo tee -a /etc/sysctl.d/k8s.conf
net.ipv4.conf.all.forwarding = 1
net.ipv6.conf.all.forwarding = 1
EOF
sudo sysctl --system
安装kubeadm和kubelet
https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
- 下载crictl(非必须)
下载:https://github.com/kubernetes-sigs/cri-tools/releases ,解压到/usr/local/bin
-
下载并安装kubelet和kubeadm
kubeadm 的安装是通过使用动态链接的二进制文件完成的,安装时假设你的目标系统提供 glibc。https://cdn.dl.k8s.io/release/v1.34.3/bin/linux/amd64/kubeadm
https://cdn.dl.k8s.io/release/v1.34.3/bin/linux/amd64/kubelet
https://cdn.dl.k8s.io/release/v1.34.3/bin/linux/amd64/kubectl
上传到/usr/local/bin
下载kubelet.server和10-kubeadm.conf: https://github.com/kubernetes/release,选择最新的release,下载/cmd/krel/templates/latest/kubelet/kubelet.service和/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf
shell
sed -i "s:/usr/bin:/usr/local/bin:g" kubelet.service
sed -i "s:/usr/bin:/usr/local/bin:g" 10-kubeadm.conf
cp kubelet.service /usr/lib/systemd/system/kubelet.service
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
cp 10-kubeadm.conf /usr/lib/systemd/system/kubelet.service.d
# 配置kubelet使用的INTERNAL-IP
# /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf添加kubelet启动参数
# --node-ip=192.168.56.101
安装kubernetes
- 打印默认的kubeadm配置文件
shell
kubeadm config print init-defaults > kubeadm.yml
- 修改配置
caCertificateValidityPeriodca证书有效期certificateValidityPeriod证书有效期localAPIEndpoint.advertiseAddress修改为集群组件间通讯使用的IP,也就是apiserver listen的IPimageRepository可以下载到镜像的仓库(测试环境,直接写了 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io)networking.podSubnet: 10.244.0.0/16,fd00:db8:244::/56 pod使用的地址池networking.serviceSubnet: 10.96.0.0/16,fd00:db8:96::/112 service的网络地址nodeRegistration.name本机的主机名- dns单独指定仓库
使用 imageRepository 所指定的定制镜像库可能与默认的 registry.k8s.io 镜像路径不同。dns的子路径是 registry.k8s.io/core/core:v1.12.1, 但使用自定义仓库时默认为 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/coredns:v1.12.1,就导致镜像无法正常下载。
yml
imageRepository: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io
dns:
imageRepository: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/coredns
imageTag: v1.12.1
-
不安装kube-proxy
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
skipPhases:
- addon/kube-proxy -
禁止controller-manager 给 Node 分配 PodCIDR
yaml
controllerManager:
extraArgs:
- name: allocate-node-cidrs
value: "false"
- 初始化集群
shell
# 允许kubelet自启动
systemctl enable kubelet.service
kubeadm init --config kubeadm.yml
# 配置kubelet
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 安装cilium 网络
shell
#下载cilium-cli
https://github.com/cilium/cilium-cli/releases/tag/v0.18.9
# 解压到 /usr/local/bin
cilium配置(cilium-conf.yml)
yml
# 完全替代kube-proxy
kubeProxyReplacement: true
# 配置直连apiserver 需要禁用kube-proxy
k8sServiceHost: 192.168.56.101
k8sServicePort: 6443
# 用于多集群 / 身份隔离
cluster:
name: k8s-standalone
id: 1
# 转发架构: native 直接路由,不使用隧道
routingMode: native
# 自动下发 PodCIDR 路由
autoDirectNodeRoutes: true
ipv6:
enabled : true
# 原生设置,表示这一段内的不封装
ipv6NativeRoutingCIDR: "fd00:db8:244::/112"
ipv4NativeRoutingCIDR: "10.244.0.0/16"
# pod ip分配
ipam:
mode: cluster-pool
# ip池,要与kubeadm中配置的一致
operator:
clusterPoolIPv4PodCIDRList: ["10.244.0.0/16"]
# 每个节点分配的ip
clusterPoolIPv4MaskSize: 24
# ipv6配置
clusterPoolIPv6PodCIDRList: ["fd00:db8:244::/56"]
clusterPoolIPv6MaskSize: 64
# 无 kube-proxy 需要启用NodePort功能
enableNodePort: true
# 性能优化相关
bpf:
# 高并发,稳定性好
lbAlgorithm: maglev
# 出集群流量SNAT
masquerade: true
# 提前分配BPF map
preallocateMaps: true
# 安装hubble,可视化
hubble:
enabled: true
relay:
enabled: true
ui:
enabled: true
# 全局镜像配置(影响所有组件,优先级低于组件单独配置)
image:
repository: "quay.io/cilium/cilium" # 默认官方仓库,可替换为私有仓库地址(如 registry.example.com/cilium/cilium)
# Cilium Operator 镜像
operator:
image:
repository: "quay.io/cilium/operator" # 默认 Operator 仓库
# Hubble Relay 镜像(若启用 Hubble)
hubble:
relay:
image:
repository: "quay.io/cilium/hubble-relay"
shell
# 单节点需要删除taint
kubectl taint nodes k8s-standalone node-role.kubernetes.io/control-plane-
# 安装
cilium install --values cilium-conf.yml
其他配置
kubect 补全
shell
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
可以把上述命令写入~/.bashrc