1{ config, lib, options, pkgs, ... }:
2
3with lib;
4
5let
6 top = config.services.kubernetes;
7 otop = options.services.kubernetes;
8 cfg = top.scheduler;
9in
10{
11 ###### interface
12 options.services.kubernetes.scheduler = with lib.types; {
13
14 address = mkOption {
15 description = lib.mdDoc "Kubernetes scheduler listening address.";
16 default = "127.0.0.1";
17 type = str;
18 };
19
20 enable = mkEnableOption (lib.mdDoc "Kubernetes scheduler");
21
22 extraOpts = mkOption {
23 description = lib.mdDoc "Kubernetes scheduler extra command line options.";
24 default = "";
25 type = separatedString " ";
26 };
27
28 featureGates = mkOption {
29 description = lib.mdDoc "List set of feature gates";
30 default = top.featureGates;
31 defaultText = literalExpression "config.${otop.featureGates}";
32 type = listOf str;
33 };
34
35 kubeconfig = top.lib.mkKubeConfigOptions "Kubernetes scheduler";
36
37 leaderElect = mkOption {
38 description = lib.mdDoc "Whether to start leader election before executing main loop.";
39 type = bool;
40 default = true;
41 };
42
43 port = mkOption {
44 description = lib.mdDoc "Kubernetes scheduler listening port.";
45 default = 10251;
46 type = port;
47 };
48
49 verbosity = mkOption {
50 description = lib.mdDoc ''
51 Optional glog verbosity level for logging statements. See
52 <https://github.com/kubernetes/community/blob/master/contributors/devel/logging.md>
53 '';
54 default = null;
55 type = nullOr int;
56 };
57
58 };
59
60 ###### implementation
61 config = mkIf cfg.enable {
62 systemd.services.kube-scheduler = {
63 description = "Kubernetes Scheduler Service";
64 wantedBy = [ "kubernetes.target" ];
65 after = [ "kube-apiserver.service" ];
66 serviceConfig = {
67 Slice = "kubernetes.slice";
68 ExecStart = ''${top.package}/bin/kube-scheduler \
69 --bind-address=${cfg.address} \
70 ${optionalString (cfg.featureGates != [])
71 "--feature-gates=${concatMapStringsSep "," (feature: "${feature}=true") cfg.featureGates}"} \
72 --kubeconfig=${top.lib.mkKubeConfig "kube-scheduler" cfg.kubeconfig} \
73 --leader-elect=${boolToString cfg.leaderElect} \
74 --secure-port=${toString cfg.port} \
75 ${optionalString (cfg.verbosity != null) "--v=${toString cfg.verbosity}"} \
76 ${cfg.extraOpts}
77 '';
78 WorkingDirectory = top.dataDir;
79 User = "kubernetes";
80 Group = "kubernetes";
81 Restart = "on-failure";
82 RestartSec = 5;
83 };
84 unitConfig = {
85 StartLimitIntervalSec = 0;
86 };
87 };
88
89 services.kubernetes.pki.certs = {
90 schedulerClient = top.lib.mkCert {
91 name = "kube-scheduler-client";
92 CN = "system:kube-scheduler";
93 action = "systemctl restart kube-scheduler.service";
94 };
95 };
96
97 services.kubernetes.scheduler.kubeconfig.server = mkDefault top.apiserverAddress;
98 };
99
100 meta.buildDocsInSandbox = false;
101}