blob: 45efcd27d47797d2cadebb154a0df63395764deb [file] [log] [blame]
{ config, pkgs, lib, machines, ... }:
with lib;
let
# Pin for kubelet and proxy.
k8spkgs = import (fetchGit {
# Now at 1.16.5
name = "nixos-unstable-2020-01-22";
url = https://github.com/nixos/nixpkgs-channels/;
rev = "a96ed5d70427bdc2fbb9e805784e1b9621157a98";
}) {};
cfg = config.hscloud.kube.data;
# All control plane nodes.
controlNodes = let
list = mapAttrsToList (_: v: v) machines;
filtered = filter (m: (m.config ? hscloud.kube.control) && (m.config.hscloud.kube.control.enable)) list;
sorted = sort (a: b: a.config.hscloud.base.fqdn < b.config.hscloud.base.fqdn) filtered;
in sorted;
fqdn = config.hscloud.base.fqdn;
pki = config.hscloud.kube.pki;
in {
options.hscloud.kube.data = {
enable = mkEnableOption "kubernetes data plane";
podNet = mkOption {
type = types.str;
description = "Subnet in which this node will run pods. Must be exclusive with podNets of other nodes.";
};
};
imports = [
./kube-common.nix
];
config = mkIf cfg.enable {
# If we're not running the control plane, render a hostsfile that points at
# all other control plane nodes. Otherwise, the control plane module will
# make this hostsfile contain the node itself.
networking.extraHosts = mkIf (!config.hscloud.kube.control.enable) (concatStringsSep "\n" (map
(n: ''
${n.config.hscloud.base.mgmtIf} ${n.config.hscloud.base.fqdn}
'')
controlNodes));
# this seems to depend on flannel
# TODO(q3k): file issue
systemd.services.kubelet-online = {
script = pkgs.lib.mkForce "sleep 1";
};
services.kubernetes = {
# The kubelet wants to mkfs.ext4 when mounting pvcs.
path = [ pkgs.e2fsprogs ];
proxy = {
enable = true;
kubeconfig = pki.kube.proxy.config;
extraOpts = ''
--hostname-override=${fqdn}\
--proxy-mode=iptables
'';
};
kubelet = {
enable = true;
unschedulable = false;
hostname = fqdn;
tlsCertFile = pki.kube.kubelet.cert;
tlsKeyFile = pki.kube.kubelet.key;
clientCaFile = pki.kube.kubelet.ca;
nodeIp = config.hscloud.base.ipAddr;
networkPlugin = "cni";
clusterDns = "10.10.12.254";
kubeconfig = pki.kube.kubelet.config;
extraOpts = ''
--read-only-port=0
'';
package = config.hscloud.kube.packageKubelet;
};
};
};
}