Berbagi teknologi

Yiwen belajar menggunakan Helm untuk menyebarkan cluster ketersediaan tinggi Rancher

2024-07-12

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

diagram arsitektur cluster peternak

Helm menyebarkan kluster ketersediaan tinggi peternak

Pengantar Helm

Helm adalah alat manajemen paket untuk Kubernetes, yang digunakan untuk menyederhanakan penerapan dan pengelolaan aplikasi Kubernetes. Helm dapat dibandingkan dengan alat yum CentOS. Helm memiliki konsep dasar sebagai berikut:

Bagan: Ini adalah paket instalasi yang dikelola oleh Helm, yang berisi sumber daya paket instalasi yang perlu disebarkan. Bagan dapat dibandingkan dengan file rpm yang digunakan oleh CentOS yum.

Rilis: Ini adalah contoh penerapan bagan. Sebuah bagan dapat memiliki beberapa rilis pada kluster Kubernetes, yaitu bagan dapat diinstal beberapa kali.

Repositori: Gudang bagan, digunakan untuk menerbitkan dan menyimpan bagan

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

Periksa status pod

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

Jika Anda ingin menghapusnya, temukan penerapannya terlebih dahulu, lalu hapus.

  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

Jika Anda ingin melihat pod secara detail, Anda dapat menjelaskannya

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

instalasi helm3

Versi stabil terbaru: v3.9.2

unduh

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

Install

  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

Lihat dokumentasi resmi:

Helm | Dokumen

Helm |. Panduan Memulai Cepat

Tambahkan gudang grafik

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

Lihat daftar grafik yang dapat diinstal

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

Instal contoh bagan

  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"

Pada contoh di atas, grafik bitnami/mysql diterbitkan dengan nama mysql-1659686641. Saat kita membuat daftar semua pod, kita akan menemukan bahwa ada lebih banyak pod mysql.

Anda cukup mempelajari informasi dasar bagan ini dengan menjalankan perintah helm show chart bitnami/mysql. Atau Anda dapat menjalankan helm show all bitnami/mysql untuk mendapatkan semua informasi tentang grafik.

Setiap kali Anda menjalankan instalasi helm, versi rilis baru akan dibuat. Oleh karena itu, bagan dapat dipasang beberapa kali dalam klaster yang sama, dan masing-masing bagan dapat dikelola dan ditingkatkan secara independen.

Untuk informasi lebih lanjut tentang cara menggunakan helm, lihat:https://helm.sh/zh/docs/intro/menggunakan_helm/

Dengan Helm Anda dapat dengan mudah melihat grafik mana yang telah dipublikasikan

  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

Copot pemasangan suatu versi

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

Perintah ini akan menghapus mysql-1659686641 dari Kubernetes. Perintah ini akan menghapus semua sumber daya terkait (layanan, penerapan, pod, dll.) yang terkait dengan versi ini dan bahkan riwayat versi.

Jika Anda memberikan opsi --keep-history saat menjalankan helm uninstall, Helm akan menyimpan riwayat versi. Anda dapat melihat informasi tentang versi ini melalui perintah

helm status mysql-1659686641

dokumentasi bantuan helm

helm get -h

pencarian helm

  • hub pencarian helm dariPusat Artefak Temukan dan daftarkan bagan helm di . Ada banyak repositori berbeda yang disimpan di Artifact Hub.

  • helm search repo mencari dari repositori yang Anda tambahkan (menggunakan helm repo add) ke klien helm lokal Anda. Perintah ini mencari berdasarkan data lokal dan tidak memerlukan koneksi Internet.

Gunakan perintah helm install untuk menginstal paket helm baru. Metode penggunaan yang paling sederhana hanya memerlukan penyampaian dua parameter: nama rilis yang Anda beri nama dan nama bagan yang ingin Anda instal.

helm install happy-panda bitnami/wordpress

Helm3 menginstal rancher (metode sertifikat yang ditandatangani sendiri)

1. Tambahkan alamat gudang Bagan

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

2. Hasilkan sertifikat definisi

Sebagai referensi:Hasilkan sertifikat SSL yang ditandatangani sendiri

Skrip pembuatan sertifikat sekali klik, pejabat peternak, simpan sebagai 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

melaksanakan

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

File yang dihasilkan adalah sebagai berikut

3. Buat namespace rahasia

kubectl create namespace cattle-system

4. Sertifikat layanan dan ciphertext kunci pribadi

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

Jika Anda perlu mengganti sertifikat, Anda dapat menggunakankubectl -n cattle-system delete secret tls-rancher-ingressuntuk menghapustls-rancher-ingress ciphertext, lalu gunakan perintah di atas untuk membuat ciphertext baru. Jika Anda menggunakan sertifikat yang ditandatangani oleh CA privat, Anda dapat mengganti sertifikat baru hanya jika sertifikat tersebut ditandatangani oleh CA yang sama dengan sertifikat saat ini.

5.ca teks sandi sertifikat

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

6. Jalankan instalasi peternak

  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. Periksa status dan tunggu hingga peluncuran berhasil. Semua node sudah siap.

  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

Periksa status pod. Jika pod rancher sudah siap, Anda dapat mengaksesnya melalui browser: rancher.k8s-test.com. Nama domain ini dapat dipetakan ke node penyeimbangan beban. Karena instalasi di atas memulai pod pada semua node yang berfungsi secara default. Jadi di bawah ini nginx mengkonfigurasi port 80 dan 443 dari tiga node.

  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

Nama host di atas dapat diselesaikan ke node penyeimbang beban, yang biasanya berupa VIP yang divirtualisasikan dengan keepalive. Untuk kenyamanan, hanya satu node LB yang digunakan di sini, yang langsung diselesaikan ke 24, dan kemudian penyeimbangan beban dilakukan melalui nginx dari 24.

penyelesaian masalah

Lihat log rancher pod

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

Konfigurasikan penyeimbangan beban

Cukup konfigurasikan pada node penyeimbang beban 24 dan salin sertifikat yang dihasilkan oleh skrip ke 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. }

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

Kata sandi bootstrap adalah admin, akun login adalah admin, gunakan kode acak untuk kata sandi: 1BgV0yLx19YkIhOv

Klik lanjutkan untuk masuk ke halaman manajemen.

helm3 menginstal rancher (peternak dilengkapi dengan manajer sertifikatnya sendiri)

Lihat prasyarat sebelumnya, instal cluster k8s melalui rke, dan siapkan lingkungan helm.

1. Tambahkan gudang helm

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

2. Buat ruang nama

kubectl create namespace cattle-system

3. Pilih metode sertifikat TLS yang dihasilkan Rancher untuk manajemen sertifikat.

4. Instal cert-manager. Instalasi hanya diperlukan jika Anda memilih metode sertifikat TLS yang dihasilkan 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

Verifikasi bahwa manajer sertifikat diinstal dengan benar

kubectl get pods --namespace cert-manager

5. Instal rancher dan gunakan nama domain palsu untuk nama host, sehingga rancher akan mengekspos IP tersebut.

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

6. Tunggu hingga peluncuran berhasil

  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

Setelah berhasil, petakan saja nama domain rancher.my.org ke tiga node untuk pengujian. Setelah berhasil melihat halaman tersebut, terlihat bahwa instalasinya OK. Nantinya, Anda hanya perlu mengonfigurasi pintu masuk terpadu penyeimbang beban. Setelah melihat halaman berikut ini membuktikan bahwa tidak ada masalah pada instalasi saat ini. Perhatikan bahwa nama domain hanya dapat digunakan untuk akses, dan halaman tidak dapat dilihat secara normal melalui akses IP.

Konfigurasikan portal penyeimbangan beban

Setelah menguji secara manual bahwa semua node dapat mengakses rancher, Anda perlu mengonfigurasi penyeimbangan beban nginx. Anda dapat langsung mengonfigurasi penerusan empat lapis, sehingga Anda tidak perlu mengonfigurasi sertifikat.

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

Konfigurasikan file host klien, pengujian lolos, dan peternak dapat diakses secara normal saat mengakses portal nginx LB.