Files
nix-config-ryan4yin/lib/genK3sServerModule.nix
T
ryan4yin | 二花 069e081fec fix(k3s): bind control-plane metrics to node addresses (#311)
* fix(k3s): bind control-plane metrics to node addresses

* docs(microvm): document remote deployment workflow

* fix(microvm): deploy runner before guest switch

* docs(microvm): standardize on just deployment commands

* docs(k3s): explain control-plane metrics address

* docs(hosts): move generic build commands to host guide

* docs: simplify command operation guidance
2026-09-24 11:13:59 +08:00

103 lines
3.4 KiB
Nix

{
pkgs,
kubeconfigFile,
tokenFile,
# Initialize HA cluster using an embedded etcd datastore.
# If you are configuring an HA cluster with an embedded etcd,
# the 1st server must have `clusterInit = true`
# and other servers must connect to it using `serverAddr`.
#
# this can be a domain name or an IP address(such as kube-vip's virtual IP)
masterHost,
clusterInit ? false,
kubeletExtraArgs ? [ ],
k3sExtraArgs ? [ ],
# Bind embedded K3s control-plane HTTPS metrics to the node address so vmagent can scrape them.
metricsBindAddress ? null,
nodeLabels ? [ ],
nodeTaints ? [ ],
disableFlannel ? true,
...
}:
let
lib = pkgs.lib;
package = pkgs.k3s;
in
{
environment.systemPackages = with pkgs; [
package
k9s
kubectl
istioctl
kubernetes-helm
cilium-cli
fluxcd
clusterctl # for kubernetes cluster-api
skopeo # copy/sync images between registries and local storage
go-containerregistry # provides `crane` & `gcrane`, it's similar to skopeo
dive # explore docker layers
];
# Kernel modules required by cilium
boot.kernelModules = [
"ip6_tables"
"ip6table_mangle"
"ip6table_raw"
"ip6table_filter"
];
networking.enableIPv6 = true;
networking.nat = {
enable = true;
enableIPv6 = true;
};
services.k3s = {
enable = true;
inherit package tokenFile clusterInit;
serverAddr = if clusterInit then "" else "https://${masterHost}:6443";
role = "server";
# https://docs.k3s.io/cli/server
extraFlags =
let
flagList = [
"--write-kubeconfig=${kubeconfigFile}"
"--write-kubeconfig-mode=600"
"--service-node-port-range=80-32767"
"--kube-apiserver-arg='--allow-privileged=true'" # required by the former KubeVirt VMs
"--data-dir /var/lib/rancher/k3s"
"--etcd-expose-metrics=true"
"--etcd-snapshot-schedule-cron='0 */12 * * *'"
# disable some features we don't need
"--disable-helm-controller" # we use fluxcd instead
"--disable=traefik" # deploy our own ingress controller instead
"--disable=servicelb" # we use kube-vip instead
"--disable-network-policy"
"--tls-san=${masterHost}"
]
++ (map (label: "--node-label=${label}") nodeLabels)
++ (map (taint: "--node-taint=${taint}") nodeTaints)
++ (map (arg: "--kubelet-arg=${arg}") kubeletExtraArgs)
++ (lib.optionals (metricsBindAddress != null) [
"--kube-controller-manager-arg=bind-address=${metricsBindAddress}"
"--kube-scheduler-arg=bind-address=${metricsBindAddress}"
])
++ (lib.optionals disableFlannel [ "--flannel-backend=none" ])
++ k3sExtraArgs;
in
lib.concatStringsSep " " flagList;
};
# create symlinks to link k3s's cni directory to the one used by almost all CNI plugins
# such as multus, calico, etc.
# https://www.freedesktop.org/software/systemd/man/latest/tmpfiles.d.html#Type
systemd.tmpfiles.rules = [
# https://docs.k3s.io/networking/multus-ipams
"L+ /opt/cni/bin - - - - /var/lib/rancher/k3s/data/cni/"
# If you have disabled flannel, you will have to create the directory via a tmpfiles rule
"d /var/lib/rancher/k3s/agent/etc/cni/net.d 0751 root root - -"
# Link the CNI config directory
"L+ /etc/cni/net.d - - - - /var/lib/rancher/k3s/agent/etc/cni/net.d"
];
}