Compartir tecnología

Yiwen aprende a usar Helm para implementar el clúster de alta disponibilidad Rancher

2024-07-12

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

diagrama de arquitectura del grupo de ganaderos

Helm implementa un clúster de alta disponibilidad ranchero

Introducción a timón

Helm es una herramienta de administración de paquetes para Kubernetes, que se utiliza para simplificar la implementación y administración de aplicaciones de Kubernetes. Helm se puede comparar con la herramienta yum de CentOS. Helm tiene los siguientes conceptos básicos:

Gráfico: Es un paquete de instalación administrado por Helm, que contiene los recursos del paquete de instalación que deben implementarse. El gráfico se puede comparar con el archivo rpm utilizado por CentOS yum.

Versión: es la instancia de implementación del gráfico. Un gráfico puede tener varias versiones en un clúster de Kubernetes, es decir, el gráfico se puede instalar varias veces.

Repositorio: almacén de gráficos, utilizado para publicar y almacenar gráficos.

descargar:https://github.com/helm/helm/releases

Verificar el estado de las vainas

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

Si desea eliminarlo, primero busque la implementación y luego elimínela.

  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 desea ver un pod en detalle, puede describir

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

instalación de helm3

Última versión estable: v3.9.2

descargar

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

Instalar

  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

Consulte la documentación oficial:

Timón | Documentos

Timón | Guía de inicio rápido

Agregar un almacén de gráficos

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

Ver la lista de gráficos instalables

  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...

Instalar ejemplo de gráfico

  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"

En el ejemplo anterior, se publica el gráfico bitnami/mysql y su nombre es mysql-1659686641. Cuando enumeremos todos los pods, encontraremos que hay más pods de mysql.

Simplemente puede obtener la información básica de este gráfico ejecutando el comando helm show chart bitnami/mysql. O puede ejecutar helm show all bitnami/mysql para obtener toda la información sobre el gráfico.

Cada vez que ejecuta helm install, se crea una nueva versión de lanzamiento. Por lo tanto, un gráfico se puede instalar varias veces en el mismo clúster y cada uno se puede administrar y actualizar de forma independiente.

Para obtener más información sobre cómo utilizar helm, consulte:https://helm.sh/zh/docs/intro/utilizando_helm/

Con Helm puedes ver fácilmente qué gráficos se han publicado

  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

Desinstalar una versión

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

Este comando desinstalará mysql-1659686641 de Kubernetes. Eliminará todos los recursos relacionados (servicio, implementación, pod, etc.) relacionados con esta versión e incluso el historial de versiones.

Si proporciona la opción --keep-history al ejecutar la desinstalación de helm, Helm guardará el historial de versiones. Puede ver información sobre esta versión a través del comando

helm status mysql-1659686641

documentación de ayuda del timón

helm get -h

búsqueda de timón

  • centro de búsqueda de timón desdeCentro de artefactos Busque y enumere cartas de timón en . Hay muchos repositorios diferentes almacenados en Artifact Hub.

  • helm search repo busca en los repositorios que agregó (usando helm repo add) a su cliente de helm local. Este comando busca basándose en datos locales y no requiere conexión a Internet.

Utilice el comando helm install para instalar un nuevo paquete de helm. El método de uso más simple solo requiere pasar dos parámetros: el nombre de la versión que nombró y el nombre del gráfico que desea instalar.

helm install happy-panda bitnami/wordpress

Helm3 instala Rancher (método de certificado autofirmado)

1. Agregar la dirección del almacén de Chart

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

2. Generar certificado de definición.

Para referencia:Generar certificado SSL autofirmado

Script de generación de certificados con un solo clic, oficial de ranchero, guardar como 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

implementar

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

El archivo generado es el siguiente

3. Crear un espacio de nombres secreto

kubectl create namespace cattle-system

4. Certificado de servicio y texto cifrado de clave privada.

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

Si necesita reemplazar el certificado, puede usarkubectl -n cattle-system delete secret tls-rancher-ingressborrartls-rancher-ingress texto cifrado y luego use el comando anterior para crear un nuevo texto cifrado. Si está utilizando un certificado firmado por una CA privada, puede reemplazar el nuevo certificado solo si está firmado por la misma CA que el certificado actual.

Texto cifrado del certificado 5.ca

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

6. Ejecutar la instalación ranchera.

  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. Verifique el estado y espere a que la implementación se realice correctamente y todos los nodos estén listos.

  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

Verifique el estado del pod. Cuando el pod del ranchero esté listo, podrá acceder a él a través del navegador: rancher.k8s-test.com. Este nombre de dominio se puede asignar al nodo de equilibrio de carga. Porque la instalación anterior inicia un pod en todos los nodos en funcionamiento de forma predeterminada. Entonces, a continuación, nginx configura los puertos 80 y 443 de tres nodos.

  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

El nombre de host anterior se puede resolver en el nodo de equilibrio de carga, que generalmente es un VIP virtualizado a través de keepalived. Por conveniencia, aquí solo se usa un nodo LB, que se resuelve directamente en 24, y luego el equilibrio de carga se realiza a través de nginx de 24.

solución de problemas

Ver los registros del grupo de rancheros

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

Configurar el equilibrio de carga

Simplemente configúrelo en el nodo de equilibrio de carga 24 y copie el certificado generado por el script a 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. }

acceso:https://rancher.k8s-test.com

La contraseña de Bootstrap es admin, la cuenta de inicio de sesión es admin, use un código aleatorio para la contraseña: 1BgV0yLx19YkIhOv

Haga clic en continuar para ingresar a la página de administración.

helm3 instala rancher (rancher viene con su propio administrador de certificados)

Consulte los requisitos previos anteriores, instale el clúster k8s a través de rke y prepare el entorno de helm.

1. Agregar almacén de timón

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

2. Crea un espacio de nombres

kubectl create namespace cattle-system

3. Seleccione el método de certificado TLS generado por Rancher para la gestión de certificados.

4. Instale cert-manager. La instalación solo es necesaria si selecciona el método de certificado TLS generado por 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

Verifique que cert-manager esté instalado correctamente

kubectl get pods --namespace cert-manager

5. Instale rancher y use un nombre de dominio falso como nombre de host, para que rancher exponga la IP.

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

6. Espere a que la implementación sea exitosa

  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

Después del éxito, simplemente asigne el nombre de dominio rancher.my.org a tres nodos para realizar pruebas. Después de ver la página con éxito, se muestra que la instalación está bien. Posteriormente, solo necesitará configurar la entrada unificada de equilibrio de carga. Después de ver la siguiente página, se demuestra que no hay ningún problema con la instalación actual. Tenga en cuenta que el nombre de dominio solo se puede utilizar para el acceso y la página no se puede ver normalmente a través del acceso IP.

Configurar el portal de equilibrio de carga

Después de probar manualmente que todos los nodos pueden acceder a Rancher, debe configurar el equilibrio de carga de nginx. Puede configurar directamente el reenvío de cuatro capas, de modo que no sea necesario configurar un certificado.

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. }

Configure el archivo de hosts del cliente, la prueba pasa y se puede acceder al ranchero normalmente al acceder al portal nginx LB.