Déploiement hors-ligne de Kubernetes et Harbor sur plateforme arm64

Introduction

Dans le contexte de la localisation croissante des infrastructures, certaines organisations adoptent des serveurs et systèmes d'exploitation nationaux. Cet article détaille le déploiement hors-ligne de Kubernetes sur des serveurs nationaux (ex. Great Wall) exécutant un OS national (ex. Kylin OS), en ciblant l'architecture arm64. Les packages nécessaires, fichiers de configuration et guides d'installation sont fournis dans le contenu.

Composants installés :

Package Version
docker-ce 19.03.14
kubeadm, kubelet, kubectl v1.19.7
flannel v0.14.0
traefik 2.1.2
kube-dashboard v2.0.5
harbor v1.9.1

Environnement

Spécifications du serveur

Détails du modèle de serveur fournis dans l'article source.

Informations sur le système d'exploitation

Détails de l'OS Kylin.

Planification du déploiement

Nom d'hôte IP Rôle
ctl-master 10.0.1.101 Nœud principal Kubernetes
wrk-node-01 10.0.1.102 Nœud worker Kubernetes - 1
wrk-node-02 10.0.1.103 Nœud worker Kubernetes - 2
registry-srv 10.0.1.104 Dépôt d'images privé (Harbor)

Flux de déploiement

Pour le cluster Kubernetes

  • Installation de docker-ce
  • Installation des paquets Kubernetes (kubeadm, kubelet, kubectl)
  • Initialisation du cluster
  • Ajout des nœuds workers au cluster
  • Déploiement du plugin réseau Flannel
  • Déploiement de l'ingress Traefik
  • Déploiement du tableau de bord kube-dashboard

Pour le dépôt Harbor

  • Installation de docker-ce
  • Installation de docker-compose
  • Configuration du fichier harbor.yml et initialisation

Packages hors-ligne

Les packages listés ci-dessous ont été validés en environnement de test et production. L'archive contient :

  1. Les binaires des composants.
  2. Les images conteneurs requises.
  3. Des guides d'installation détaillés pour chaque composant.

Déploiement de Kubernetes

Initialisation du système

1. Désactiver SELinux et le pare-feu.

# systemctl disable firewalld
# sed -i 's@SELINUX=enforcing@SELINUX=disabled@g' /etc/selinux/config
# reboot

2. Synchroniser l'heure.

# ntpdate tiger.sina.com.cn

3. Configurer les noms d'hôtes.

# cat >> /etc/hosts <<EOF
10.0.1.101 ctl-master
10.0.1.102 wrk-node-01
10.0.1.103 wrk-node-02
10.0.1.104 registry-srv
EOF
# scp /etc/hosts 10.0.1.102:/etc/hosts
# scp /etc/hosts 10.0.1.103:/etc/hosts
# scp /etc/hosts 10.0.1.104:/etc/hosts

4. Ajuster les limites de fichiers et activer le routage IP.

# ulimit -SHn 65535
# echo "ulimit -SHn 65535" >> /etc/rc.local
# chmod +x /etc/rc.local
# sysctl -w net.ipv4.ip_forward=1
# sysctl --system

5. Préparer les packages d'installation hors-ligne.

# unzip arm64-packages.zip
# cd arm64-packages
# ls
docker-ce-19.03-arm64.tar.gz
docker-compose-1.22-arm64.tar.gz
flannel-v0.14.0-arm64.tar.gz
harbor-v1.9.1-arm64.tar.gz
k8s-v1.19.7-arm64.tar.gz
dashboard-v2.0.5-arm64.tar.gz
traefik-2.1.2-arm64.tar.gz

Installation sur le nœud principal (ctl-master)

Installation de Docker

# tar -xf docker-ce-19.03-arm64.tar.gz
# cd docker-ce-19.03
# yum localinstall *.rpm -y
# cp -a docker /etc/
# systemctl enable docker && systemctl start docker
# docker info

Installation des composants Kubernetes

# tar -xf k8s-v1.19.7-arm64.tar.gz
# cd k8s-v1.19.7
# swapoff -a
# sed -i '/swap/ s$^\(.*\)$#\1$g' /etc/fstab
# exit # Reconnexion nécessaire
# yum localinstall *.rpm -y
# kubeadm completion bash > /etc/bash_completion.d/kubeadm
# kubectl completion bash > /etc/bash_completion.d/kubectl

Générer et éditer le fichier de configuration d'initialisation.

# kubeadm config print init-defaults > cluster-init.yaml

Modifier le fichier cluster-init.yaml comme suit :

apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: a1b2c3.d4e5f6a7b8c9d0e1
  ttl: 720h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.0.1.101
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: ctl-master
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: k8s-cluster-local
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.19.0
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16
scheduler: {}

Charger les images requises et initialiser le cluster.

# docker load < k8s-v1.19.0-images.tar.gz
# kubeadm init --config ./cluster-init.yaml
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
# kubectl get nodes
NAME         STATUS     ROLES    AGE   VERSION
ctl-master   NotReady   master   60s   v1.19.7

Installation du plugin réseau Flannel

# tar -xf flannel-v0.14.0-arm64.tar.gz
# cd flannel-v0.14.0
# docker load < flannel-v0.14.0-image.tar.gz
# kubectl apply -f kube-flannel.yml
# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
ctl-master   Ready    master   5m    v1.19.7

Déploiement de l'ingress Traefik

# tar -xf traefik-2.1.2-arm64.tar.gz
# cd traefik-2.1.2
# docker load < traefik-arm64-2.1.2.tar.gz
# kubectl apply -f traefik-crd.yaml
# kubectl apply -f traefik-rbac.yaml
# kubectl apply -f traefik-configmap.yaml
# kubectl apply -f traefik-deployment.yaml
# kubectl apply -f traefik-dashboard-route.yaml
# kubectl get pod -l app.kubernetes.io/name=traefik -o wide

Déploiement du tableau de bord Kubernetes

# tar -xf dashboard-v2.0.5-arm64.tar.gz
# cd dashboard-v2.0.5
# kubectl create namespace kubernetes-dashboard
# mkdir -p /tmp/dash-certs && cd /tmp/dash-certs
# openssl genrsa -out tls.key 2048
# openssl req -new -out tls.csr -key tls.key -subj '/CN=10.0.1.101'
# openssl x509 -days 3650 -req -in tls.csr -signkey tls.key -out tls.crt
# kubectl create secret generic kubernetes-dashboard-certs --from-file=/tmp/dash-certs/ -n kubernetes-dashboard
# docker load < dashboard-v2.0.5-image.tar.gz
# cd ~/arm64-packages/dashboard-v2.0.5
# kubectl apply -f kubernetes-dashboard.yaml
# kubectl get svc -n kubernetes-dashboard
# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin | awk '{print $1}')

L'accès au tableau de bord se fait via https://<IP-Master>:<NodePort>.

Installation sur les nœuds workers

Répéter l'installation de Docker et des composants Kubernetes (kubeadm, kubelet, kubectl) comme sur le nœud principal, mais sans la configuration du fichier d'initialisation.

Importer les images requises à partir du nœud principal :

# Sur ctl-master :
# docker save $(docker images -q) -o k8s-images-all.tar
# scp k8s-images-all.tar wrk-node-01:/root/
# scp k8s-images-all.tar wrk-node-02:/root/

# Sur chaque worker :
# docker load < k8s-images-all.tar

Rejoindre le cluster en utilisant la commande fournie lors de l'initialisation du master :

# kubeadm join 10.0.1.101:6443 --token a1b2c3.d4e5f6a7b8c9d0e1 \
    --discovery-token-ca-cert-hash sha256:7a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2

Vérifier sur le nœud principal :

# kubectl get nodes
NAME          STATUS   ROLES    AGE     VERSION
ctl-master    Ready    master   30m     v1.19.7
wrk-node-01   Ready    <none>   2m      v1.19.7
wrk-node-02   Ready    <none>   90s     v1.19.7

Déploiement de Harbor

Préparation du système

Appliquer les mêmes étapes d'initialisation que pour les nœuds Kubernetes (SELinux, horloge, noms d'hôtes, etc.).

Installation de Docker et Docker Compose

# cd ~/arm64-packages
# tar -xf docker-ce-19.03-arm64.tar.gz && cd docker-ce-19.03
# yum localinstall *.rpm -y
# cp -a docker /etc/
# systemctl enable docker && systemctl start docker
# cd ~/arm64-packages
# tar -xf docker-compose-1.22-arm64.tar.gz && cd docker-compose-1.22
# yum localinstall *.rpm -y
# docker-compose version

Installation de Harbor

# cd ~/arm64-packages
# tar -xf harbor-v1.9.1-arm64.tar.gz && cd harbor-v1.9.1
# vim harbor.yml

Modifier la ligne hostname: 10.0.1.104.

# chmod +x prepare
# ./install.sh
# docker-compose ps

L'interface web de Harbor est accessibel à l'adreses http://10.0.1.104.

Étiquettes: ARM64 kubernetes kubeadm Harbor Kylin OS

Publié le 26 juillet à 17h33