기술나눔

Yiwen은 Helm을 사용하여 Rancher 고가용성 클러스터를 배포하는 방법을 배웁니다.

2024-07-12

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

목장주 클러스터 아키텍처 다이어그램

Helm은 Rancher 고가용성 클러스터를 배포합니다.

헬름 소개

Helm은 Kubernetes 애플리케이션의 배포 및 관리를 단순화하는 데 사용되는 Kubernetes용 패키지 관리 도구입니다. Helm은 CentOS의 yum 도구와 비교할 수 있습니다. Helm에는 다음과 같은 기본 개념이 있습니다.

차트: Helm에서 관리하는 설치 패키지로 배포해야 하는 설치 패키지 리소스가 포함되어 있습니다. 차트는 CentOS yum에서 사용하는 rpm 파일과 비교할 수 있습니다.

릴리스: 차트의 배포 인스턴스입니다. 차트는 Kubernetes 클러스터에 여러 릴리스를 가질 수 있습니다. 즉, 차트를 여러 번 설치할 수 있습니다.

저장소: 차트를 게시하고 저장하는 데 사용되는 차트 창고

다운로드:https://github.com/helm/helm/releases

Pod 상태 확인

  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 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 사용 방법에 대한 자세한 내용은 다음을 참조하세요.https://helm.sh/zh/docs/intro/사용_헬름/

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 uninstall 실행 시 --keep-history 옵션을 제공하면 Helm이 버전 기록을 저장합니다. 다음 명령을 통해 이 버전에 대한 정보를 볼 수 있습니다.

helm status mysql-1659686641

헬름 도움말 문서

helm get -h

조타 검색

  • 헬름 검색 허브아티팩트 허브 에서 Helm 차트를 찾아 나열합니다. Artifact Hub에는 다양한 저장소가 저장되어 있습니다.

  • helm search repo는 로컬 helm 클라이언트에 추가한(helm repo add 사용) 저장소에서 검색합니다. 이 명령은 로컬 데이터를 기반으로 검색하며 인터넷 연결이 필요하지 않습니다.

새로운 helm 패키지를 설치하려면 helm install 명령을 사용하십시오. 가장 간단한 사용 방법은 두 가지 매개변수(이름을 지정한 릴리스 이름과 설치하려는 차트 이름)만 전달하면 됩니다.

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

Pod 상태를 확인하세요. rancher의 Pod가 준비되면 rancher.k8s-test.com 브라우저를 통해 액세스할 수 있습니다. 이 도메인 이름은 부하 분산 노드에 매핑될 수 있습니다. 위 설치는 기본적으로 모든 작업 노드에서 Pod를 시작하기 때문입니다. 따라서 nginx 아래에서는 세 노드의 포트 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 노드 하나만 사용하는데, 이는 바로 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. }

클라이언트의 호스트 파일을 구성하고 테스트를 통과하면 nginx LB 포털에 접속 시 정상적으로 랜처에 접속할 수 있습니다.