在K3S集群中安装Rancher

一、首先需要搭建好一个K3S集群

可以看我往期文档搭建

安装前需要确认下,当前需要安装的rancher版本是否支持当前k3s的版本

二、安装helm

下载helm包

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

解压helm二进制包

tar -xf helm-v3.2.4-linux-amd64.tar.gz

移动helm二进制文件到bin下

mv linux-amd64/helm /usr/bin/

三、配置helm连接k3s

echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> /etc/profile && source /etc/profile

四、添加rancher镜像源

# 添加rancher镜像源
helm repo add rancher-stable http://rancher-mirror.oss-cn-beijing.aliyuncs.com/server-charts/stable

# 更新源
helm repo update

五、创建命名空间

需要定义一个 Kubernetes Namespace,在 Namespace 中安装由 Chart
创建的资源。这个命名空间的名称为cattle-system:

kubectl create namespace cattle-system

六、安装Rancher(使用Let’s Encrypt证书)

1.安装 CustomResourceDefinition 资源

如果你手动安装了CRD,而不是在Helm安装命令中添加了--set installCRDs=true选项,你应该在升级Helm chart之前升级CRD资源

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

2.添加Jetstack Helm仓库

helm repo add jetstack https://charts.jetstack.io

3. 更新本地仓库缓存

helm repo update

4.安装 cert-manager

helm install cert-manager jetstack/cert-manager --namespace cert-manager --create-namespace --version v1.5.1

查看 cert-manager

kubectl get pods --namespace cert-manager

在K3S集群中安装Rancher_第1张图片

5.安装Rancher

如果使用Let’s Encrypt证书证书则可执行如下方式直接安装
安装时可设置的选项,可查看官方文档: https://docs.rancher.cn/docs/rancher2.5/installation/install-rancher-on-k8s/chart-options/_index/
如下为对应的命令空间 cattle-system 在上面创建的
如下 registry.cn-hangzhou.aliyuncs.com/rancher/rancher 为对应的rancher镜像
如下 replicas 为设置 Rancher 部署所使用的复制数量(副本数) 默认为 3
如下 ingress.tls.source 设置为 letsEncrypt (表示使用Let’s Encrypt证书)
如果要安装一个特定的 Rancher 版本, 使用–version 标志,例如:–version 2.3.6
对应 etsEncrypt.email 为证书到期通知的邮箱地址
如果你安装的是 alpha 版本,Helm 要求在命令中加入 –devel 选项

helm install rancher rancher-stable/rancher  --namespace cattle-system --set hostname=demo.rancher.com --set replicas=3  --set ingress.tls.source=letsEncrypt  --set rancherImage=registry.cn-hangzhou.aliyuncs.com/rancher/rancher --set letsEncrypt.email=[email protected]

指定安装版本,示例如下:

helm install rancher rancher-stable/rancher \
  --version v2.5.12 \
  --namespace cattle-system \
  --set hostname=demo.rancher.com\
  --set ingress.tls.source=letsEncrypt \
  --set rancherImage=registry.cn-hangzhou.aliyuncs.com/rancher/rancher \
  --set letsEncrypt.email=[email protected]

七、安装Rancher(使用自定义证书)

对应官网文档: http://docs.rancher.cn/docs/rancher2/admin-settings/replace-ip-domain/_index/

1.创建证书目录

# 创建目录
mkdir /certs

#进入目录
cd /certs

2. 创建 create_self-signed-cert.sh 文件并将下面代码添加进去

vi create_self-signed-cert.sh

将 create_self-signed-cert.sh 文件放在 /certs 目录下

#!/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} ]]; 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

3.添加 create_self-signed-cert.sh 文件可执行权限

chmod +x create_self-signed-cert.sh

4.生成证书

如下 demo.rancher.com 为对应的域名地址
如下 192.168.15.223,192.168.15.224 为对应的IP (多个以,号隔开)

sh ./create_self-signed-cert.sh --ssl-domain=demo.rancher.com --ssl-trusted-ip=192.168.15.223,192.168.15.224 --ssl-size=2048 --ssl-date=3650

5.将生成的证书上传到k3s集群

将证书上传到集群中去, 到时 ingress 要用
如下 ./tls.crt 表示对应证书文件中生成的证书文件
如下 ./tls.key 表示对应证书文件中生成的证书文件

# 设置环境变量(已设置则可以不用再执行了)
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
# 创建cattle-system命令空间 (已设置则可以不用再执行了)
kubectl --kubeconfig=$kubeconfig create namespace cattle-system
# 配置对应证书
kubectl --kubeconfig=$kubeconfig -n cattle-system create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key

6. 为rancher设置证书

如下 ./cacerts.pem 表示对应证书文件中生成的证书文件

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

7. 使用helm安装rancher

安装时可设置的选项,可查看官方文档: https://docs.rancher.cn/docs/rancher2.5/installation/install-rancher-on-k8s/chart-options/_index/

如下为对应的命令空间 cattle-system 在上面创建的
如下为对应的域名 demo.rancher.com 需要和创建证书时的域名一致
如下 registry.cn-hangzhou.aliyuncs.com/rancher/rancher 为对应的rancher镜像
如下 replicas 为设置 Rancher 部署所使用的复制数量(副本数) 默认为 3;如果你的集群中少于 3 个节点,你应填写实际节点数量
如下 ingress.tls.source 设置为 secret
如果要安装一个特定的 Rancher 版本, 使用–version 标志,例如:–version 2.3.6
如果你安装的是 alpha 版本,Helm 要求在命令中加入 –devel 选项

helm install rancher rancher-stable/rancher   --namespace cattle-system   --set hostname=demo.rancher.com     --set ingress.tls.source=secret    --set rancherImage=registry.cn-hangzhou.aliyuncs.com/rancher/rancher --set replicas=2 --set privateCA=true

八、验证 rancher

kubectl -n cattle-system get deploy rancher

九、查看rancher登录密码

kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{"\n"}}'

十、最后就可以登录rancher了

十一、最后补充

卸载rancher

helm delete rancher -n cattle-system

升级Rancher

升级前看下当前的k3s版本是否支持,确定是否需要先升级下k3s
如下对应 demo.rancher.com 域名跟原来保持一致
升级时也可以像安装时一样指定一些参数

# 更新源
helm repo update

# 执行升级
helm upgrade rancher rancher-stable/rancher \
  --namespace cattle-system \
  --set hostname=demo.rancher.com

升级时如果忘记对应域名了,可执行如下命令查看

helm get values rancher -n cattle-system

在K3S集群中安装Rancher_第2张图片

你可能感兴趣的:(Rancher,k3s,rancher)