一文学会用Helm部署rancher 高可用集群

rancher集群架构图

Helm部署rancher 高可用集群

Helm简介

Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理。可以把Helm比作CentOS的yum工具。 Helm有如下几个基本概念:

Chart: 是Helm管理的安装包,里面包含需要部署的安装包资源。可以把Chart比作CentOS yum使用的rpm文件。

Release:是chart的部署实例,一个chart在一个Kubernetes集群上可以有多个release,即这个chart可以被安装多次

Repository:chart的仓库,用于发布和存储chart

下载:https://github.com/helm/helm/releases

查看pods情况

kubectl get pods --namespace=kube-system
kubectl get pods --all-namespaces

如果想删除它,则先找到deployment,再删除它即可

kangming@ubuntu26:~$ kubectl get deployment --namespace=kube-system
NAMEREADY UP-TO-DATE AVAILABLE AGE
calico-kube-controllers 1/1 11 4h23m
coredns 2/2 22 4h22m
coredns-autoscaler1/1 11 4h22m
metrics-server1/1 11 4h18m
tiller-deploy 0/1 10 4h15m

kangming@ubuntu26:~$ kubectl delete deployment tiller-deploy --namespace=kube-system
deployment.apps "tiller-deploy" deleted

如果要详细的查看某个pod,则可以describe

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

安装

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

查看官方文档:

Helm | Docs

Helm | 快速入门指南

添加一个chart仓库

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

查看可安装chart列表

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

安装chart示例

##确定我们可以拿到最新的charts列表
helm repo update

#安装一个mysql的chat示例
helm install bitnami/mysql --generate-name
NAME: mysql-1659686641
LAST DEPLOYED: Fri Aug5 16:04:04 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mysql
CHART VERSION: 9.2.5
APP VERSION: 8.0.30

** Please be patient while the chart is being deployed **

Tip:

Watch the deployment status using the command: kubectl get pods -w --namespace default

Services:

echo Primary: mysql-1659686641.default.svc.cluster.local:3306

Execute the following to get the administrator credentials:

echo Username: root
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default mysql-1659686641 -o jsonpath="{.data.mysql-root-password}" | base64 -d)

To connect to your database:

1. Run a pod that you can use as a client:

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

2. To connect to primary service (read/write):

mysql -h mysql-1659686641.default.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"

在上面的例子中,bitnami/mysql这个chart被发布,名字是mysql-1659686641。我们将所有pods列出会发现多了mysql的pod.

可以通过执行 helm show chart bitnami/mysql 命令简单的了解到这个chart的基本信息。 或者您可以执行 helm show all bitnami/mysql 获取关于该chart的所有信息。

每当您执行 helm install 的时候,都会创建一个新的发布版本。 所以一个chart在同一个集群里面可以被安装多次,每一个都可以被独立的管理和升级。

更多信息helm使用方法查看:https://helm.sh/zh/docs/intro/using_helm/

通过Helm您可以很容易看到哪些chart被发布了

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

卸载一个版本

kangming@ubuntu26:~/rancher$ helm uninstall mysql-1659686641
release "mysql-1659686641" uninstalled

该命令会从Kubernetes卸载 mysql-1659686641, 它将删除和该版本相关的所有相关资源(service、deployment、 pod等等)甚至版本历史。

如果您在执行 helm uninstall 的时候提供 --keep-history 选项, Helm将会保存版本历史。 您可以通过命令查看该版本的信息

helm status mysql-1659686641

helm 帮助文档

helm get -h

helm查找

  • helm search hub 从 Artifact Hub 中查找并列出 helm charts。 Artifact Hub中存放了大量不同的仓库。

  • helm search repo 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网。

使用 helm install 命令来安装一个新的 helm 包。最简单的使用方法只需要传入两个参数:你命名的release名字和你想安装的chart的名称。

helm install happy-panda bitnami/wordpress

helm3安装rancher(自签证书方式)

1,添加Chart仓库地址

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

2,生成定义证书

可参考:生成自签名SSL证书

一键生成证书脚本,rancher官方,保存为key.sh

#!/bin/bash -e

help ()
{
echo' ================================================================ '
echo' --ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为www.rancher.local,如果是ip访问服务,则可忽略;'
echo' --ssl-trusted-ip: 一般ssl证书只信任域名的访问请求,有时候需要使用ip去访问server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开;'
echo' --ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(SSL_TRUSTED_DOMAIN),多个扩展域名用逗号隔开;'
echo' --ssl-size: ssl加密位数,默认2048;'
echo' --ssl-cn: 国家代码(2个字母的代号),默认CN;'
echo' 使用示例:'
echo' ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \ '
echo' --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650'
echo' ================================================================'
}

case "$1" in
-h|--help) help; exit;;
esac

if [[ $1 == '' ]];then
help;
exit;
fi

CMDOPTS="$*"
for OPTS in $CMDOPTS;
do
key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
case "$key" in
--ssl-domain) SSL_DOMAIN=$value ;;
--ssl-trusted-ip) SSL_TRUSTED_IP=$value ;;
--ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;;
--ssl-size) SSL_SIZE=$value ;;
--ssl-date) SSL_DATE=$value ;;
--ca-date) CA_DATE=$value ;;
--ssl-cn) CN=$value ;;
esac
done

# CA相关配置
CA_DATE=${CA_DATE:-3650}
CA_KEY=${CA_KEY:-cakey.pem}
CA_CERT=${CA_CERT:-cacerts.pem}
CA_DOMAIN=cattle-ca

# ssl相关配置
SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'}
SSL_DATE=${SSL_DATE:-3650}
SSL_SIZE=${SSL_SIZE:-2048}

## 国家代码(2个字母的代号),默认CN;
CN=${CN:-CN}

SSL_KEY=$SSL_DOMAIN.key
SSL_CSR=$SSL_DOMAIN.csr
SSL_CERT=$SSL_DOMAIN.crt

echo -e "\033[32m ---------------------------- \033[0m"
echo -e "\033[32m | 生成 SSL Cert | \033[0m"
echo -e "\033[32m ---------------------------- \033[0m"

if [[ -e ./${CA_KEY} ]]; then
echo -e "\033[32m ====> 1. 发现已存在CA私钥,备份"${CA_KEY}"为"${CA_KEY}"-bak,然后重新创建 \033[0m"
mv ${CA_KEY} "${CA_KEY}"-bak
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
else
echo -e "\033[32m ====> 1. 生成新的CA私钥 ${CA_KEY} \033[0m"
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
fi

if [[ -e ./${CA_CERT} ]]; then
echo -e "\033[32m ====> 2. 发现已存在CA证书,先备份"${CA_CERT}"为"${CA_CERT}"-bak,然后重新创建 \033[0m"
mv ${CA_CERT} "${CA_CERT}"-bak
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
else
echo -e "\033[32m ====> 2. 生成新的CA证书 ${CA_CERT} \033[0m"
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
fi

echo -e "\033[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} \033[0m"
cat > ${SSL_CONFIG} <<EOM
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, serverAuth
EOM

if [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} || -n ${SSL_DOMAIN} ]]; then
cat >> ${SSL_CONFIG} <<EOM
subjectAltName = @alt_names
[alt_names]
EOM
IFS=","
dns=(${SSL_TRUSTED_DOMAIN})
dns+=(${SSL_DOMAIN})
for i in "${!dns[@]}"; do
echo DNS.$((i+1)) = ${dns[$i]} >> ${SSL_CONFIG}
done

if [[ -n ${SSL_TRUSTED_IP} ]]; then
ip=(${SSL_TRUSTED_IP})
for i in "${!ip[@]}"; do
echo IP.$((i+1)) = ${ip[$i]} >> ${SSL_CONFIG}
done
fi
fi

echo -e "\033[32m ====> 4. 生成服务SSL KEY ${SSL_KEY} \033[0m"
openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}

echo -e "\033[32m ====> 5. 生成服务SSL CSR ${SSL_CSR} \033[0m"
openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}

echo -e "\033[32m ====> 6. 生成服务SSL CERT ${SSL_CERT} \033[0m"
openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} \
-CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} \
-days ${SSL_DATE} -extensions v3_req \
-extfile ${SSL_CONFIG}

echo -e "\033[32m ====> 7. 证书制作完成 \033[0m"
echo
echo -e "\033[32m ====> 8. 以YAML格式输出结果 \033[0m"
echo "----------------------------------------------------------"
echo "ca_key: |"
cat $CA_KEY | sed 's/^//'
echo
echo "ca_cert: |"
cat $CA_CERT | sed 's/^//'
echo
echo "ssl_key: |"
cat $SSL_KEY | sed 's/^//'
echo
echo "ssl_csr: |"
cat $SSL_CSR | sed 's/^//'
echo
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^//'
echo

echo -e "\033[32m ====> 9. 附加CA证书到Cert文件 \033[0m"
cat ${CA_CERT} >> ${SSL_CERT}
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^//'
echo

echo -e "\033[32m ====> 10. 重命名服务证书 \033[0m"
echo "cp ${SSL_DOMAIN}.key tls.key"
cp ${SSL_DOMAIN}.key tls.key
echo "cp ${SSL_DOMAIN}.crt tls.crt"
cp ${SSL_DOMAIN}.crt tls.crt

执行

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

生成文件如下

3,创建secret命名空间

kubectl create namespace cattle-system

4,服务证书和私钥密文

kubectl -n cattle-system create secret tls tls-rancher-ingress \
--cert=tls.crt \
--key=tls.key

如果需要更换证书,可以使用 kubectl -n cattle-system delete secret tls-rancher-ingress 来删除 tls-rancher-ingress密文,之后使用上面的命令创建一个新的密文。如果您使用的是私有 CA 签发的证书,仅当新证书与当前证书是由同一个 CA 签发的,才可以替换。

5,ca证书密文

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

6,执行安装rancher

helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=rancher.k8s-test.com \
--set bootstrapPassword=admin \
--set ingress.tls.source=secret \
--set privateCA=true

7,检查状态,等待rollout成功,所有节点都ready

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

查看pod情况,当rancher的podready后即可通过浏览器访问:rancher.k8s-test.com。此域名可以映射到负载均衡节点。因为上面的安装默认在所有工作节点起一个pod。所以下面nginx配置了 三个节点的80和443端口。

kubectl get pods --all-namespaces
或者
kubectl get pods -n cattle-system

#查看rancher pod状态
kubectl describe podrancher-ff955865-29ljr --namespace=cattle-system
#一次看所有rancher pod
kubectl -n cattle-system describe pods -l app=rancher

上面的hostname解析到负载均衡节点即可,通常是通过keepalived虚拟出来的VIP,方便起见,这里只用一台做LB节点,直接解析到24,然后通过24的nginx去做负载均衡。 

troubleshooting

查看rancher pod的日志

kubectl get pods -n cattle-system

kubectl -n cattle-system logs -f rancher-5d9699f4cf-72wgp

配置负载均衡

在24负载均衡节点配置即可,将脚本生成的证书拷贝到24

sudo vi /etc/nginx/nignx.conf

stream {
upstream rancher_servers_http {
least_conn;
server 192.168.43.26:80 max_fails=3 fail_timeout=5s;
server 192.168.43.27:80 max_fails=3 fail_timeout=5s;
server 192.168.43.28:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}

upstream rancher_servers_https {
least_conn;
server 192.168.43.26:443 max_fails=3 fail_timeout=5s;
server 192.168.43.27:443 max_fails=3 fail_timeout=5s;
server 192.168.43.28:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers_https;
}
}

访问:https://rancher.k8s-test.com

bootstrap密码admin,登录账号admin,密码使用随机码:1BgV0yLx19YkIhOv

点击continue就可以进入管理页面了。

helm3安装rancher(rancher自带证书管理器方式)

前置条件参考前面,通过rke安装好k8s集群,准备好helm环境。

1,添加helm仓库

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

2,创建命名空间

kubectl create namespace cattle-system

3,选择Rancher-generated TLS certificate方式进行证书管理

4,安装cert-manager,只有选择了Rancher-generated TLS certificate方式才需要安装

# 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:

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.crds.yaml

# Add the Jetstack Helm repository
helm repo add jetstack https://charts.jetstack.io

# Update your local Helm chart repository cache
helm repo update

# Install the cert-manager Helm chart
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.7.1

验证cert-manager是否正确安装

kubectl get pods --namespace cert-manager

5,安装rancher,hostname使用假域名,这样rancher将会将IP暴露出来。

helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=rancher.my.org \
--set bootstrapPassword=admin

6,等待rollout成功

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

成功后,随便将rancher.my.org这个域名映射到三个节点进行测试,成功看到页面后表现安装没问题。后面只需要配置负载均衡统一入口即可。看到如下页面后,证明当前安装没问题。注意,只能 使用域名进行访问,IP访问不能正常看到页面。

配置负载均衡入口

手动测试所有节点均可以访问rancher后,下面需要配置nginx的负载均衡,直接配置四层转发即可,这样不需要配置证书。

sudo vi /etc/nginx/nignx.conf

stream {
upstream rancher_servers_http {
least_conn;
server 192.168.43.26:80 max_fails=3 fail_timeout=5s;
server 192.168.43.27:80 max_fails=3 fail_timeout=5s;
server 192.168.43.28:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}

upstream rancher_servers_https {
least_conn;
server 192.168.43.26:443 max_fails=3 fail_timeout=5s;
server 192.168.43.27:443 max_fails=3 fail_timeout=5s;
server 192.168.43.28:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers_https;
}
}

配置客户端的hosts文件,测试通过,访问nginx LB入口能正常访问rancher。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 11:52:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 11:52:04       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 11:52:04       58 阅读
  4. Python语言-面向对象

    2024-07-12 11:52:04       69 阅读

热门阅读

  1. LoFTR复现

    2024-07-12 11:52:04       20 阅读
  2. 56. 合并区间

    2024-07-12 11:52:04       21 阅读
  3. IOS热门面试题一

    2024-07-12 11:52:04       23 阅读
  4. IOS热门面试题二

    2024-07-12 11:52:04       20 阅读
  5. Flink 任务启动常用命令

    2024-07-12 11:52:04       23 阅读
  6. 【Linux Git入门】Git的介绍

    2024-07-12 11:52:04       22 阅读
  7. 【git命令大全】

    2024-07-12 11:52:04       24 阅读
  8. 代付是什么意思呢

    2024-07-12 11:52:04       23 阅读
  9. 初阶数据结构(顺序表的实现)

    2024-07-12 11:52:04       25 阅读
  10. 一键优雅为Ubuntu20.04服务器挂载新磁盘

    2024-07-12 11:52:04       18 阅读
  11. ubuntu22.04 编译freetype动态库

    2024-07-12 11:52:04       22 阅读