Site icon Eolya Consulting

Kubernetes – Installation d’un cluster privé

Kubernetes

Dans cet article, je décris l’installation d’un cluster Kubernetes privé constitué d’un master, de trois workers et d’un poste client d’administration. Le but est de réaliser un déploiement de Solrcloud dans Kubernetes. J’ai choisi une installation totalement autonome plutôt qu’une solution Google (GKE), Amazon (EKS) ou Azure (AKS) afin d’avoir accès aux couches les plus basses et comprendre le partage des ressources (CPU, mémoire, disque). La procédure d’installation se fait au moyen de kubeadm et est bien documentée sur le site kubernates.io et sur de nombreux blogs. Cet article n’a pas vocation à expliquer les concepts de Kubernetes. J’aborderai certains de ces points dans d’autres articles lors du déploiement de Sorlcloud dans le cluster.

Les caractéristiques de l’infrastructure choisie sont :

Le schéma d’architecture correspondant est le suivant. Le client est représenté par kubectl.

Procédure commune au master, aux workers et au client

Les prérequis

192.168.xxx.xx0 k8s-master
192.168.xxx.xx2 k8s-worker-node1
192.168.xxx.xx3 k8s-worker-node2
192.168.xxx.xx4 k8s-worker-node3
# hostnamectl set-hostname 'k8s-master'
# useradd -d /home/k8s k8s
# setenforce 0
# sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
# systemctl stop firewalld
# systemctl disable firewalld
# swapoff -a
# vi /etc/fstab 
--> commenter la ligne correspondant au volume du swap
# yum install dnf
# yum install vim tar unzip nmap telnet wget curl sysstat iotop htop atop lsof procps

Installation de docker-ce (inutile sur le client)

# yum install yum-utils device-mapper-persistent-data lvm2<br>
# dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm<br>
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo<br>

Pour obtenir la liste des versions disponibles à croiser avec la liste des versions compatibles 

# dnf list docker-ce --showduplicates | sort -r<br>

Installation

# dnf install docker-ce-3:18.09.9-3.el7

# mkdir /etc/docker
# cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
EOF
# mkdir -p /etc/systemd/system/docker.service.d
# systemctl restart docker && systemctl enable docker

Installation de Kubeadm

# cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
       https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

# yum install kubeadm
# systemctl restart kubelet && systemctl enable kubelet

Sur le master

# kubeadm init
[init] Using Kubernetes version: v1.16.3
[preflight] Running pre-flight checks
...
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.xxx.xx0:6443 --token uvcu6j.nie40umoqaulqvrv \
    --discovery-token-ca-cert-hash sha256:044157be8ebfbb99045dd393d74f4f3c022bee14e1dadfe

La fin de l’affichage de la commande est importante car elle donne les consignes pour la configuration du compte utilisateur k8s qui doit être utiliser pour toutes les actions d’administration. Elle indique également la procédure de configuration des workers.

# su - k8s
[k8s@k8s-master ~]$ mkdir -p $HOME/.kube
[k8s@k8s-master ~]$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[k8s@k8s-master ~]$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

Un add-on réseau est nécessaire afin que les pods puissent communiquer les uns avec les autres. Il existe plusieurs add-on réseau et j’ai choisi Weave-Net le plus utilisé.

[k8s@k8s-master ~]$ export kubever=$(kubectl version | base64 | tr -d '\n')
[k8s@k8s-master ~]$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created

Sur les workers

La commande à exécuter sur les workers a été fournie en fin d’affichage de la configuration du master avec « kubeadm init ». Si cette commande est perdue, il est possible d’en générer une nouvelle valable une heure.

# kubeadm token create --print-join-command
kubeadm join 192.168.xxx.xx0:6443 --token 7yfu2q.u0zgwabxyy3uawcu --discovery-token-ca-cert-hash sha256:044157be8ebfbb99045dd393d74f4f3c022bee14e1dadfe81213277f1ae647a0
# kubeadm join 192.168.xxx.xx0:6443 --token 7yfu2q.u0zgwabxyy3uawcu --discovery-token-ca-cert-hash sha256:044157be8ebfbb99045dd393d74f4f3c022bee14e1dadfe81213277f1ae647a0
[k8s@k8s-master ~]$ kubectl get nodes
NAME               STATUS   ROLES    AGE     VERSION
k8s-master         Ready    master   19m     v1.16.3
ks8-worker-node1   Ready    <none>   2m7s    v1.16.3
ks8-worker-node2   Ready    <none>   50s     v1.16.3
ks8-worker-node3   Ready    <none>   10s     v1.16.3

Sur le client

Configuration de la connexion au cluster

Le client ne rejoint pas le cluster comme les workers. Il est juste nécessaire de récupérer sur le master les fichiers de configuration afin de pouvoir s’y connecter

# su -k8s
[k8s@k8s-client ~]$ scp -r k8s@k8s-master:/home/k8s/.kube .
[k8s@k8s-client ~]$ kubectl get nodes
NAME               STATUS   ROLES    AGE     VERSION
k8s-master         Ready    master   19m     v1.16.3
ks8-worker-node1   Ready    <none>   2m7s    v1.16.3
ks8-worker-node2   Ready    <none>   50s     v1.16.3
ks8-worker-node3   Ready    <none>   10s     v1.16.3

Installation du dashboard Kubernetes

Les lignes de commandes pour l’administration sont incontournables. Cependant, une interface web pour visualiser l’état du cluster Kubernetes est d’un grand confort.

[k8s@k8s-client ~]$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta6/aio/deploy/recommended.yaml

[k8s@k8s-client ~]$ cat > admin-user.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
EOF

[k8s@k8s-master ~]$ cat > admin-role.yaml <<EOF
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
EOF

[k8s@k8s-client ~]$ kubectl apply -f admin-user.yaml
[k8s@k8s-client ~]$ kubectl apply -f admin-role.yaml

Ce token est nécessaire pour accéder au dashboard.

[k8s@k8s-client ~]$ kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

Name:         admin-user-token-dpz5x
Namespace:    kubernetes-dashboard
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: admin-user
              kubernetes.io/service-account.uid: 1981beff-9d19-49db-81a8-547a608fa610

Type:  kubernetes.io/service-account-token

Data
====
ca.crt:     1025 bytes
namespace:  20 bytes
token:      xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Il faut au préalable sur le master lancer le proxy à l’aide de la commande suinate

[k8s@k8s-master ~]$ kubectl proxy &

Puis, utiliser cette url : http://k8s-master:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/overview?namespace=default

Ci-dessous une copie d’écran du dashboard après avoir installer quelques services dont un ensemble Zookeeper.

Installation d’un pod « Hello-world » de test

A ce stade de l’installation, nous disposons d’un cluster Kubernetes « vide » qui n’héberge pas encore de pod.

[k8s@k8s-client ~]$ kubectl get pod
No ressources found.

Je vous propose de suivre cette procédure afin d’installer un service Apache minimaliste et tester quelques manipulations.

Conclusion

Dans cet article, j’ai décrit l’installation d’un cluster Kubernetes privé qui permettra par la suite d’expérimenter le déploiement et l’administration d’un environnement SolrCloud.

Quitter la version mobile