技術共有

Yiwen は Helm を使用して Rancher 高可用性クラスターをデプロイする方法を学びます

2024-07-12

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

Rancher クラスタのアーキテクチャ図

Helm は Rancher 高可用性クラスターをデプロイします

ヘルムの概要

Helm は、Kubernetes アプリケーションのデプロイと管理を簡素化するために使用される、Kubernetes 用のパッケージ管理ツールです。 Helm は CentOS の yum ツールと比較できます。 Helm には次の基本概念があります。

チャート: これは Helm によって管理されるインストール パッケージであり、デプロイする必要があるインストール パッケージ リソースが含まれています。チャートは、CentOS yum で使用される rpm ファイルと比較できます。

リリース: チャートのデプロイメント インスタンスです。チャートは Kubernetes クラスター上に複数のリリースを持つことができます。つまり、チャートは複数回インストールできます。

リポジトリ: グラフの公開と保存に使用されるグラフ ウェアハウス

ダウンロード:https://github.com/helm/helm/releases

ポッドのステータスを確認する

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

これを削除する場合は、まずデプロイメントを見つけてから削除します。

  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

ポッドを詳細に表示したい場合は、次のように記述できます。

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

Helm3 のインストール

最新の安定バージョン: v3.9.2

ダウンロード

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

インストール

  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

公式ドキュメントを確認してください。

Helm | ドキュメント

ヘルム | クイック スタート ガイド

チャートウェアハウスを追加する

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

インストール可能なチャートのリストを表示する

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

インストールチャートの例

  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"

上記の例では、チャート bitnami/mysql が mysql-1659686641 という名前で公開されています。すべてのポッドをリストすると、さらに多くの mysql ポッドがあることがわかります。

helm show chart bitnami/mysql コマンドを実行すると、このチャートの基本情報を簡単に確認できます。 または、helm show all bitnami/mysql を実行して、チャートに関するすべての情報を取得できます。

helm install を実行するたびに、新しいリリース バージョンが作成されます。 したがって、チャートは同じクラスター内に複数回インストールでき、それぞれを個別に管理およびアップグレードできます。

Helm の使用方法の詳細については、次を参照してください。詳しくはこちら

Helm を使用すると、どのチャートが公開されているかを簡単に確認できます

  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

バージョンをアンインストールする

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

このコマンドは、Kubernetes から mysql-1659686641 をアンインストールし、このバージョンに関連するすべてのリソース (サービス、デプロイメント、ポッドなど)、さらにはバージョン履歴も削除します。

helm のアンインストールを実行するときに --keep-history オプションを指定すると、Helm はバージョン履歴を保存します。 このバージョンに関する情報は、次のコマンドで表示できます。

helm status mysql-1659686641

ヘルムヘルプドキュメント

helm get -h

ヘルム検索

  • ヘルム検索ハブからアーティファクトハブ で Helm チャートを検索してリストします。 Artifact Hub にはさまざまなリポジトリが保存されています。

  • helm search リポジトリは、(helm repo add を使用して) ローカル helm クライアントに追加したリポジトリから検索します。このコマンドはローカル データに基づいて検索するため、インターネット接続は必要ありません。

新しい helm パッケージをインストールするには、helm install コマンドを使用します。最も簡単な使用方法では、指定したリリース名とインストールするチャートの名前という 2 つのパラメーターを渡すだけです。

helm install happy-panda bitnami/wordpress

Helm3 は rancher をインストールします (自己署名証明書方式)

1. チャート倉庫のアドレスを追加します

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

2. 定義証明書の生成

参考のために:自己署名SSL証明書を生成する

ワンクリック証明書生成スクリプト、Rancher 公式、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

埋め込む

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

生成されたファイルは以下の通り

3. シークレット名前空間を作成する

kubectl create namespace cattle-system

4. サービス証明書と秘密鍵の暗号文

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

証明書を置き換える必要がある場合は、次を使用できますkubectl -n cattle-system delete secret tls-rancher-ingress削除するtls-rancher-ingress暗号文を作成し、上記のコマンドを使用して新しい暗号文を作成します。プライベート CA によって署名された証明書を使用している場合、現在の証明書と同じ CA によって署名されている場合にのみ、新しい証明書を置き換えることができます。

5.ca証明書の暗号文

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

6. インストールランチャーを実行します。

  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. ステータスを確認し、すべてのノードの準備が完了するまで待ちます。

  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

Rancher のポッドの準備ができたら、ブラウザ経由でポッドのステータスを確認します: rancher.k8s-test.com。このドメイン名は負荷分散ノードにマッピングできます。上記のインストールでは、デフォルトですべての動作ノードでポッドが開始されるためです。したがって、以下の nginx は 3 つのノードのポート 80 と 443 を構成します。

  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

上記のホスト名は負荷分散ノードに解決できます。これは通常、keepalived によって仮想化された VIP です。便宜上、ここでは LB ノードを 1 つだけ使用し、24 に直接解決され、24 の nginx を通じて負荷分散が行われます。

トラブルシューティング

ランチャーポッドのログを表示する

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

負荷分散を構成する

24 負荷分散ノード上で構成し、スクリプトによって生成された証明書を 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. }

アクセス:https://rancher.k8s-test.com

ブートストラップのパスワードは admin、ログイン アカウントは admin、パスワードにはランダム コードを使用します: 1BgV0yLx19YkIhOv

「続行」をクリックして管理ページに入ります。

helm3 は rancher をインストールします (rancher には独自の証明書マネージャーが付属しています)

前の前提条件を参照し、rke を介して k8s クラスターをインストールし、helm 環境を準備します。

1. ヘルム倉庫を追加する

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

2. ネームスペースを作成する

kubectl create namespace cattle-system

3. 証明書管理用に Rancher が生成した TLS 証明書方法を選択します。

4. cert-manager をインストールします。インストールは、Rancher によって生成された TLS 証明書方法を選択した場合にのみ必要です。

  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

cert-manager が正しくインストールされていることを確認します

kubectl get pods --namespace cert-manager

5. rancher をインストールし、ホスト名に偽のドメイン名を使用すると、rancher は IP を公開します。

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

6. ロールアウトが成功するまで待ちます

  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

成功したら、テストのためにドメイン名 rancher.my.org を 3 つのノードにマッピングするだけで、ページが正常に表示され、インストールが正常に完了したことがわかります。後で必要なのは、負荷分散統合入口を構成することだけです。以下のページをご覧いただくと、現状のインストールで問題がないことがわかります。ドメイン名でのアクセスのみとなり、IPアクセスでは正常にページを閲覧することができませんのでご注意ください。

負荷分散ポータルの構成

すべてのノードが Rancher にアクセスできることを手動でテストした後、nginx ロード バランシングを構成する必要があります。証明書を構成する必要がないように、4 層の転送を直接構成できます。

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

クライアントの hosts ファイルを構成すると、テストに合格し、nginx LB ポータルにアクセスするときに Rancher に正常にアクセスできるようになります。