(rancher 1.x已经暂停维护,仅做记录参考,不建议生产使用)
此方案为2019时的rancher 1的离线搭建方案,几年过去了应用都已经都已经迁移上云,仅作记录。
一、Harbor 私有仓库搭建
前期准备:1.docker环境和docker-compose环境。
2.offline版本的离线安装包。
harbor安装包获取地址:Releases · goharbor/harbor · GitHub
# 下载离线安装包
wget https://github.com/goharbor/harbor/releases/download/v1.10.1/harbor-offline-installer-v1.10.1.tgz
将安装包上传到服务器后:
# 解压
tar -xzf harbor-online-installer-v1.10.1.tgz
# 创建harbor目录
mkdir /opt/harbor
# 移动解压harbor文件,到新目录
mv harbor/* /opt/harbor/
# 修改配置文件
cd /opt/harbor/
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
- 1.修改hostname为本机地址
- 2.修改数据库密码database.password
- 3.修改harbor登录密码 harbor_admin_password:
- 4.如果有https配置把相关注释去掉即可
修改完配置文件后:
# cd /opt/harbor/
./prepare # 执行使配置文件生效
./install.sh --help #查看启动参数
./install.sh --with-chartmuseum # 加载chart
# 启动
docker-compose ps #查看运行pod
docker-compose up -d #后台启动docker-compose
docker-compose down #
最后修改其他需要访问镜像仓库docker配置
# 修改内网其他需要访问harbor的机器docker配置
vim /etc/docker/daemon.json
{
"insecure-registries": ["harborIp:Port"]
}
# 重新加载配置
systemctl daemon-reload
# 重启docker
systemctl restart docker
使用方式:
1. 镜像管理方式同样使用docker命令,具体参考docker官方即可。
2. 在rancher中使用新的镜像,下图位置中填写好上述修改后的镜像即可。
二、Rancher搭建
需要准备:harbor 私有仓库、docker安装包(docker安装过程没有记录,但需要每台机器均需要安装)、rancher-server镜像、kubectl、rke、helm(也可以通过git仓库方式创建私有商店)
1. kubectl安装
# 下载需求版本的kubectl
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/linux/amd64/kubectl
# 最新版本
#curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
#
chmod +x ./kubectl
#
sudo mv ./kubectl /usr/local/bin/kubectl
# 查看版本
kubectl version
2. rke安装
打开Release Release v0.3.2 · rancher/rke · GitHub
# 重命名并复制到系统路径
mv rke_linux-amd64 rke
chmod +x rke
# 确认已安装版本
rke --version
3. 安装helm
# 可以参考官方安装方法
//https://helm.sh/zh/docs/intro/install/
# 下载需要的版本
//https://github.com/helm/helm/releases
# 解压缩并移动到指定目录
tar -zxvf helm-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm && chmod +x usr/local/bin/helm
# 测试helm客户端
helm version
4.安装 helm 服务端
注:需要先拉取 tiller 对应版本镜像并推送至服务器。
# 安装 helm 服务端
kubeconfig=xxx.yml
helm_version=`helm version |grep Client | awk -F""\" '{print $2}'` helm init --kubeconfig=$kubeconfig --skip-refresh \
--service-account tiller \
--tiller-image registry.cn-shanghai.aliyuncs.com/rancher/tiller:${helm_version}
5. 安装 Rancher
5.1 获取Rancher Chart
从可以访问 Internet 的系统中,获取 Rancher Helm Chart。
使用 helm repo add 来添加仓库,不同的地址适应不同的 Rancher 版本(latest,stable或alpha)。更多信息请参考如何选择 Rancher 版本选择
- latest: 最新版
- stable:稳定版
- alpha:预览版
# 一般选择稳定版
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
获取最新的 Rancher Chart,您会看到对应的 tgz 文件下载到本地。
helm fetch rancher-stable/rancher
如果需要下载特定版本 Rancher 的,你可以用--version参数指定版本:
helm fetch rancher-stable/rancher --version=vx.x.x
5.2 获取Rancher镜像
从可以访问 Internet 的系统中,获取rancher镜像
# 下载对应版本需求文件
# https://github.com/rancher/rancher/releases
通过 rke 处理镜像清单(可选)
rke config --system-images -all >> ./rancher-images.txt
# 去重
sort -u rancher-images.txt -o rancher-images.txt
拉取镜像并保存清单
rancher-save-images.sh 与 rancher-images.txt 放在同一目录并执行
chmod +x ./rancher-save-images.sh && ./rancher-save-images.sh -- image-list ./rancher-images.txt
rancher-save-images.sh 脚本如下:
#!/bin/bash
list="rancher-images.txt"
images="rancher-images.tar.gz"
usage () {
echo "USAGE: $0 [--image-list rancher-images.txt] [--images rancher-images.tar.gz]"
echo " [-l|--image-list path] text file with list of images; one image per line."
echo " [-i|--images path] tar.gz generated by docker save."
echo " [-h|--help] Usage message"
}
POSITIONAL=()
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-i|--images)
images="$2"
shift # past argument
shift # past value
;;
-l|--image-list)
list="$2"
shift # past argument
shift # past value
;;
-h|--help)
help="true"
shift
;;
*)
usage
exit 1
;;
esac
done
if [[ $help ]]; then
usage
exit 0
fi
pulled=""
while IFS= read -r i; do
[ -z "${i}" ] && continue
if docker pull "${i}" > /dev/null 2>&1; then
echo "Image pull success: ${i}"
pulled="${pulled} ${i}"
else
if docker inspect "${i}" > /dev/null 2>&1; then
pulled="${pulled} ${i}"
else
echo "Image pull failed: ${i}"
fi
fi
done < "${list}"
echo "Creating ${images} with $(echo ${pulled} | wc -w | tr -d '[:space:]') images"
docker save $(echo ${pulled}) | gzip --stdout > ${images}
5.3 上传Rancher镜像
在harbor私有创建相应项目,例如rancher:
然后将文件 rancher-images.txt 和 rancher-images.tar.gz上传到服务器中,在同一目录下运行 rancher-load-images.sh 脚本。
# 1.登录私有镜像库
docker login <REGISTRY.YOURDOMAIN.COM:PORT>
# 2.为rancher-load-images.sh 添加可执行权限
chmod +x rancher-load-images.sh
# 3.使用脚本 rancher-load-images.sh提取rancher-images.tar.gz文件中的镜像,根据文件rancher-images.txt中的镜像列表对提取的镜像文件重新打 tag 并推送到你的私有镜像库中
./rancher-load-images.sh --image-list ./rancher-images.txt --registry <REGISTRY.YOURDOMAIN.COM:PORT>`
rancher-load-images.sh 脚本如下:
#!/bin/bash
images="rancher-images.tar.gz"
list="rancher-images.txt"
windows_image_list=""
windows_versions="1903"
usage () {
echo "USAGE: $0 [--images rancher-images.tar.gz] --registry my.registry.com:5000"
echo " [-l|--image-list path] text file with list of images; one image per line."
echo " [-i|--images path] tar.gz generated by docker save."
echo " [-r|--registry registry:port] target private registry:port."
echo " [--windows-image-list path] text file with list of images used in Windows. Windows image mirroring is skipped when this is empty"
echo " [--windows-versions version] Comma separated Windows versions. e.g., \"1809,1903\". (Default \"1903\")"
echo " [-h|--help] Usage message"
}
push_manifest () {
export DOCKER_CLI_EXPERIMENTAL=enabled
manifest_list=()
for i in "${arch_list[@]}"
do
manifest_list+=("$1-${i}")
done
echo "Preparing manifest $1, list[${arch_list[@]}]"
docker manifest create "$1" "${manifest_list[@]}" --amend
docker manifest push "$1" --purge
}
while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-r|--registry)
reg="$2"
shift # past argument
shift # past value
;;
-l|--image-list)
list="$2"
shift # past argument
shift # past value
;;
-i|--images)
images="$2"
shift # past argument
shift # past value
;;
--windows-image-list)
windows_image_list="$2"
shift # past argument
shift # past value
;;
--windows-versions)
windows_versions="$2"
shift # past argument
shift # past value
;;
-h|--help)
help="true"
shift
;;
*)
usage
exit 1
;;
esac
done
if [[ -z $reg ]]; then
usage
exit 1
fi
if [[ $help ]]; then
usage
exit 0
fi
docker load --input ${images}
linux_images=()
while IFS= read -r i; do
[ -z "${i}" ] && continue
linux_images+=("${i}");
done < "${list}"
arch_list=()
if [[ -n "${windows_image_list}" ]]; then
IFS=',' read -r -a versions <<< "$windows_versions"
for version in "${versions[@]}"
do
arch_list+=("windows-${version}")
done
windows_images=()
while IFS= read -r i; do
[ -z "${i}" ] && continue
windows_images+=("${i}")
done < "${windows_image_list}"
# use manifest to publish images only used in Windows
for i in "${windows_images[@]}"; do
if [[ ! " ${linux_images[@]}" =~ " ${i}" ]]; then
case $i in
*/*)
image_name="${reg}/${i}"
;;
*)
image_name="${reg}/rancher/${i}"
;;
esac
push_manifest "${image_name}"
fi
done
fi
arch_list+=("linux-amd64")
for i in "${linux_images[@]}"; do
[ -z "${i}" ] && continue
arch_suffix=""
use_manifest=false
if [[ (-n "${windows_image_list}") && " ${windows_images[@]}" =~ " ${i}" ]]; then
# use manifest to publish images when it is used both in Linux and Windows
use_manifest=true
arch_suffix="-linux-amd64"
fi
case $i in
*/*)
image_name="${reg}/${i}"
;;
*)
image_name="${reg}/rancher/${i}"
;;
esac
docker tag "${i}" "${image_name}${arch_suffix}"
docker push "${image_name}${arch_suffix}"
if $use_manifest; then
push_manifest "${image_name}"
fi
done
5.4 rke部署Kubernetes集群
rancher-cluster.yml 示例(根据实际配置修改对应配置信息即可):
nodes:
- address: 192.168.1.110 # 离线环境节点 IP
internal_address: 192.168.1.110 # 节点内网 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /home/user/.ssh/id_rsa
- address: 192.168.1.111 # 离线环境节点 IP
internal_address: 192.168.1.111 # 节点内网 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /home/user/.ssh/id_rsa
- address: 192.168.1.112 # 离线环境节点 IP
internal_address: 192.168.1.112 # 节点内网 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /home/user/.ssh/id_rsa
private_registries:
- url: <REGISTRY.YOURDOMAIN.COM:PORT> # harbor私有镜像库地址
user: rancher
password: "*********"
is_default: true
services:
etcd:
extra_args:
auto-compaction-retention: 240 #(单位小时)
# 修改空间配额为$((6*1024*1024*1024)),默认 2G,最大 8G
quota-backend-bytes: '6442450944'
# rke 0.2 之前版本
snapshot: true
creation: 6h
retention: 24h
backup_config:
enabled: true # enables recurring etcd snapshots
interval_hours: 6 # time increment between snapshots
retention: 60 # time in days before snapshot purge
SSH配置可通过ssh-keygen生成:
ssh-keygen
ssh-copy-id -i /root/.ssh/id_rsa.pub root@<集群主机IP>
启动 Kubernetes 集群:
rke up --config ./rancher-cluster.yml
完成后,它应显示:Finished building Kubernetes cluster successfully,并产生一个kube_config_rancher-cluster.yml文件,这个文件是访问和操作k8s集群的凭证。
设置环境变量(方便使用kubectl命令):
export KUBECONFIG=$(pwd)/kube_config_rancher-cluster.yml
执行下列指令应当可以看到节点状态:
kubectl get nodes
如图:
执行下列指令应当可以看到集群服务状态
kubectl get pods --all-namespaces
5.5 初始化 helm(可选)
Helm 在 Kubernetes 集群上安装 Tiller 服务以管理 charts,由于rke默认启用 RBAC, 因此我们需要使用 kubectl 来创建一个service account,clusterRoleBinding 才能让 Tiller 具有部署到集群的权限。
# 指定 kubeconfig 配置文件
kubectl --kubeconfig=$kubeconfig -n kube-system \
create serviceaccount tiller
kubectl --kubeconfig=$kubeconfig \
create clusterrolebinding tiller \
--clusterrole cluster-admin \
--serviceaccount=kube-system:tiller
5.6 cert-manager方案渲染rancher charts
在可以访问Internet的机器上,安装 helm 客户端。执行以下命令以
# 获取 cert-manager
helm fetch stable/cert-manager
# 需要准备 cert-manager-controller 对应镜像,推送至harbor仓库。
helm template ./cert-manager-<version>.tgz --output-dir . \
--name cert-manager --namespace kube-system \
--set image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-controller
# 使用您期望的参数渲染 chart 模板,需要设置 image.repository 从harbor仓库中拉取 Chart。
helm template ./rancher-<version>.tgz --output-dir . \
--name rancher --namespace cattle-system \
--set hostname=<RANCHER.YOURDOMAIN.COM> \
--set
rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher
5.7 安装 cert-manager 和 rancher
# 为 cert-manager 创建 namespace
kubectl create namespace cert-manager
# 启动 cert-manager
kubectl -n kube-system apply -R -f ./cert-manager
# 安装Rancher
kubectl create namespace cattle-system
kubectl -n cattle-system apply -R -f ./rancher
三、Prometheus + Grafana
前期准备:rancher平台。
方案一:通过helm将应用商店成功部署到rancher平台。
方案二:通过git将商店部署到rancher平台。
商店模板可参考官方:私有应用商店 | Rancher文档
可从官方应用商店git中获取对应模板,然后部署到私有git中
如能成功部署商店,即可通过商店进行安装使用。