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.