MicroK8s 集群配置文件详解(Ubuntu 22.04)
MicroK8s 集群配置文件详解(Ubuntu 22.04):解析 args 目录下 kubelite、kubelet、kube-apiserver 参数文件与 containerd 模板,逐项给出含义与修改方法,附 FAQ,实测验证通过。
MicroK8s 集群配置文件详解(Ubuntu 22.04)
目标:详解 MicroK8s 在 Ubuntu 22.04 上
/var/snap/microk8s/current/args/目录下的全部核心配置文件,逐项讲解kubelite/kubelet/kube-apiserver/kube-proxy/kube-controller-manager/kube-scheduler参数文件,以及containerd.toml、containerd-template.toml、containerd-env、k8s-dqlite、ha-conf、cni-env、certs.d的含义、默认值与修改方法,并给出可直接落地的生产配置模板与 FAQ。文中配置与回显均在 Ubuntu 22.04.5 LTS + MicroK8s v1.35.6(revision 9072)实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04.5 LTS / x86_64(内核 6.8.0-138-generic)
- MicroK8s:v1.35.6 revision 9072(snap 通道 1.35/stable,发布者 canonical,classic 安装)
- Kubernetes:v1.35.6;客户端 kubectl v1.35.6(Kustomize v5.7.1)
- 内置运行时:containerd v2.1.6;数据存储:k8s-dqlite(监听 127.0.0.1:19001)
- CNI 网络:calico(Pod 网段 10.1.0.0/16,Service 网段 10.152.183.0/24,集群 DNS 10.152.183.10,域名 cluster.local)
- API Server:https://172.18.0.2:16443(secure-port 16443)
- 集群:microk8s-u22-main(172.18.0.2,主节点)+ microk8s-u22-worker1(172.18.0.4,worker)
- 配置目录:
/var/snap/microk8s/current/args/(属主 root:microk8s,权限 660) - 示例账号:root(示例密码 q1w2e3r4)
二、配置文件一览与修改方式
2.1 配置目录结构
MicroK8s 的所有组件启动参数、运行时配置与网络配置集中存放在 /var/snap/microk8s/current/args/ 目录。实测目录清单一览:
ls -l /var/snap/microk8s/current/args/
实测回显:
total 120
drwxrwx--- 6 root microk8s 4096 Oct 11 13:48 .
drwxr-xr-x 9 root root 4096 Oct 11 13:20 ..
-rw-rw---- 1 root microk8s 129 Oct 11 13:19 admission-control-config-file.yaml
-rw-rw---- 1 root microk8s 132 Oct 11 13:19 apiserver-proxy
drwxrwx--- 4 root microk8s 4096 Oct 11 13:50 certs.d
-rw-rw---- 1 root microk8s 120 Oct 11 13:19 cluster-agent
-rw-rw---- 1 root microk8s 347 Oct 11 13:19 cni-env
drwxrwx--- 2 root microk8s 4096 Oct 11 13:50 cni-network
-rw-rw---- 1 root microk8s 167 Oct 11 13:19 containerd
-rw-rw---- 1 root microk8s 996 Oct 11 13:19 containerd-env
-rw-rw---- 1 root microk8s 2815 Oct 11 13:47 containerd-template.toml
-rw-rw---- 1 root microk8s 2854 Oct 11 13:48 containerd.toml
-rw-rw---- 1 root microk8s 64 Oct 11 13:19 ctr
-rw-rw---- 1 root microk8s 295 Oct 11 13:19 etcd
-rw-rw---- 1 root microk8s 129 Oct 11 13:19 eventconfig.yaml
-rw-rw---- 1 root microk8s 56 Oct 11 13:19 flannel-network-mgr-config
-rw-rw---- 1 root microk8s 502 Oct 11 13:19 flannel-template.conflist
-rw-rw---- 1 root microk8s 250 Oct 11 13:19 flanneld
drwxrwx--- 2 root microk8s 4096 Oct 11 13:19 git
-rw-rw---- 1 root microk8s 17 Oct 11 13:19 ha-conf
-rw-rw---- 1 root microk8s 119 Oct 11 13:19 k8s-dqlite
-rw-rw---- 1 root microk8s 125 Oct 11 13:19 k8s-dqlite-env
-rw-rw---- 1 root microk8s 2332 Oct 11 13:48 kube-apiserver
-rw-rw---- 1 root microk8s 467 Oct 11 13:20 kube-controller-manager
-rw-rw---- 1 root microk8s 129 Oct 11 13:20 kube-proxy
-rw-rw---- 1 root microk8s 141 Oct 11 13:19 kube-scheduler
-rw-rw---- 1 root microk8s 0 Oct 11 13:19 kubectl
-rw-rw---- 1 root microk8s 54 Oct 11 13:19 kubectl-env
-rw-rw---- 1 root microk8s 972 Oct 11 13:48 kubelet
-rw-rw---- 1 root microk8s 348 Oct 11 13:48 kubelite
drwxrwx--- 2 root microk8s 4096 Oct 11 13:19 traefik
关键文件与作用:
| 文件 / 目录 | 作用 |
|---|---|
kubelite | 控制面聚合进程(apiserver+controller-manager+scheduler+kube-proxy+kubelet)的入口参数 |
kubelet | kubelet 参数 |
kube-apiserver | API Server 参数 |
kube-proxy | kube-proxy 参数 |
kube-controller-manager | 控制器管理器参数 |
kube-scheduler | 调度器参数 |
containerd.toml | 运行时 containerd 实际生效配置(由模板渲染) |
containerd-template.toml | 运行时 containerd 配置模板(修改入口) |
containerd-env | containerd 环境变量(代理、ulimit、Kata 路径) |
cni-env | CNI 网络选择与网段配置 |
cni-network/ | CNI 插件配置与 calico 清单 |
k8s-dqlite | 默认数据存储参数 |
ha-conf | 高可用域配置 |
certs.d/ | 镜像仓库 hosts.toml(镜像加速入口) |
2.2 变量语法说明
MicroK8s 参数文件使用 snapd 变量语法,snapd 在组件启动时将其展开为真实路径,因此这些变量是配置文件的真实内容,并非占位符。展开对照如下:
| 变量 | 展开后的真实路径 |
|---|---|
${SNAP_DATA} | /var/snap/microk8s/current |
${SNAP_COMMON} | /var/snap/microk8s/common |
${DEFAULT_INTERFACE_IP_ADDR} | 节点默认出口网卡 IP(本环境主节点为 172.18.0.2) |
查看变量当前展开值:
ls -l /var/snap/microk8s/
实测回显(软链接指向当前 revision 目录):
total 8
drwxr-xr-x 9 root root 4096 Oct 11 13:20 9072
drwxr-xr-x 8 root root 4096 Oct 11 13:20 common
lrwxrwxrwx 1 root root 4 Oct 11 13:19 current -> 9072
2.3 修改方式与重启要求
修改参数文件后需重启对应组件或整个 MicroK8s 才能生效:
# 修改单个参数文件
vi /var/snap/microk8s/current/args/kube-apiserver
# 重启 MicroK8s 使全部参数生效(集群成员节点用 snap start/stop)
snap stop microk8s
snap start microk8s
⚠️ 直接执行
microk8s stop/microk8s start在已加入集群的节点上会提示 "acting as a node in a cluster",此时应改用snap stop microk8s/snap start microk8s。
2.4 修改后验证命令与预期结果
microk8s status --wait-ready
microk8s kubectl get nodes
预期结果(Ubuntu 22.04 实测回显):
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
microk8s-u22-main Ready <none> 42m v1.35.6 172.18.0.2 <none> Ubuntu 22.04.5 LTS 6.8.0-138-generic containerd://2.1.6
microk8s-u22-worker1 Ready <none> 4m34s v1.35.6 172.18.0.4 <none> Ubuntu 22.04.5 LTS 6.8.0-138-generic containerd://2.1.6
💡 节点全部
Ready、CONTAINER-RUNTIME显示containerd://2.1.6,即视为参数修改后集群恢复验证通过。
三、核心组件参数详解
MicroK8s 将控制面整合为 kubelite 单一进程:kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、kubelet 合并运行,各自读取对应的参数文件。kubelite 文件即聚合入口。
3.1 kubelite:控制面聚合入口
cat /var/snap/microk8s/current/args/kubelite
实测回显:
--scheduler-args-file=$SNAP_DATA/args/kube-scheduler
--controller-manager-args-file=$SNAP_DATA/args/kube-controller-manager
--proxy-args-file=$SNAP_DATA/args/kube-proxy
--kubelet-args-file=$SNAP_DATA/args/kubelet
--apiserver-args-file=$SNAP_DATA/args/kube-apiserver
--kubeconfig-file=$SNAP_DATA/credentials/client.config
--start-control-plane=true
| 参数 | 说明 | 默认值 |
|---|---|---|
--scheduler-args-file | 调度器参数文件路径 | $SNAP_DATA/args/kube-scheduler |
--controller-manager-args-file | 控制器管理器参数文件路径 | $SNAP_DATA/args/kube-controller-manager |
--proxy-args-file | kube-proxy 参数文件路径 | $SNAP_DATA/args/kube-proxy |
--kubelet-args-file | kubelet 参数文件路径 | $SNAP_DATA/args/kubelet |
--apiserver-args-file | API Server 参数文件路径 | $SNAP_DATA/args/kube-apiserver |
--start-control-plane | 本节点是否启动控制面 | true |
💡 说明:
--start-control-plane=true表示本节点承担控制面角色;纯 worker 节点加入后该值为 false,不再启动 apiserver 等控制面组件。修改该文件即可切换节点的控制面职责。
3.2 kubelet
cat /var/snap/microk8s/current/args/kubelet
实测回显:
--kubeconfig=${SNAP_DATA}/credentials/kubelet.config
--cert-dir=${SNAP_DATA}/certs
--client-ca-file=${SNAP_DATA}/certs/ca.crt
--anonymous-auth=false
--root-dir=${SNAP_COMMON}/var/lib/kubelet
--fail-swap-on=false
--eviction-hard="memory.available<100Mi,nodefs.available<1Gi,imagefs.available<1Gi"
--container-runtime-endpoint=${SNAP_COMMON}/run/containerd.sock
--containerd=${SNAP_COMMON}/run/containerd.sock
--node-labels="microk8s.io/cluster=true,node.kubernetes.io/microk8s-controlplane=microk8s-controlplane"
--authentication-token-webhook=true
--read-only-port=0
--tls-cipher-suites=TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_256_GCM_SHA384,TLS_RSA_WITH_AES_128_GCM_SHA256
--serialize-image-pulls=false
--cluster-dns=10.152.183.10
--cluster-domain=cluster.local
核心参数:
| 参数 | 说明 | 默认值 |
|---|---|---|
--root-dir | kubelet 数据根目录 | ${SNAP_COMMON}/var/lib/kubelet |
--fail-swap-on | 关闭 Swap 强制检查(允许节点启用 Swap) | false |
--eviction-hard | 节点资源驱逐阈值(内存<100Mi、nodefs/imagefs<1Gi) | 见左 |
--container-runtime-endpoint | CRI 运行时端点 | ${SNAP_COMMON}/run/containerd.sock |
--cluster-dns | 集群 DNS 服务 IP | 10.152.183.10 |
--cluster-domain | 集群域名后缀 | cluster.local |
--anonymous-auth | 匿名访问 kubelet 端点 | false |
--serialize-image-pulls | 串行拉取镜像 | false(并发拉取) |
修改方法:如调大驱逐阈值,编辑 --eviction-hard 一行(如改为 memory.available<200Mi,nodefs.available<2Gi),保存后 snap restart microk8s 使 kubelet 重新读取参数。
3.3 kube-apiserver
cat /var/snap/microk8s/current/args/kube-apiserver
实测回显(节选关键行):
--service-cluster-ip-range=10.152.183.0/24
--authorization-mode=AlwaysAllow
--secure-port=16443
--etcd-servers="unix://${SNAP_DATA}/var/kubernetes/backend/kine.sock:12379"
--allow-privileged=true
--service-account-issuer='https://kubernetes.default.svc'
--event-ttl=5m
--profiling=false
--enable-admission-plugins=EventRateLimit
--admission-control-config-file=${SNAP_DATA}/args/admission-control-config-file.yaml
--kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
核心参数:
| 参数 | 说明 | 默认值 |
|---|---|---|
--secure-port | API Server 安全端口 | 16443 |
--service-cluster-ip-range | Service 网段 | 10.152.183.0/24 |
--authorization-mode | 授权模式(单节点默认 AlwaysAllow) | AlwaysAllow |
--etcd-servers | 数据存储端点(实际指向 k8s-dqlite 的 kine 兼容层) | unix://${SNAP_DATA}/var/kubernetes/backend/kine.sock:12379 |
--event-ttl | 事件保留时长 | 5m |
--enable-admission-plugins | 启用的准入插件 | EventRateLimit |
--profiling | 性能分析端口 | false |
--kubelet-preferred-address-types | 连接 kubelet 优先地址类型 | InternalIP,Hostname,... |
💡 说明:
--etcd-servers指向kine.sock,说明 MicroK8s 默认用 k8s-dqlite(含 kine 兼容接口)承载数据存储而非原生 etcd;--authorization-mode=AlwaysAllow为单节点默认,生产多用户场景应启用 RBAC(microk8s enable rbac)。
3.4 kube-proxy
cat /var/snap/microk8s/current/args/kube-proxy
实测回显:
--kubeconfig=${SNAP_DATA}/credentials/proxy.config
--cluster-cidr=10.1.0.0/16
--healthz-bind-address=127.0.0.1
--profiling=false
| 参数 | 说明 | 默认值 |
|---|---|---|
--cluster-cidr | Pod 网段(用于识别集群内流量) | 10.1.0.0/16 |
--healthz-bind-address | 健康检查监听地址 | 127.0.0.1 |
--profiling | 性能分析端口 | false |
⚠️ kube-proxy 需要读写
/proc/sys/net/netfilter/nf_conntrack_max;若该文件在部分受限内核环境中不可写会持续报permission denied(生产服务器默认可写,无需额外处理)。
3.5 kube-controller-manager
cat /var/snap/microk8s/current/args/kube-controller-manager
实测回显:
--cluster-cidr=10.1.0.0/16
--service-cluster-ip-range=10.152.183.0/24
--kubeconfig=${SNAP_DATA}/credentials/controller.config
--service-account-private-key-file=${SNAP_DATA}/certs/serviceaccount.key
--root-ca-file=${SNAP_DATA}/certs/ca.crt
--cluster-signing-cert-file=${SNAP_DATA}/certs/ca.crt
--cluster-signing-key-file=${SNAP_DATA}/certs/ca.key
--use-service-account-credentials
--leader-elect-lease-duration=60s
--leader-elect-renew-deadline=30s
--profiling=false
| 参数 | 说明 | 默认值 |
|---|---|---|
--cluster-cidr | Pod 网段 | 10.1.0.0/16 |
--service-cluster-ip-range | Service 网段 | 10.152.183.0/24 |
--use-service-account-credentials | 各控制器使用独立 ServiceAccount 凭据 | 启用 |
--leader-elect-lease-duration | 选主租约时长 | 60s |
--leader-elect-renew-deadline | 选主续约截止 | 30s |
💡
leader-elect-lease-duration与renew-deadline决定多控制面高可用时的选主速度,HA 集群可按需缩短(如 15s/10s)以加快故障切换。
3.6 kube-scheduler
cat /var/snap/microk8s/current/args/kube-scheduler
实测回显:
--kubeconfig=${SNAP_DATA}/credentials/scheduler.config
--leader-elect-lease-duration=60s
--leader-elect-renew-deadline=30s
--profiling=false
| 参数 | 说明 | 默认值 |
|---|---|---|
--leader-elect-lease-duration | 选主租约时长 | 60s |
--leader-elect-renew-deadline | 选主续约截止 | 30s |
--profiling | 性能分析端口 | false |
四、运行时配置详解(containerd)
MicroK8s 随 snap 交付 containerd v2.1.6,作为唯一的 CRI 运行时,其配置分为「模板」与实际「渲染结果」两文件。
4.1 containerd.toml 与 containerd-template.toml
containerd-template.toml:配置模板,是修改运行时行为的入口,其中保留变量占位;containerd.toml:实际生效配置,由模板渲染生成,变量已被替换为真实值。
模板中运行时(CRI 接口)核心段:
grep -nA2 -E "sandbox_image|snapshotter|default_runtime_name" /var/snap/microk8s/current/args/containerd-template.toml
实测回显:
31: sandbox_image = "registry.k8s.io/pause:3.10"
40: snapshotter = "native"
47: default_runtime_name = "${RUNTIME}"
渲染后的生效配置(关键行):
grep -nE "sandbox_image|snapshotter|default_runtime_name|config_path" /var/snap/microk8s/current/args/containerd.toml
实测回显:
30: sandbox_image = "registry.k8s.io/pause:3.10"
39: snapshotter = "native"
46: default_runtime_name = "runc"
77: config_path = "/var/snap/microk8s/9072/args/certs.d"
| 配置项 | 说明 | 默认值 | 本环境值 |
|---|---|---|---|
sandbox_image | Pod 沙箱(pause)镜像 | registry.k8s.io/pause:3.10 | registry.k8s.io/pause:3.10 |
snapshotter | 快照器类型 | 由 MicroK8s 依据文件系统自动选择 | native |
default_runtime_name | 默认运行时 handler | runc | runc |
config_path | 镜像仓库 hosts.toml 目录 | ${SNAP_DATA}/args/certs.d | /var/snap/microk8s/9072/args/certs.d |
💡
snapshotter = "native"是受限文件系统环境(嵌套 overlayfs)下的实测取值——普通物理服务器通常自动选overlayfs;如需强制指定,编辑containerd-template.toml的snapshotter行后重启 MicroK8s。
4.2 快照器与运行时 handler
模板预置三个运行时 handler,可通过 RuntimeClass 按工作负载选择:
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.nvidia-container-runtime]
runtime_type = "io.containerd.runc.v2"
BinaryName = "nvidia-container-runtime"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.kata]
runtime_type = "io.containerd.kata.v2"
BinaryName = "kata-runtime"
| handler | runtime_type | 二进制 | 用途 |
|---|---|---|---|
runc | io.containerd.runc.v2 | runc | 默认运行时,通用工作负载 |
nvidia-container-runtime | io.containerd.runc.v2 | nvidia-container-runtime | GPU 工作负载 |
kata | io.containerd.kata.v2 | kata-runtime | 强隔离安全运行时 |
查询当前生效的运行时插件:
microk8s ctr plugins ls
实测回显:
io.containerd.snapshotter.v1 blockfile linux/amd64 skip
io.containerd.snapshotter.v1 btrfs linux/amd64 skip
io.containerd.snapshotter.v1 devmapper linux/amd64 skip
io.containerd.snapshotter.v1 erofs linux/amd64 skip
io.containerd.snapshotter.v1 native linux/amd64 ok
io.containerd.snapshotter.v1 overlayfs linux/amd64 ok
io.containerd.snapshotter.v1 zfs linux/amd64 skip
io.containerd.service.v1 snapshots-service - ok
io.containerd.cri.v1 images - ok
io.containerd.cri.v1 runtime linux/amd64 ok
io.containerd.grpc.v1 snapshots - ok
io.containerd.nri.v1 nri - ok
io.containerd.grpc.v1 cri - ok
💡 快照器中
native与overlayfs状态为ok,即两者均可用,实际采用哪一个由containerd.toml的snapshotter行决定(本环境为native)。
⚠️ 使用
katahandler 前需在服务器安装kata-runtime并在containerd-env中设置KATA_PATH;使用nvidia-container-runtime需先安装 GPU 驱动与对应运行时二进制。
4.3 containerd-env
cat /var/snap/microk8s/current/args/containerd-env
实测回显(有效行):
PATH=$PATH:$KATA_PATH
ulimit -n 65536 || true
ulimit -l 16384 || true
| 配置项 | 说明 | 默认值 |
|---|---|---|
HTTPS_PROXY | 为 containerd 配置代理(注释态,按需填写,形如 http://用户:密码@代理:端口/) | 空 |
NO_PROXY | 免代理网段(应含 Pod/Service 网段) | 空 |
KATA_PATH | kata-runtime 安装目录 | 空 |
ulimit -n | 最大打开文件数 | 65536 |
ulimit -l | 最大锁定内存 | 16384 |
修改方法:在 containerd-env 内新增环境变量行(如 HTTPS_PROXY=http://user:pass@proxy:3128),然后 snap stop microk8s && snap start microk8s 生效,并用下列命令验证:
systemctl show snap.microk8s.daemon-containerd -p Environment
4.4 ctr 客户端封装
cat /var/snap/microk8s/current/args/ctr
实测回显:
--address=${SNAP_COMMON}/run/containerd.sock
--namespace k8s.io
| 参数 | 说明 | 默认值 |
|---|---|---|
--address | containerd GRPC 套接字 | ${SNAP_COMMON}/run/containerd.sock |
--namespace | 默认命名空间 | k8s.io |
💡 由于封装文件已默认
--namespace k8s.io,直接执行microk8s ctr images ls无需再传-n;重复传参会报Cannot use two forms of the same flag: n namespace。
五、数据存储、网络与高可用配置
5.1 k8s-dqlite
MicroK8s 默认使用 k8s-dqlite(内置 kine 兼容层)作为数据存储:
cat /var/snap/microk8s/current/args/k8s-dqlite
实测回显:
--storage-dir=${SNAP_DATA}/var/kubernetes/backend/
--listen=unix://${SNAP_DATA}/var/kubernetes/backend/kine.sock:12379
| 参数 | 说明 | 默认值 |
|---|---|---|
--storage-dir | dqlite 数据目录 | ${SNAP_DATA}/var/kubernetes/backend/ |
--listen | 监听套接字(kine 接口,供 apiserver 访问) | unix://${SNAP_DATA}/var/kubernetes/backend/kine.sock:12379 |
💡 传统 etcd 参数文件
args/etcd同样存在(供 flannel 后端与外部接入使用),但默认数据存储为 k8s-dqlite;microk8s dbctl可用于 dqlite 运维。
5.2 ha-conf
cat /var/snap/microk8s/current/args/ha-conf
实测回显:
failure-domain=1
| 参数 | 说明 | 默认值 |
|---|---|---|
failure-domain | 故障域编号,控制面节点按域分布以避免同域多节点同时故障 | 1 |
💡 组建高可用集群时,同域控制面节点数不应超过半数,
failure-domain用于在microk8s join(非--worker)时给控制面节点打域标签。
5.3 cni-env 与 CNI 网络
cat /var/snap/microk8s/current/args/cni-env
实测回显:
# Choose CNI to deploy. Only 'calico' is supported at the moment
CNI=calico
# IPv4 configuration
IPv4_SUPPORT=true
IPv4_CLUSTER_CIDR=10.1.0.0/16
IPv4_SERVICE_CIDR=10.152.183.0/24
# IPv6 configuration
IPv6_SUPPORT=false
# IPv6_CLUSTER_CIDR=fd01::/64
# IPv6_SERVICE_CIDR=fd98::/108
# Calico-specific configuration settings
# CALICO_VETH_MTU=1450
| 配置项 | 说明 | 默认值 |
|---|---|---|
CNI | CNI 插件类型(当前仅支持 calico) | calico |
IPv4_SUPPORT | 是否启用 IPv4 | true |
IPv4_CLUSTER_CIDR | Pod 网段 | 10.1.0.0/16 |
IPv4_SERVICE_CIDR | Service 网段 | 10.152.183.0/24 |
IPv6_SUPPORT | 是否启用 IPv6(双栈) | false |
CALICO_VETH_MTU | calico veth 网卡 MTU(注释态,按网络环境调整) | 注释 |
CNI 插件目录内容:
ls /var/snap/microk8s/current/args/cni-network/
实测回显:
10-calico.conflist
calico-kubeconfig
cni.yaml
⚠️ 修改
IPv4_CLUSTER_CIDR/IPv4_SERVICE_CIDR后需snap restart microk8s重建 CNI;网段变更会导致现有 Pod 网络重建,请勿在生产运行中的集群随意调整。
5.4 flannel 与 etcd(历史网络路径)
args/ 下仍保留 flannel 相关文件(flanneld、flannel-template.conflist、flannel-network-mgr-config)供旧版网络模式使用:
cat /var/snap/microk8s/current/args/flannel-network-mgr-config
实测回显:
{"Network": "10.1.0.0/16", "Backend": {"Type": "vxlan"}}
💡 当前版本默认 CNI 为 calico,flannel 文件不参与生效;保留仅为兼容历史模式与外部接入场景。
六、证书与镜像仓库配置
6.1 certs.d 镜像仓库配置
镜像加速与私有仓库通过 args/certs.d/<registry>/hosts.toml 配置(containerd 的 config_path 指向该目录):
ls -R /var/snap/microk8s/current/args/certs.d
实测回显:
/var/snap/microk8s/current/args/certs.d:
docker.io
localhost:32000
/var/snap/microk8s/current/args/certs.d/docker.io:
hosts.toml
/var/snap/microk8s/current/args/certs.d/localhost:32000:
hosts.toml
docker.io 加速配置:
cat /var/snap/microk8s/current/args/certs.d/docker.io/hosts.toml
实测回显:
server = "https://docker.io"
[host."https://dockerproxy.net"]
capabilities = ["pull", "resolve"]
| 字段 | 说明 |
|---|---|
server | 原始仓库地址 |
[host."<镜像端点>"] | 镜像加速端点 |
capabilities | 能力声明,通常为 ["pull", "resolve"] |
内置 registry addon 的配置(localhost:32000):
server = "http://localhost:32000"
[host."http://localhost:32000"]
capabilities = ["pull", "resolve"]
⚠️ 修改 hosts.toml 后需
snap restart microk8s使 containerd 重新加载;部分国内加速端点路径前缀会变化(实测曾出现 404),请以加速服务实际声明为准。
6.2 准入控制与客户端配置
准入控制配置文件:
cat /var/snap/microk8s/current/args/admission-control-config-file.yaml
实测回显:
apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: EventRateLimit
path: eventconfig.yaml
事件限流参数(eventconfig.yaml):
apiVersion: eventratelimit.admission.k8s.io/v1alpha1
kind: Configuration
limits:
- type: Server
qps: 5000
burst: 20000
kubectl 客户端环境文件:
cat /var/snap/microk8s/current/args/kubectl-env
实测回显:
export KUBECONFIG=$SNAP_DATA/credentials/client.config
💡
kubectl-env为microk8s kubectl指定默认 kubeconfig;如需用系统 kubectl,可microk8s config > /root/.kube/config导出后使用。
七、生产环境配置模板
以下为 16GB 内存、SSD 磁盘的单主 + 多 worker 生产形态推荐配置要点(直接落到对应参数文件即可)。
| 配置目标 | 文件 | 推荐写法 |
|---|---|---|
| API 端口 | kube-apiserver | --secure-port=16443 |
| 授权模式 | kube-apiserver | 生产启用 RBAC(microk8s enable rbac)后由集群角色控制 |
| Pod / Service 网段 | cni-env + kube-proxy + kube-controller-manager | 按实际规划统一为 10.1.0.0/16 / 10.152.183.0/24 |
| 节点驱逐阈值 | kubelet | --eviction-hard="memory.available<200Mi,nodefs.available<2Gi,imagefs.available<2Gi" |
| 镜像加速 | certs.d/docker.io/hosts.toml | 填写企业内网镜像端点 |
| 代理 | containerd-env | HTTPS_PROXY=http://user:pass@proxy:3128 + NO_PROXY=10.1.0.0/16,10.152.183.0/24 |
| 高可用域 | ha-conf | 多控制面时按物理机架设置 failure-domain |
| 运行时安全隔离 | containerd-template.toml | 保留 kata handler,按需用 RuntimeClass 指定 |
修改后统一重启与验证:
snap restart microk8s
microk8s status --wait-ready
microk8s kubectl get nodes
预期结果:节点全部 Ready,microk8s status 显示 microk8s is running。
八、常见问题(FAQ)
Q1:改了参数文件为什么不生效?
定位:参数文件在组件启动时读取一次,运行中修改不会热更新。
解决:snap restart microk8s(或 snap stop microk8s + snap start microk8s)后重新读取参数;再用 2.4 节命令验证。
Q2:microk8s stop 报 "acting as a node in a cluster"?
定位:节点已加入集群,MicroK8s 要求用 snap 层命令管理服务。
解决:改用 snap stop microk8s 与 snap start microk8s。
Q3:参数文件里的 ${SNAP_DATA} 是什么,需要替换吗?
定位:这是 snapd 的变量语法,由 snapd 在启动时自动展开为 /var/snap/microk8s/current。
解决:不需要手工替换,保持原样即可;${SNAP_COMMON} 展开为 /var/snap/microk8s/common。
Q4:snapshotter 显示 native 而不是 overlayfs?
定位:MicroK8s 依据 SNAP_COMMON 所在文件系统自动选择快照器,嵌套 overlayfs 环境会退化为 native。
解决:功能不受影响;如需强制 overlayfs,编辑 containerd-template.toml 的 snapshotter 行后重启 MicroK8s。
Q5:如何为 containerd 配置代理拉取镜像?
定位:containerd 的环境变量由 containerd-env 提供。
解决:在 containerd-env 中写入 HTTPS_PROXY 与 NO_PROXY(含 Pod/Service 网段),snap stop microk8s && snap start microk8s 生效,用 systemctl show snap.microk8s.daemon-containerd -p Environment 复核。
九、参考链接
- MicroK8s 配置与服务管理:https://microk8s.io/docs/configuration
- MicroK8s 命令参考:https://microk8s.io/docs/commands
- MicroK8s 集群扩展:https://microk8s.io/docs/clustering
- MicroK8s 镜像加速与私有仓库:https://microk8s.io/docs/registry-private
- containerd 配置文档:https://github.com/containerd/containerd/blob/main/docs/man/