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 :
- Les binaires des composants.
- Les images conteneurs requises.
- 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.