参考文档:https://rancher.com/docs/rancher/v2.x/en/installation/air-gap/
HA框架和节点
rancher HA基于k8s集群,为了节省节点,将k8s master和worker合一;另外需要一个节点作为Load Balancer和harbor节点,本文使用nginx作为rancher的反向代理。具体节点角色如下:
- node1 k8s master/worker, rancher server
- node2 k8s master/worker, rancher server
- node3 k8s master/worker, rancher server
- Load Balancer(nginx),harbor节点
节点需要安装的工具
- docker 四个节点都需要
- kubectl k8s 节点
- rke k8s 节点
- helm k8s 节点
离线安装docker-ce-18
https://docs.docker.com/install/linux/docker-ce/centos/#install-from-a-package
通过rpm包部署docker,下载三个安装包
containerd.io-1.2.6-3.3.el7.x86_64.rpm
docker-ce-18.09.9-3.el7.x86_64.rpm
docker-ce-cli-18.09.9-3.el7.x86_64.rpm
yum install xxx.rpm
设置非root用户使用docker
# 创建docker用户组
groupadd docker
# 添加普通用户
useradd rancher
# 将rancher用户添加到docker组中
usermod -aG docker rancher
切换换到rancher用户,测试是否可以使用docker ps
离线安装kubectl、helm、rke
https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl
确保三个工具可以在创建的普通用户中可以使用。
# 添加可执行权限
chmod a+x ./kubectl
# 移动至PATH
mv ./kubectl /usr/local/bin/kubectl
# 测试是否正常
kubectl version
# 解压 helm压缩包
tar -zxvf helm-*-linux-amd64.tgz
chmod a+x helm
# 将可执行文件移动至PATH中
mv linux-amd64/helm /usr/local/bin/helm
# 测试helm是否正常
helm help
# 添加可执行权限
chmod a+x rke
# 移动至PATH路径
mv rke_linux-amd64 /usr/local/bin/rke
# 测试是否可用
rke --version
harbor离线安装
安装docker-compose
https://github.com/docker/compose/releases
在连接中下载release版本,
mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod a+x /usr/local/bin/docker-compose
安装harbor
https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
- Download the installer;
- Configure harbor.yml;
- Run install.sh to install and start Harbor;
解压下载好的离线安装包
tar xvf harbor-offline-installer-<version>.tgz
修改harbor.yml
- hostname:修改为节点ip地址
- http 可以自定义端口
修改完毕之后,执行install.sh
脚本
下载rancher需要的镜像并导入到harbor
下载镜像
在rancher-releases页面下载
- rancher-save-images.sh
- rancher-images.txt
- rancher-load-images.sh
添加cert-manger的镜像信息至rancher-images.txt
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm fetch jetstack/cert-manager --version v0.9.1
helm template ./cert-manager-<version>.tgz | grep -oP '(?<=image: ").*(?=")' >> ./rancher-images.txt
sort -u rancher-images.txt -o rancher-images.txt
执行下载脚本
chmod +x rancher-save-images.sh
./rancher-save-images.sh --image-list ./rancher-images.txt
将镜像导入harbor
如果harbor使用http,则需要在每个节点上配置安全规则
vi /etc/docker/daemon.json
# 写入自己的harbor ip和port
{
"insecure-registries" : ["harbor_ip:harbor_port"]
}
# 重启docker
systemctl daemon-reload
systemctl restart docker
在harbor中创建quay.io和rancher两个项目
- 登录harbor
docker login <harbor_ip:harbor_port>
- 添加可执行权限
chmod +x rancher-load-images.sh
- 执行脚本
./rancher-load-images.sh --image-list ./rancher-images.txt --registry <harbor_ip:harbor_port>
使用rke安装k8s集群
使用密钥登录三个k8s节点
这些操作都是在普通用户rancher下进行
- 生成密钥文件
ssh-keygen -t rsa
- 上传id_rsa.pub,然后将公钥文件中的内容导入authorized_keys
cat id_rsa.pub >> ~/.ssh/authorized_keys
- 测试是否可以使用私钥ssh登录到三个节点
ssh -i ~/.ssh/id_ras rancher@192.168.3.34
ssh -i ~/.ssh/id_ras rancher@192.168.3.35
ssh -i ~/.ssh/id_ras rancher@192.168.3.36
使用rke部署k8s
配置ancher-cluster.yml
文件,address替换为自己的地址,只有一个网络的可以将internal_adress删掉,user替换为自己的用户名。
nodes:
- address: 192.168.3.36
user: rancher
role: [ "controlplane", "etcd", "worker" ]
ssh_agent_auth: true
- address: 192.168.3.35
user: rancher
role: [ "controlplane", "etcd", "worker" ]
ssh_agent_auth: true
- address: 192.168.3.34
user: rancher
role: [ "controlplane", "etcd", "worker" ]
ssh_agent_auth: true
private_registries:
- url: 192.168.3.37:10080
user: xxx
password: xxx12345
is_default: true
执行rke up
rke up --config ./rancher-cluster.yml
显示Finished building Kubernetes cluster successfully
表示部署k8s成功。
rkehi自动生成kube-config文件kube_config_rancher-cluster.yml
,可以将其重命名后复制至$HOME/.kube/config
,就可以使用kubectl命令了。
# 检查集群节点状态
kubectl get nodes
# 检查集群上pod状态
kubectl get pods --all-namespaces
部署rancher
部署cert-manger
1.下载cert manger 的helm chart:
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm fetch jetstack/cert-manager --version v0.9.1
2.生成cert-manger目录,包含cert-manger的k8s对象的yaml文件。
helm template ./cert-manager-v0.9.1.tgz --output-dir . \
--name cert-manager --namespace cert-manager \
--set image.repository=192.168.3.37:10080/quay.io/jetstack/cert-manager-controller
--set webhook.image.repository=192.168.3.37:10080/quay.io/jetstack/cert-manager-webhook
--set cainjector.image.repository=192.168.3.37:10080/quay.io/jetstack/cert-manager-cainjector
- 下载cert-manger CRD文件
curl -L -o cert-manager/cert-manager-crd.yaml https://raw.githubusercontent.com/jetstack/cert-manager/release-0.9/deploy/manifests/00-crds.yaml
- 部署cert-manger
kubectl create namespace cert-manager
kubectl label namespace cert-manager certmanager.k8s.io/disable-validation=true
kubectl apply -f cert-manager/cert-manager-crd.yaml
kubectl apply -R -f ./cert-manager
部署rancher
- 下载rancher helm chart
helm init -c
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm fetch rancher-stable/rancher
- 生成rancher目录,包含rancher的k8s对象的yaml文件:
helm template ./rancher-2.2.8.tgz --output-dir . \
--name rancher \
--namespace cattle-system \
--set hostname=rancher.my.org \
--set rancherImage=192.168.3.37:10080/rancher/rancher \
--set systemDefaultRegistry=192.168.3.37:10080 \
- 部署rancher
kubectl create namespace cattle-system
kubectl -n cattle-system apply -R -f ./rancher
load balancer节点安装nginx
本问使用容器的方式运行nginx。将三个k8s节点ip填入下面nginx.conf中。
worker_processes 4;
worker_rlimit_nofile 40000;
events {
worker_connections 8192;
}
stream {
upstream rancher_servers_http {
least_conn;
server <IP_NODE_1>:80 max_fails=3 fail_timeout=5s;
server <IP_NODE_2>:80 max_fails=3 fail_timeout=5s;
server <IP_NODE_3>:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}
upstream rancher_servers_https {
least_conn;
server <IP_NODE_1>:443 max_fails=3 fail_timeout=5s;
server <IP_NODE_2>:443 max_fails=3 fail_timeout=5s;
server <IP_NODE_3>:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers_https;
}
}
执行docker run命令,注意nginx.conf的路径为上述文件的路径。
docker run -d --restart=unless-stopped \
-p 80:80 -p 443:443 \
-v /etc/nginx.conf:/etc/nginx/nginx.conf \
nginx:1.14
访问rancher
Linux下在/etc/hosts
下添加,该ip为lb节点的ip
192.168.3.37 rancher.my.org
win10是在 C:\Windows\System32\drivers\etc\hosts
为cattle-cluster-agent和cattle-node-agent添加主机别名
kubectl -n cattle-system patch deployments cattle-cluster-agent --patch '{
"spec": {
"template": {
"spec": {
"hostAliases": [
{
"hostnames":
[
"rancher.my.org"
],
"ip": "192.168.3.37"
}
]
}
}
}
}'
kubectl -n cattle-system patch ds cattle-node-agent --patch '{
"spec": {
"template": {
"spec": {
"hostAliases": [
{
"hostnames":
[
"rancher.my.org"
],
"ip": "192.168.3.37"
}
]
}
}
}
}'