c58c1e8f55
Allow to set kubelet configuration parameters via an option. Additionally, expose the respective options for graceful node shutdown directly, as it is anticipated to be used frequently.
81 lines
3.2 KiB
Nix
81 lines
3.2 KiB
Nix
# A test that sets extra kubelet configuration and enables graceful node shutdown
|
|
import ../make-test-python.nix (
|
|
{
|
|
pkgs,
|
|
lib,
|
|
k3s,
|
|
...
|
|
}:
|
|
let
|
|
nodeName = "test";
|
|
shutdownGracePeriod = "1m13s";
|
|
shutdownGracePeriodCriticalPods = "13s";
|
|
podsPerCore = 3;
|
|
memoryThrottlingFactor = 0.69;
|
|
containerLogMaxSize = "5Mi";
|
|
in
|
|
{
|
|
name = "${k3s.name}-kubelet-config";
|
|
nodes.machine =
|
|
{ pkgs, ... }:
|
|
{
|
|
environment.systemPackages = [ pkgs.jq ];
|
|
|
|
# k3s uses enough resources the default vm fails.
|
|
virtualisation.memorySize = 1536;
|
|
virtualisation.diskSize = 4096;
|
|
|
|
services.k3s = {
|
|
enable = true;
|
|
package = k3s;
|
|
# Slightly reduce resource usage
|
|
extraFlags = [
|
|
"--disable coredns"
|
|
"--disable local-storage"
|
|
"--disable metrics-server"
|
|
"--disable servicelb"
|
|
"--disable traefik"
|
|
"--node-name ${nodeName}"
|
|
];
|
|
gracefulNodeShutdown = {
|
|
enable = true;
|
|
inherit shutdownGracePeriod shutdownGracePeriodCriticalPods;
|
|
};
|
|
extraKubeletConfig = {
|
|
inherit podsPerCore memoryThrottlingFactor containerLogMaxSize;
|
|
};
|
|
};
|
|
};
|
|
|
|
testScript = ''
|
|
import json
|
|
|
|
start_all()
|
|
machine.wait_for_unit("k3s")
|
|
# wait until the node is ready
|
|
machine.wait_until_succeeds(r"""kubectl wait --for='jsonpath={.status.conditions[?(@.type=="Ready")].status}=True' nodes/${nodeName}""")
|
|
# test whether the kubelet registered an inhibitor lock
|
|
machine.succeed("systemd-inhibit --list --no-legend | grep \"kubelet.*k3s-server.*shutdown\"")
|
|
# run kubectl proxy in the background, close stdout through redirection to not wait for the command to finish
|
|
machine.execute("kubectl proxy --address 127.0.0.1 --port=8001 >&2 &")
|
|
machine.wait_until_succeeds("nc -z 127.0.0.1 8001")
|
|
# get the kubeletconfig
|
|
kubelet_config=json.loads(machine.succeed("curl http://127.0.0.1:8001/api/v1/nodes/${nodeName}/proxy/configz | jq '.kubeletconfig'"))
|
|
|
|
with subtest("Kubelet config values are set correctly"):
|
|
assert kubelet_config["shutdownGracePeriod"] == "${shutdownGracePeriod}", \
|
|
f"unexpected value for shutdownGracePeriod: {kubelet_config["shutdownGracePeriod"]}"
|
|
assert kubelet_config["shutdownGracePeriodCriticalPods"] == "${shutdownGracePeriodCriticalPods}", \
|
|
f"unexpected value for shutdownGracePeriodCriticalPods: {kubelet_config["shutdownGracePeriodCriticalPods"]}"
|
|
assert kubelet_config["podsPerCore"] == ${toString podsPerCore}, \
|
|
f"unexpected value for podsPerCore: {kubelet_config["podsPerCore"]}"
|
|
assert kubelet_config["memoryThrottlingFactor"] == ${toString memoryThrottlingFactor}, \
|
|
f"unexpected value for memoryThrottlingFactor: {kubelet_config["memoryThrottlingFactor"]}"
|
|
assert kubelet_config["containerLogMaxSize"] == "${containerLogMaxSize}", \
|
|
f"unexpected value for containerLogMaxSize: {kubelet_config["containerLogMaxSize"]}"
|
|
'';
|
|
|
|
meta.maintainers = lib.teams.k3s.members;
|
|
}
|
|
)
|