113 lines
5.2 KiB
XML
113 lines
5.2 KiB
XML
|
<chapter xmlns="http://docbook.org/ns/docbook"
|
||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||
|
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||
|
version="5.0"
|
||
|
xml:id="sec-kubernetes">
|
||
|
<title>Kubernetes</title>
|
||
|
<para>
|
||
|
The NixOS Kubernetes module is a collective term for a handful of individual
|
||
|
submodules implementing the Kubernetes cluster components.
|
||
|
</para>
|
||
|
<para>
|
||
|
There are generally two ways of enabling Kubernetes on NixOS. One way is to
|
||
|
enable and configure cluster components appropriately by hand:
|
||
|
<programlisting>
|
||
|
services.kubernetes = {
|
||
|
apiserver.enable = true;
|
||
|
controllerManager.enable = true;
|
||
|
scheduler.enable = true;
|
||
|
addonManager.enable = true;
|
||
|
proxy.enable = true;
|
||
|
flannel.enable = true;
|
||
|
};
|
||
|
</programlisting>
|
||
|
Another way is to assign cluster roles ("master" and/or "node") to the host.
|
||
|
This enables apiserver, controllerManager, scheduler, addonManager,
|
||
|
kube-proxy and etcd:
|
||
|
<programlisting>
|
||
|
<xref linkend="opt-services.kubernetes.roles"/> = [ "master" ];
|
||
|
</programlisting>
|
||
|
While this will enable the kubelet and kube-proxy only:
|
||
|
<programlisting>
|
||
|
<xref linkend="opt-services.kubernetes.roles"/> = [ "node" ];
|
||
|
</programlisting>
|
||
|
Assigning both the master and node roles is usable if you want a single node
|
||
|
Kubernetes cluster for dev or testing purposes:
|
||
|
<programlisting>
|
||
|
<xref linkend="opt-services.kubernetes.roles"/> = [ "master" "node" ];
|
||
|
</programlisting>
|
||
|
Note: Assigning either role will also default both
|
||
|
<xref linkend="opt-services.kubernetes.flannel.enable"/> and
|
||
|
<xref linkend="opt-services.kubernetes.easyCerts"/> to true. This sets up
|
||
|
flannel as CNI and activates automatic PKI bootstrapping.
|
||
|
</para>
|
||
|
<para>
|
||
|
As of kubernetes 1.10.X it has been deprecated to open non-tls-enabled ports
|
||
|
on kubernetes components. Thus, from NixOS 19.03 all plain HTTP ports have
|
||
|
been disabled by default. While opening insecure ports is still possible, it
|
||
|
is recommended not to bind these to other interfaces than loopback. To
|
||
|
re-enable the insecure port on the apiserver, see options:
|
||
|
<xref linkend="opt-services.kubernetes.apiserver.insecurePort"/> and
|
||
|
<xref linkend="opt-services.kubernetes.apiserver.insecureBindAddress"/>
|
||
|
</para>
|
||
|
<note>
|
||
|
<para>
|
||
|
As of NixOS 19.03, it is mandatory to configure:
|
||
|
<xref linkend="opt-services.kubernetes.masterAddress"/>. The masterAddress
|
||
|
must be resolveable and routeable by all cluster nodes. In single node
|
||
|
clusters, this can be set to <literal>localhost</literal>.
|
||
|
</para>
|
||
|
</note>
|
||
|
<para>
|
||
|
Role-based access control (RBAC) authorization mode is enabled by default.
|
||
|
This means that anonymous requests to the apiserver secure port will
|
||
|
expectedly cause a permission denied error. All cluster components must
|
||
|
therefore be configured with x509 certificates for two-way tls communication.
|
||
|
The x509 certificate subject section determines the roles and permissions
|
||
|
granted by the apiserver to perform clusterwide or namespaced operations. See
|
||
|
also:
|
||
|
<link
|
||
|
xlink:href="https://kubernetes.io/docs/reference/access-authn-authz/rbac/">
|
||
|
Using RBAC Authorization</link>.
|
||
|
</para>
|
||
|
<para>
|
||
|
The NixOS kubernetes module provides an option for automatic certificate
|
||
|
bootstrapping and configuration,
|
||
|
<xref linkend="opt-services.kubernetes.easyCerts"/>. The PKI bootstrapping
|
||
|
process involves setting up a certificate authority (CA) daemon (cfssl) on
|
||
|
the kubernetes master node. cfssl generates a CA-cert for the cluster, and
|
||
|
uses the CA-cert for signing subordinate certs issued to each of the cluster
|
||
|
components. Subsequently, the certmgr daemon monitors active certificates and
|
||
|
renews them when needed. For single node Kubernetes clusters, setting
|
||
|
<xref linkend="opt-services.kubernetes.easyCerts"/> = true is sufficient and
|
||
|
no further action is required. For joining extra node machines to an existing
|
||
|
cluster on the other hand, establishing initial trust is mandatory.
|
||
|
</para>
|
||
|
<para>
|
||
|
To add new nodes to the cluster: On any (non-master) cluster node where
|
||
|
<xref linkend="opt-services.kubernetes.easyCerts"/> is enabled, the helper
|
||
|
script <literal>nixos-kubernetes-node-join</literal> is available on PATH.
|
||
|
Given a token on stdin, it will copy the token to the kubernetes secrets
|
||
|
directory and restart the certmgr service. As requested certificates are
|
||
|
issued, the script will restart kubernetes cluster components as needed for
|
||
|
them to pick up new keypairs.
|
||
|
</para>
|
||
|
<note>
|
||
|
<para>
|
||
|
Multi-master (HA) clusters are not supported by the easyCerts module.
|
||
|
</para>
|
||
|
</note>
|
||
|
<para>
|
||
|
In order to interact with an RBAC-enabled cluster as an administrator, one
|
||
|
needs to have cluster-admin privileges. By default, when easyCerts is
|
||
|
enabled, a cluster-admin kubeconfig file is generated and linked into
|
||
|
<literal>/etc/kubernetes/cluster-admin.kubeconfig</literal> as determined by
|
||
|
<xref linkend="opt-services.kubernetes.pki.etcClusterAdminKubeconfig"/>.
|
||
|
<literal>export KUBECONFIG=/etc/kubernetes/cluster-admin.kubeconfig</literal>
|
||
|
will make kubectl use this kubeconfig to access and authenticate the cluster.
|
||
|
The cluster-admin kubeconfig references an auto-generated keypair owned by
|
||
|
root. Thus, only root on the kubernetes master may obtain cluster-admin
|
||
|
rights by means of this file.
|
||
|
</para>
|
||
|
</chapter>
|