Kubernetes the Hard Way

C’est un guide afin de comprendre en détail l’utilisation et le fonctionnement de 1. Kubernetes. Dans le guide, il utilise le cloud de Google, mais je ne suivrai pas ce chemin. Je vais plutôt créer des machines virtuelles dans Hyper-V.

Création des Machines

Puisque je suis ce guide dans Hyper-V, je dois créer mes propres machines. Je vais utiliser NixOS pour installer 1. Kubernetes.

Configuration Nix

La configuration Nix que j’ai utilisé au début est:

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running `nixos-help`).
 
{ config, pkgs, ... }:
let
  # this is to use k8s 1.27.3
  uns_2023-07-29 = import (builtins.fetchTarball {
      url = "https://github.com/NixOS/nixpkgs/archive/50a7139fbd1acd4a3d4cfa695e694c529dd26f3a.tar.gz";
  }) {};
in
{
  imports =
    [ # Include the results of the hardware scan.
      ./hardware-configuration.nix
    ];
 
  boot.loader.grub.enable = true;
  boot.loader.grub.device = "/dev/sda"; # or "nodev" for efi only
 
  networking.hostName = "nixos";
  time.timeZone = "America/Toronto";
 
  users.users.tlepine = {
    isNormalUser = true;
    home = "/home/tlepine";
    extraGroups = ["wheel"];
    shell = pkgs.zsh;
    packages = with pkgs; [
      neovim
      cfssl
    ];
  };
 
  environment.systemPackages = with pkgs; [
    vim
    wget
    containerd
    git
    curl
    uns_2023-07-29.kubernetes # k8s 1.27.3
  ];
 
  programs.zsh.enable = true;
  
  services.openssh.enable = true;
 
  system.stateVersion = "23.05"; # Did you read the comment?
}

Certificats SSL

Le guide nous permet d’apprendre comment déployer notre propre infrastructure PKI. Le wiki de l’outils cfssl donne plus d’information. Dans le guide, il mentionne d’écrire ce fichier:

{
	"CN": "Kubernetes",
	"key": {
		"algo": "rsa",
		"size": 2048
	},
	"names": [{
		"C": "CA",
		"L": "Laval",
		"O": "Kubernetes",
		"OU": "CA",
		"ST": "Quebec"
	}]
}

Ce fichier nous permettra de configurer la demande de certificats du CA. Il faut également écrire la configuration du CA:

{
	"signing": {
		"default": {
			"expiry": "8760h"
		},
		"profiles": {
			"kubernetes": {
				"usages": ["signing", "key encipherment", "server auth", "client auth"],
				"expiry": "8760h"
			}
		}
	}
}

Il faut ensuite générer le certificat pour le CA ainsi que sa clé:

tlepine@nixos:~/k8s-hard/ > cfssl gencert -initca ca-csr.json | cfssljson -bare ca
<...>
tlepine@nixos:~/k8s-hard/ > ls
ca-config.json  ca.csr  ca-csr.json  ca-key.pem  ca.pem

L’utilitaire à créer plusieurs fichier qui sont utilisé pour signé le certificat utilisé par les composants de 1. Kubernetes. Nous pouvons maintenant créer et signer le certificat pour l’administrateur du cluster:

{
	"CN": "admin",
	"key": {
		"algo": "rsa",
		"size": 2048
	},
	"names": [{
		"C": "CA",
		"L": "Laval",
		"O": "Kubernetes",
		"OU": "CA",
		"ST": "Quebec"
	}]
}

Il nous est ensuite possible de générer le certificat avec les informations qu’on à déjà créer:

tlepine@nixos:~/k8s-hard/ > cfssl gencert -ca ca.pem -ca-key ca-key.pem \ 
-config ca-config.json -profile kubernetes \
admin-csr.json | cfssljson -bare admin
<..>
tlepine@nixos:~/k8s-hard/ > ls admin*
admin.csr  admin-csr.json  admin-key.pem  admin.pem

On obtient nos certificats pour l’admin. Maintenant, il faut faire la même chose pour générer les certificats pour kubelet. Je vais montrer l’exemple pour un. Donc on crée un fichier <instance>-csr.json (cp-1-csr.json pour moi) et on ajoute le contenu suivant à l’intérieur:

{
	"CN": "system:node:cp-1",
	"key": {
		"algo": "rsa",
		"size": 2048
	},
	"names": [{
		"C": "CA",
		"L": "Laval",
		"O": "system:nodes",
		"OU": "Kubernetes the Hard Way",
		"ST": "Quebec"
	}]
}

Ensuite, nous devons déterminer notre IP publique et privée. Puisque je fonctionne uniquement avec un IP privée, ce sera le même pour les deux. Ensuite on peut générer le certificat à partir de notre csr. On doit définir un hostname pour chacune des instances. On prend notre IP avec ip a. Ensuite, on réussi à accomplir ceci en faisant:

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json \
	-hostname=cp-1,172.26.66.125,172.26.66.125 -profile=kubernetes \
	cp-1-csr.json | cfssljson -bare cp-1

Bien entendu, le nom d’instance et l’IP utilisé doit être remplacer. Il faut répéter ces étapes pour chaque instance que l’on a. Maintenant, il faut créer le certificat pour kube-controller-manager. Donc on crée un csr dans le fichier kube-controller-manager-csr.json avec le contenu:

{
	"CN": "system:kube-controller-manager",
	"key": {
		"algo": "rsa",
		"size": 2048
	},
	"names": [{
		"C": "CA",
		"L": "Laval",
		"O": "system:kube-controller-manager",
		"OU": "Kubernetes the Hard Way",
		"ST": "Quebec"
	}]
}

On le génère en entrant:

cfssl gencert -ca ca.pem -ca-key ca-key.pem -config ca-config.json \
	-profile kubernetes kube-controller-manager-csr.json | \
	cfssljson -bare kube-controller-manager

Pour le reste de la génération des certificats, se fier sur 04-certificate-authority. Remplacer les hostname ou IP publique avec les bons (ceux locale sur la machine).

Config Utilistateur

Il faut créer les configurations pour chacun des utilisateurs (voir 05-kubernetes-configuration-files). Dit rapidement, il faut créer les configurations pour plusieurs utilisateur qui permette de faire fonctionne le cluster. La liste des utilisateurs est la suivante:

  • system:node:<node_name>
  • system:kube-proxy
  • system:kube-controller-manager
  • system:kube-scheduler
  • admin

Kube-Apiserver

Dans le guide, ils disent de créer le cluster avec l’application binaire de kube-apiserver. Toutefois, les installations plus modernes vont mettre le mettre en place dans un container, qui est manage par Kubernetes lui-même. Il faut donc créer le manifest afin de le déployer correctement.

Références

  1. kubernetes-the-hard-way