grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / cluster / kubernetes / flannel.nix
blobf0269cd0bc21ed77b934efb1c580e0b13734cba0
1 { config, lib, pkgs, ... }:
2 let
3   top = config.services.kubernetes;
4   cfg = top.flannel;
6   # we want flannel to use kubernetes itself as configuration backend, not direct etcd
7   storageBackend = "kubernetes";
8 in
10   ###### interface
11   options.services.kubernetes.flannel = {
12     enable = lib.mkEnableOption "flannel networking";
14     openFirewallPorts = lib.mkOption {
15       description = ''
16         Whether to open the Flannel UDP ports in the firewall on all interfaces.'';
17       type = lib.types.bool;
18       default = true;
19     };
20   };
22   ###### implementation
23   config = lib.mkIf cfg.enable {
24     services.flannel = {
26       enable = lib.mkDefault true;
27       network = lib.mkDefault top.clusterCidr;
28       inherit storageBackend;
29       nodeName = config.services.kubernetes.kubelet.hostname;
30     };
32     services.kubernetes.kubelet = {
33       cni.config = lib.mkDefault [{
34         name = "mynet";
35         type = "flannel";
36         cniVersion = "0.3.1";
37         delegate = {
38           isDefaultGateway = true;
39           bridge = "mynet";
40         };
41       }];
42     };
44     networking = {
45       firewall.allowedUDPPorts = lib.mkIf cfg.openFirewallPorts [
46         8285  # flannel udp
47         8472  # flannel vxlan
48       ];
49       dhcpcd.denyInterfaces = [ "mynet*" "flannel*" ];
50     };
52     services.kubernetes.pki.certs = {
53       flannelClient = top.lib.mkCert {
54         name = "flannel-client";
55         CN = "flannel-client";
56         action = "systemctl restart flannel.service";
57       };
58     };
60     # give flannel some kubernetes rbac permissions if applicable
61     services.kubernetes.addonManager.bootstrapAddons = lib.mkIf ((storageBackend == "kubernetes") && (lib.elem "RBAC" top.apiserver.authorizationMode)) {
63       flannel-cr = {
64         apiVersion = "rbac.authorization.k8s.io/v1";
65         kind = "ClusterRole";
66         metadata = { name = "flannel"; };
67         rules = [{
68           apiGroups = [ "" ];
69           resources = [ "pods" ];
70           verbs = [ "get" ];
71         }
72         {
73           apiGroups = [ "" ];
74           resources = [ "nodes" ];
75           verbs = [ "list" "watch" ];
76         }
77         {
78           apiGroups = [ "" ];
79           resources = [ "nodes/status" ];
80           verbs = [ "patch" ];
81         }];
82       };
84       flannel-crb = {
85         apiVersion = "rbac.authorization.k8s.io/v1";
86         kind = "ClusterRoleBinding";
87         metadata = { name = "flannel"; };
88         roleRef = {
89           apiGroup = "rbac.authorization.k8s.io";
90           kind = "ClusterRole";
91           name = "flannel";
92         };
93         subjects = [{
94           kind = "User";
95           name = "flannel-client";
96         }];
97       };
99     };
100   };
102   meta.buildDocsInSandbox = false;