Files
dotfiles/nixos/k3s.nix

165 lines
5.1 KiB
Nix
Raw Normal View History

2024-10-07 15:00:14 -06:00
{
pkgs,
config,
lib,
...
}:
with lib; let
cfg = config.myModules.railbird-k3s;
mount-path = "/var/lib/railbird/bucket";
bucket-name = "railbird-dev-videos";
2024-12-29 17:58:31 -07:00
plugins-path = pkgs.buildEnv {
name = "combined-cni-plugins";
paths = [
pkgs.cni-plugins
pkgs.calico-cni-plugin
pkgs.calico-kube-controllers
2024-12-29 17:58:31 -07:00
];
};
in {
options = {
2024-09-30 16:42:58 -06:00
myModules.railbird-k3s = {
enable = mkEnableOption "railbird k3s";
serverAddr = mkOption {
type = lib.types.str;
default = "";
};
extraFlags = mkOption {
type = lib.types.listOf lib.types.str;
default = [];
};
};
};
2024-09-30 16:42:58 -06:00
config = mkIf cfg.enable {
age.secrets."1896Folsom-k3s-token.age".file = ./secrets/1896Folsom-k3s-token.age;
age.secrets."k3s-registry.yaml.age".file = ./secrets/k3s-registry.yaml.age;
2024-10-07 15:00:14 -06:00
age.secrets.api-service-key = {
file = ./secrets/api_service_account_key.json.age;
owner = "railbird";
group = "users";
};
environment.etc."rancher/k3s/registries.yaml".source = config.age.secrets."k3s-registry.yaml.age".path;
services.dockerRegistry = {
enable = true;
listenAddress = "0.0.0.0";
port = 5279;
enableDelete = true;
enableGarbageCollect = true;
};
2024-12-29 19:20:40 -07:00
services.flannel.enable = true;
2024-11-11 18:58:48 -07:00
virtualisation.containerd = {
enable = true;
settings = {
plugins."io.containerd.grpc.v1.cri" = {
enable_cdi = true;
cdi_spec_dirs = [ "/var/run/cdi" ];
cni.bin_dir = "/opt/cni/bin";
2024-11-11 18:58:48 -07:00
};
};
};
2024-12-29 17:20:00 -07:00
virtualisation.containers = {
containersConf.cniPlugins = [
pkgs.cni-plugins
2024-12-29 17:20:00 -07:00
pkgs.calico-cni-plugin
pkgs.calico-kube-controllers
2024-12-29 17:17:03 -07:00
];
};
2024-11-11 19:18:30 -07:00
systemd.services = {
nvidia-container-toolkit-cdi-generator = {
# Even with `--library-search-path`, `nvidia-ctk` won't find the libs
# unless I bodge their path into the environment.
environment.LD_LIBRARY_PATH = "${config.hardware.nvidia.package}/lib";
};
# k3s-containerd-setup = {
# # `virtualisation.containerd.settings` has no effect on k3s' bundled containerd.
# serviceConfig.Type = "oneshot";
# requiredBy = ["k3s.service"];
# before = ["k3s.service"];
# script = ''
# cat << EOF > /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl
# {{ template "base" . }}
# [plugins]
# "io.containerd.grpc.v1.cri".enable_cdi = true
# EOF
# '';
# };
};
2024-10-07 15:00:14 -06:00
systemd.services.mount-railbird-bucket = {
after = ["agenix.service"];
wantedBy = [ "multi-user.target" ];
2024-10-07 15:00:14 -06:00
description = "Mount railbird bucket";
serviceConfig = {
Type = "simple";
RemainAfterExit = true;
Restart = "on-failure"; # Restart the service on failure
RestartSec = 5; # Wait 5 seconds before restarti
2024-10-07 15:00:14 -06:00
ExecStartPre = [
2024-10-07 15:16:16 -06:00
"-${pkgs.util-linux}/bin/umount -f ${mount-path}"
"${pkgs.coreutils}/bin/mkdir -p ${mount-path}"
"${pkgs.coreutils}/bin/chown railbird:users ${mount-path}"
"${pkgs.coreutils}/bin/chmod 0775 ${mount-path}"
2024-10-07 15:00:14 -06:00
];
ExecStart = let
key-file = config.age.secrets.api-service-key.path;
in
pkgs.writeShellScript "mount-railbird-bucket" ''
while true; do
if ${pkgs.util-linux}/bin/mount | grep -q "${mount-path}" && [ -d "${mount-path}/dev" ]; then
echo "Mount path ${mount-path} is mounted and valid (contains directory 'dev')."
else
echo "Mount path is not valid or not mounted, attempting remount."
${pkgs.util-linux}/bin/umount -f "${mount-path}" || true
${pkgs.gcsfuse}/bin/gcsfuse --implicit-dirs --key-file "${key-file}" "${bucket-name}" "${mount-path}"
fi
echo "Sleeping"
sleep 30
done
'';
2024-10-07 15:16:16 -06:00
User = "root";
2024-10-07 15:00:14 -06:00
};
};
services.k3s = {
enable = true;
clusterInit = cfg.serverAddr == "";
serverAddr = cfg.serverAddr;
configPath = pkgs.writeTextFile {
name = "k3s-config.yaml";
text = ''
kubelet-arg:
- "eviction-hard=nodefs.available<2Gi"
- "eviction-soft=nodefs.available<5Gi"
- "eviction-soft-grace-period=nodefs.available=5m"
'';
};
tokenFile = config.age.secrets."1896Folsom-k3s-token.age".path;
extraFlags =
[
2024-12-23 17:48:27 -07:00
"--container-runtime-endpoint unix:///run/containerd/containerd.sock"
"--tls-san ryzen-shine.local"
"--tls-san nixquick.local"
"--tls-san biskcomp.local"
"--tls-san jimi-hendnix.local"
"--tls-san dev.railbird.ai"
"--node-label nixos-nvidia-cdi=enabled"
]
++ cfg.extraFlags;
containerdConfigTemplate = ''
{{ template "base" . }}
2024-09-30 00:05:50 -06:00
[plugins]
"io.containerd.grpc.v1.cri".enable_cdi = true
2024-11-11 19:18:30 -07:00
"io.containerd.grpc.v1.cri".cdi_spec_dirs = [ "/var/run/cdi" ]
'';
gracefulNodeShutdown = {
enable = true;
};
2024-09-30 00:05:50 -06:00
};
};
}