Partage de technologie

Yiwen apprend à utiliser Helm pour déployer le cluster haute disponibilité Rancher

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

diagramme d'architecture de cluster d'éleveur

Helm déploie un cluster haute disponibilité pour les ranchers

Introduction à Helm

Helm est un outil de gestion de packages pour Kubernetes, utilisé pour simplifier le déploiement et la gestion des applications Kubernetes. Helm peut être comparé à l'outil yum de CentOS. Helm a les concepts de base suivants :

Graphique : Il s'agit d'un package d'installation géré par Helm, qui contient les ressources du package d'installation qui doivent être déployées. Le graphique peut être comparé au fichier rpm utilisé par CentOS yum.

Release : il s'agit de l'instance de déploiement du graphique. Un graphique peut avoir plusieurs versions sur un cluster Kubernetes, c'est-à-dire que le graphique peut être installé plusieurs fois.

Référentiel : entrepôt de graphiques, utilisé pour publier et stocker des graphiques

télécharger:https://github.com/helm/helm/releases

Vérifier l'état des pods

  1. kubectl get pods --namespace=kube-system
  2. kubectl get pods --all-namespaces

Si vous souhaitez le supprimer, recherchez d'abord le déploiement, puis supprimez-le.

  1. kangming@ubuntu26:~$ kubectl get deployment --namespace=kube-system
  2. NAMEREADY UP-TO-DATE AVAILABLE AGE
  3. calico-kube-controllers 1/1 11 4h23m
  4. coredns 2/2 22 4h22m
  5. coredns-autoscaler1/1 11 4h22m
  6. metrics-server1/1 11 4h18m
  7. tiller-deploy 0/1 10 4h15m
  8. kangming@ubuntu26:~$ kubectl delete deployment tiller-deploy --namespace=kube-system
  9. deployment.apps "tiller-deploy" deleted

Si vous souhaitez visualiser un pod en détail, vous pouvez décrire

kubectl describe pod rke-coredns-addon-deploy-job-qz8v6--namespace=kube-system

installation de Helm3

Dernière version stable : v3.9.2

télécharger

https://get.helm.sh/helm-v3.9.2-linux-amd64.tar.gz

Installer

  1. tar -zxvf helm-v3.9.2-linux-amd64.tar.gz
  2. sudo mv linux-amd64/helm /usr/local/bin/helm 
  3. sudo chmod +/usr/local/bin/helm

Consultez la documentation officielle :

Casque | Documents

Casque | Guide de démarrage rapide

Ajouter un entrepôt de graphiques

helm repo add bitnami https://charts.bitnami.com/bitnami

Afficher la liste des cartes installables

  1. kangming@ubuntu26:~/rancher$ helm search repo bitnami
  2. NAMECHART VERSION APP VERSION DESCRIPTION
  3. bitnami/airflow 13.0.22.3.3 Apache Airflow is a tool to express and execute...
  4. bitnami/apache9.1.162.4.54Apache HTTP Server is an open-source HTTP serve...
  5. bitnami/argo-cd 4.0.6 2.4.8 Argo CD is a continuous delivery tool for Kuber...
  6. bitnami/argo-workflows2.3.8 3.3.8 Argo Workflows is meant to orchestrate Kubernet...

Exemple de graphique d'installation

  1. ##确定我们可以拿到最新的charts列表
  2. helm repo update
  3. #安装一个mysql的chat示例
  4. helm install bitnami/mysql --generate-name
  5. NAME: mysql-1659686641
  6. LAST DEPLOYED: Fri Aug5 16:04:04 2022
  7. NAMESPACE: default
  8. STATUS: deployed
  9. REVISION: 1
  10. TEST SUITE: None
  11. NOTES:
  12. CHART NAME: mysql
  13. CHART VERSION: 9.2.5
  14. APP VERSION: 8.0.30
  15. ** Please be patient while the chart is being deployed **
  16. Tip:
  17. Watch the deployment status using the command: kubectl get pods -w --namespace default
  18. Services:
  19. echo Primary: mysql-1659686641.default.svc.cluster.local:3306
  20. Execute the following to get the administrator credentials:
  21. echo Username: root
  22. MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql-1659686641 -o jsonpath="{.data.mysql-root-password}" | base64 -d)
  23. To connect to your database:
  24. 1Run a pod that you can use as a client:
  25. kubectl run mysql-1659686641-client --rm --tty -i --restart='Never' --imagedocker.io/bitnami/mysql:8.0.30-debian-11-r4 --namespace default --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash
  26. 2To connect to primary service (read/write):
  27. mysql -h mysql-1659686641.default.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"

Dans l'exemple ci-dessus, le graphique bitnami/mysql est publié sous le nom mysql-1659686641. Lorsque nous répertorions tous les pods, nous constaterons qu'il y a plus de pods MySQL.

Vous pouvez simplement apprendre les informations de base de ce graphique en exécutant la commande helm show chart bitnami/mysql. Ou vous pouvez exécuter helm show all bitnami/mysql pour obtenir toutes les informations sur le graphique.

Chaque fois que vous exécutez helm install, une nouvelle version est créée. Par conséquent, une carte peut être installée plusieurs fois dans le même cluster, et chacune peut être gérée et mise à niveau indépendamment.

Pour plus d’informations sur l’utilisation de Helm, consultez :https://helm.sh/zh/docs/intro/utilisation_de_helm/

Avec Helm, vous pouvez facilement voir quels graphiques ont été publiés

  1. kangming@ubuntu26:~/rancher$ helm list
  2. NAMENAMESPACE REVISIONUPDATED STATUSCHART APP VERSION
  3. mysql-1659686641default 1 2022-08-05 16:04:04.411386078 +0800 CST deployedmysql-9.2.5 8.0.30

Désinstaller une version

  1. kangming@ubuntu26:~/rancherhelm uninstall mysql-1659686641
  2. release "mysql-1659686641" uninstalled

Cette commande désinstallera mysql-1659686641 de Kubernetes. Elle supprimera toutes les ressources associées (service, déploiement, pod, etc.) liées à cette version et même l'historique des versions.

Si vous fournissez l'option --keep-history lors de l'exécution de la désinstallation de helm, Helm enregistrera l'historique des versions. Vous pouvez afficher des informations sur cette version via la commande

helm status mysql-1659686641

documentation d'aide sur la barre

helm get -h

recherche de barre

  • centre de recherche de barre deCentre d'artefacts Recherchez et répertoriez les graphiques de barre au format . Il existe de nombreux référentiels différents stockés dans Artifact Hub.

  • helm search repo recherche à partir des référentiels que vous avez ajoutés (à l'aide de helm repo add) à votre client helm local. Cette commande effectue une recherche basée sur des données locales et ne nécessite pas de connexion Internet.

Utilisez la commande helm install pour installer un nouveau package helm. La méthode d'utilisation la plus simple nécessite uniquement de transmettre deux paramètres : le nom de la version que vous avez nommée et le nom de la carte que vous souhaitez installer.

helm install happy-panda bitnami/wordpress

Helm3 installe Rancher (méthode de certificat auto-signé)

1. Ajouter l'adresse de l'entrepôt Chart

helm repo add rancher-latest 
https://releases.rancher.com/server-charts/latest

2. Générer un certificat de définition

Pour référence:Générer un certificat SSL auto-signé

Script de génération de certificat en un clic, responsable de l'éleveur, enregistrer sous key.sh

  1. #!/bin/bash -e
  2. help ()
  3. {
  4. echo' ================================================================ '
  5. echo' --ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为www.rancher.local,如果是ip访问服务,则可忽略;'
  6. echo' --ssl-trusted-ip: 一般ssl证书只信任域名的访问请求,有时候需要使用ip去访问server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开;'
  7. echo' --ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(SSL_TRUSTED_DOMAIN),多个扩展域名用逗号隔开;'
  8. echo' --ssl-size: ssl加密位数,默认2048;'
  9. echo' --ssl-cn: 国家代码(2个字母的代号),默认CN;'
  10. echo' 使用示例:'
  11. echo' ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com  '
  12. echo' --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650'
  13. echo' ================================================================'
  14. }
  15. case "$1" in
  16. -h|--helphelpexit;;
  17. esac
  18. if [[ $1 == '' ]];then
  19. help;
  20. exit;
  21. fi
  22. CMDOPTS="$*"
  23. for OPTS in $CMDOPTS;
  24. do
  25. key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
  26. value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
  27. case "$key" in
  28. --ssl-domain) SSL_DOMAIN=$value ;;
  29. --ssl-trusted-ip) SSL_TRUSTED_IP=$value ;;
  30. --ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;;
  31. --ssl-size) SSL_SIZE=$value ;;
  32. --ssl-date) SSL_DATE=$value ;;
  33. --ca-date) CA_DATE=$value ;;
  34. --ssl-cn) CN=$value ;;
  35. esac
  36. done
  37. # CA相关配置
  38. CA_DATE=${CA_DATE:-3650}
  39. CA_KEY=${CA_KEY:-cakey.pem}
  40. CA_CERT=${CA_CERT:-cacerts.pem}
  41. CA_DOMAIN=cattle-ca
  42. # ssl相关配置
  43. SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
  44. SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'}
  45. SSL_DATE=${SSL_DATE:-3650}
  46. SSL_SIZE=${SSL_SIZE:-2048}
  47. ## 国家代码(2个字母的代号),默认CN;
  48. CN=${CN:-CN}
  49. SSL_KEY=$SSL_DOMAIN.key
  50. SSL_CSR=$SSL_DOMAIN.csr
  51. SSL_CERT=$SSL_DOMAIN.crt
  52. echo -e "033[32m ---------------------------- 033[0m"
  53. echo -e "033[32m | 生成 SSL Cert | 033[0m"
  54. echo -e "033[32m ---------------------------- 033[0m"
  55. if [[ -e ./${CA_KEY} ]]; then
  56. echo -e "033[32m ====> 1. 发现已存在CA私钥,备份"${CA_KEY}"为"${CA_KEY}"-bak,然后重新创建 033[0m"
  57. mv ${CA_KEY} "${CA_KEY}"-bak
  58. openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
  59. else
  60. echo -e "033[32m ====> 1. 生成新的CA私钥 ${CA_KEY} 033[0m"
  61. openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
  62. fi
  63. if [[ -e ./${CA_CERT} ]]; then
  64. echo -e "033[32m ====> 2. 发现已存在CA证书,先备份"${CA_CERT}"为"${CA_CERT}"-bak,然后重新创建 033[0m"
  65. mv ${CA_CERT} "${CA_CERT}"-bak
  66. openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
  67. else
  68. echo -e "033[32m ====> 2. 生成新的CA证书 ${CA_CERT} 033[0m"
  69. openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
  70. fi
  71. echo -e "033[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} 033[0m"
  72. cat > ${SSL_CONFIG} <<EOM
  73. [req]
  74. req_extensions = v3_req
  75. distinguished_name = req_distinguished_name
  76. [req_distinguished_name]
  77. [ v3_req ]
  78. basicConstraints = CA:FALSE
  79. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  80. extendedKeyUsage = clientAuth, serverAuth
  81. EOM
  82. if [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} || -n ${SSL_DOMAIN} ]]; then
  83. cat >> ${SSL_CONFIG} <<EOM
  84. subjectAltName = @alt_names
  85. [alt_names]
  86. EOM
  87. IFS=","
  88. dns=(${SSL_TRUSTED_DOMAIN})
  89. dns+=(${SSL_DOMAIN})
  90. for i in "${!dns[@]}"do
  91. echo DNS.$((i+1)) = ${dns[$i]} >> ${SSL_CONFIG}
  92. done
  93. if [[ -n ${SSL_TRUSTED_IP} ]]; then
  94. ip=(${SSL_TRUSTED_IP})
  95. for i in "${!ip[@]}"do
  96. echo IP.$((i+1)) = ${ip[$i]} >> ${SSL_CONFIG}
  97. done
  98. fi
  99. fi
  100. echo -e "033[32m ====> 4. 生成服务SSL KEY ${SSL_KEY} 033[0m"
  101. openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}
  102. echo -e "033[32m ====> 5. 生成服务SSL CSR ${SSL_CSR} 033[0m"
  103. openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}
  104. echo -e "033[32m ====> 6. 生成服务SSL CERT ${SSL_CERT} 033[0m"
  105. openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} 
  106. -CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} 
  107. -days ${SSL_DATE} -extensions v3_req 
  108. -extfile ${SSL_CONFIG}
  109. echo -e "033[32m ====> 7. 证书制作完成 033[0m"
  110. echo
  111. echo -e "033[32m ====> 8. 以YAML格式输出结果 033[0m"
  112. echo "----------------------------------------------------------"
  113. echo "ca_key: |"
  114. cat $CA_KEY | sed 's/^//'
  115. echo
  116. echo "ca_cert: |"
  117. cat $CA_CERT | sed 's/^//'
  118. echo
  119. echo "ssl_key: |"
  120. cat $SSL_KEY | sed 's/^//'
  121. echo
  122. echo "ssl_csr: |"
  123. cat $SSL_CSR | sed 's/^//'
  124. echo
  125. echo "ssl_cert: |"
  126. cat $SSL_CERT | sed 's/^//'
  127. echo
  128. echo -e "033[32m ====> 9. 附加CA证书到Cert文件 033[0m"
  129. cat ${CA_CERT} >> ${SSL_CERT}
  130. echo "ssl_cert: |"
  131. cat $SSL_CERT | sed 's/^//'
  132. echo
  133. echo -e "033[32m ====> 10. 重命名服务证书 033[0m"
  134. echo "cp ${SSL_DOMAIN}.key tls.key"
  135. cp ${SSL_DOMAIN}.key tls.key
  136. echo "cp ${SSL_DOMAIN}.crt tls.crt"
  137. cp ${SSL_DOMAIN}.crt tls.crt

mettre en œuvre

bash ./key.sh --ssl-domain=rancher.k8s-test.com--ssl-size=2048 --ssl-date=3650

Le fichier généré est le suivant

3. Créez un espace de noms secret

kubectl create namespace cattle-system

4. Certificat de service et texte chiffré de clé privée

  1. kubectl -n cattle-system create secret tls tls-rancher-ingress 
  2. --cert=tls.crt 
  3. --key=tls.key

Si vous devez remplacer le certificat, vous pouvez utiliserkubectl -n cattle-system delete secret tls-rancher-ingresssupprimertls-rancher-ingress texte chiffré, puis utilisez la commande ci-dessus pour créer un nouveau texte chiffré. Si vous utilisez un certificat signé par une autorité de certification privée, vous pouvez remplacer le nouveau certificat uniquement s'il est signé par la même autorité de certification que le certificat actuel.

Texte chiffré du certificat 5.ca

  1. kubectl -n cattle-system create secret generic tls-ca 
  2. --from-file=cacerts.pem=./cacerts.pem

6. Exécutez le rancher d'installation

  1. helm install rancher rancher-latest/rancher 
  2. --namespace cattle-system 
  3. --set hostname=rancher.k8s-test.com 
  4. --set bootstrapPassword=admin 
  5. --set ingress.tls.source=secret 
  6. --set privateCA=true

7. Vérifiez l'état et attendez que le déploiement réussisse et que tous les nœuds soient prêts.

  1. kangming@ubuntu26:~$ kubectl -n cattle-system rollout status deploy/rancher
  2. deployment "rancher" successfully rolled out
  3. kangming@ubuntu26:~$ kubectl -n cattle-system get deploy rancher
  4. NAMEREADY UP-TO-DATE AVAILABLE AGE
  5. rancher 3/3 33 40m

Vérifiez l'état du pod lorsque le pod du rancher est prêt, vous pouvez y accéder via le navigateur : rancher.k8s-test.com. Ce nom de domaine peut être mappé au nœud d'équilibrage de charge. Parce que l'installation ci-dessus démarre par défaut un pod sur tous les nœuds de travail. Ainsi, ci-dessous, nginx configure les ports 80 et 443 de trois nœuds.

  1. kubectl get pods --all-namespaces
  2. 或者
  3. kubectl get pods -n cattle-system
  4. #查看rancher pod状态
  5. kubectl describe podrancher-ff955865-29ljr --namespace=cattle-system
  6. #一次看所有rancher pod
  7. kubectl -n cattle-system describe pods -l app=rancher

Le nom d'hôte ci-dessus peut être résolu en nœud d'équilibrage de charge, qui est généralement un VIP virtualisé par keepalived, pour plus de commodité, un seul nœud LB est utilisé ici, qui est directement résolu en 24, puis l'équilibrage de charge est effectué via nginx de 24.

dépannage

Afficher les journaux du module Rancher

  1. kubectl get pods -n cattle-system
  2. kubectl -n cattle-system logs -f rancher-5d9699f4cf-72wgp

Configurer l'équilibrage de charge

Configurez-le simplement sur le nœud d'équilibrage de charge 24 et copiez le certificat généré par le script sur 24

sudo vi /etc/nginx/nignx.conf

  1. stream {
  2. upstream rancher_servers_http {
  3. least_conn;
  4. server 192.168.43.26:80 max_fails=3 fail_timeout=5s;
  5. server 192.168.43.27:80 max_fails=3 fail_timeout=5s;
  6. server 192.168.43.28:80 max_fails=3 fail_timeout=5s;
  7. }
  8. server {
  9. listen 80;
  10. proxy_pass rancher_servers_http;
  11. }
  12. upstream rancher_servers_https {
  13. least_conn;
  14. server 192.168.43.26:443 max_fails=3 fail_timeout=5s;
  15. server 192.168.43.27:443 max_fails=3 fail_timeout=5s;
  16. server 192.168.43.28:443 max_fails=3 fail_timeout=5s;
  17. }
  18. server {
  19. listen 443;
  20. proxy_pass rancher_servers_https;
  21. }
  22. }

accéder:https://rancher.k8s-test.com

Le mot de passe Bootstrap est administrateur, le compte de connexion est administrateur, utilisez un code aléatoire pour le mot de passe : 1BgV0yLx19YkIhOv

Cliquez sur Continuer pour accéder à la page de gestion.

helm3 installe rancher (rancher est livré avec son propre gestionnaire de certificats)

Reportez-vous aux prérequis précédents, installez le cluster k8s via rke et préparez l'environnement helm.

1. Ajouter un entrepôt de barre

  1. helm repo add rancher-latest 
  2. https://releases.rancher.com/server-charts/latest

2. Créez un espace de noms

kubectl create namespace cattle-system

3. Sélectionnez la méthode de certificat TLS généré par Rancher pour la gestion des certificats.

4. Installez cert-manager L'installation n'est requise que si vous sélectionnez la méthode de certificat TLS généré par Rancher.

  1. If you have installed the CRDs manually instead of with the `--set installCRDs=true` option added to your Helm install command, you should upgrade your CRD resources before upgrading the Helm chart:
  2. kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.crds.yaml
  3. Add the Jetstack Helm repository
  4. helm repo add jetstack https://charts.jetstack.io
  5. # Update your local Helm chart repository cache
  6. helm repo update
  7. # Install the cert-manager Helm chart
  8. helm install cert-manager jetstack/cert-manager 
  9. --namespace cert-manager 
  10. --create-namespace 
  11. --version v1.7.1

Vérifiez que cert-manager est correctement installé

kubectl get pods --namespace cert-manager

5. Installez Rancher et utilisez un faux nom de domaine pour le nom d'hôte, afin que Rancher expose l'adresse IP.

  1. helm install rancher rancher-latest/rancher 
  2. --namespace cattle-system 
  3. --set hostname=rancher.my.org 
  4. --set bootstrapPassword=admin

6. Attendez que le déploiement réussisse

  1. kangming@ubuntu26:~$ kubectl -n cattle-system rollout status deploy/rancher
  2. deployment "rancher" successfully rolled out
  3. kangming@ubuntu26:~$ kubectl -n cattle-system get deploy rancher
  4. NAMEREADY UP-TO-DATE AVAILABLE AGE
  5. rancher 3/3 33 40m

Après succès, mappez simplement le nom de domaine rancher.my.org sur trois nœuds pour le test. Après avoir vu la page avec succès, cela montre que l'installation est OK. Plus tard, il vous suffira de configurer l’entrée unifiée d’équilibrage de charge. Après avoir vu la page suivante, il s'avère qu'il n'y a aucun problème avec l'installation actuelle. Notez que le nom de domaine ne peut être utilisé que pour l'accès et que la page ne peut pas être visualisée normalement via l'accès IP.

Configurer le portail d'équilibrage de charge

Après avoir testé manuellement que tous les nœuds peuvent accéder à Rancher, vous devez configurer l'équilibrage de charge nginx. Vous pouvez directement configurer le transfert à quatre couches. De cette façon, vous n'avez pas besoin de configurer un certificat.

sudo vi /etc/nginx/nignx.conf

  1. stream {
  2. upstream rancher_servers_http {
  3. least_conn;
  4. server 192.168.43.26:80 max_fails=3 fail_timeout=5s;
  5. server 192.168.43.27:80 max_fails=3 fail_timeout=5s;
  6. server 192.168.43.28:80 max_fails=3 fail_timeout=5s;
  7. }
  8. server {
  9. listen 80;
  10. proxy_pass rancher_servers_http;
  11. }
  12. upstream rancher_servers_https {
  13. least_conn;
  14. server 192.168.43.26:443 max_fails=3 fail_timeout=5s;
  15. server 192.168.43.27:443 max_fails=3 fail_timeout=5s;
  16. server 192.168.43.28:443 max_fails=3 fail_timeout=5s;
  17. }
  18. server {
  19. listen 443;
  20. proxy_pass rancher_servers_https;
  21. }
  22. }

Configurez le fichier hosts du client, le test réussit et le rancher est accessible normalement lors de l'accès au portail nginx LB.