前言:这篇文章为个人学习笔记,遇到问题或者文章中有错误的地方还望留言指出
机器列表
编号 | IP | 机器名称 | 说明 |
---|---|---|---|
1 | 192.168.60.60 | / | yum源机器,时间同步机器 |
2 | 192.168.60.63 | rancher-001 | kubernetes-master-01 |
3 | 192.168.60.64 | rancher-002 | kubernetes-master-02 |
4 | 192.168.60.65 | rancher-003 | kubernetes-master-03 |
5 | 192.168.60.66 | rancher-004 | kubernetes-worker节点 |
6 | 192.168.60.117 | / | harbor仓库所在机器 |
7 | 192.168.60.139 | rancher-load-balancer | 部署外部负载均衡器 |
本文档中通过 wget http://192.168.60.60/ranche-repo/xxxx
下载的内容为已经提前下载好,放到内网httpd服务中的内容,需自己自行下载
1 下载Rancher 版本所需要的资源
浏览版本发布页面:https://github.com/rancher/rancher/releases,查找需要安装的 Rancher v2.x.x 版本。不要下载标记为 rc
或 Pre-release
的版本,因为它们在生产环境下是不稳定的。本文档使用的是2.5.7版本
会获取到一下三个文件
Release 文件 | 描述 |
---|---|
rancher-images.txt |
此文件包含安装 Rancher、创建集群和运行 Rancher 工具所需的镜像列表。 |
rancher-save-images.sh |
这个脚本会从 DockerHub 中拉取在文件rancher-images.txt 中描述的所有镜像,并将它们保存为文件rancher-images.tar.gz 。 |
rancher-load-images.sh |
这个脚本会载入文件rancher-images.tar.gz 中的镜像,并将它们推送到您自己的私有镜像库。 |
2 收集 cert-manager 镜像
安装helm(已经安装的忽略)
# 解压安装包
tar -zxvf helm-v3.5.4-linux-amd64.tar.gz
# 执行权限
chmod +x ./linux-amd64/helm
# 移动到bin目录下
mv ./linux-amd64/helm /usr/local/bin/helm
获取helm模板
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm fetch jetstack/cert-manager --version v0.12.0
helm template ./cert-manager-<version>.tgz | grep -oP '(?<=image: ").*(?=")' >> ./rancher-images.txt
对镜像列表进行排序和唯一化,去除重复的镜像源
sort -u rancher-images.txt -o rancher-images.txt
3 获取离线镜像
# 执行权限
chmod +x rancher-save-images.sh
# 下载镜像,如果下载很慢,并且本地docker没有设置阿里镜像加速,可以加上 --from-aliyun实现镜像加速
./rancher-save-images.sh --image-list ./rancher-images.txt
脚本执行完后会得到一个rancher-images.tar.gz
压缩包,大概7G左右.但是docker在获取镜像的过程中会将镜像存储在docker本地仓库中,未压缩的镜像体积较大会在30-40G,所以要保证 / 目录的磁盘空间(docker默认使用的目录会挂在/磁盘上).
4 推送镜像到私有镜像库
使用脚本将离线镜像压缩包 rancher-images.tar.gz
中的镜像上传到私有镜像库。文件 rancher-images.txt
,rancher-images.tar.gz
, rancher-load-images.sh
三个文件放在同一个目录, 然后执行以下操作,推送到harbor所在的机器192.168.60.117
上。
# 登陆远程镜像仓库,<REGISTRY.YOURDOMAIN.COM:PORT>换成harbor的地址和端口
docker login <REGISTRY.YOURDOMAIN.COM:PORT>
# 添加执行权限
chmod +x rancher-load-images.sh
# 执行推送脚本,<REGISTRY.YOURDOMAIN.COM:PORT>换成harbor的地址和端口
./rancher-load-images.sh --image-list ./rancher-images.txt --registry <REGISTRY.YOURDOMAIN.COM:PORT>
2 初始化集群机器
开始初始化 rancher-001~ rancher-003(集群中每台机器上执行)
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
# 关闭分区交换
swapoff -a
sed -ri "s/.*swap.*/#&/" /etc/fstab
# 设置主机名
hostnamectl set-hostname <主机名>
# 配置DNS解析
tee -a /etc/hosts<<EOF
<ip1> <hostname1>
<ip2> <hostname2>
<ip3> <hostname3>
EOF
时间同步服务端(192.168.60.60机器上执行,作为服务端)
# 时间同步
yum -y install chrony
vim /etc/chrony.conf
chrony.conf
作一下修改,保存并退出(wq!)
# 注释4项
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
# 添加
server 127.127.1.0 iburst
# 添加允许网段,允许开发60,测试70/80
allow 192.168.60.0/24
allow 192.168.70.0/24
allow 192.168.80.0/24
# 打开注释
local stratum 10
启动并检查是否成功
# 启动
systemctl restart chronyd
# 开机启动
systemctl enable chronyd
# 检查123端口是否被监听
ss -unl | grep 123
# 正常情况下
# UNCONN 0 0 *:123 *:*
时间同步客户端(rancher001-003上执行)
# 安装并修改配置
yum -y installl chrony
vim /etc/chrony.conf
/etc/chrony.conf
作一下修改
# 注释4项
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
# 添加
server <你的ntp服务端ip> iburst
启动验证
# 启动
systemctl restart chronyd
# 开机启动
systemctl enable chronyd
# 验证
chronyc sources
# 正常情况下
#210 Number of sources = 1
#MS Name/IP address Stratum Poll Reach LastRx Last sample
#===============================================================================
#^* 192.168.60.60 10 6 17 15 +2061ns[+5960ns] +/- 143us
3 RKE版本kubernetes高可用架构安装
helm,rke,kubectl安装(rancher-001上执行)
mkdir -p /apps/rancher && cd /apps/rancher
wget http://192.168.60.60/ranche-repo/kubectl
wget http://192.168.60.60/ranche-repo/rke_linux-amd64
wget http://192.168.60.60/ranche-repo/helm-v3.5.4-linux-amd64.tar.gz
tar -zxvf helm-v3.5.4-linux-amd64.tar.gz
mv linux-amd64/helm ./
mv rke_linux-amd64 rke
chmod +x rke
chmod +x helm
chmod +x kubectl
mv ./kubectl /usr/local/bin/kubectl
mv ./helm /usr/local/bin/helm
mv ./rke /usr/local/bin/rke
离线安装docker脚本(rancher001-003上执行)
wget http://192.168.60.60/ranche-repo/docker-20.10.5.tgz
tar -zxvf docker-20.10.5.tgz
mv docker/* /usr/bin/
touch /etc/systemd/system/docker.service
tee -a /etc/systemd/system/docker.service<<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
chmod +x /etc/systemd/system/docker.service
mkdir -p /etc/docker
touch /etc/docker/daemon.json
tee -a /etc/docker/daemon.json<<EOF
{
"insecure-registries": ["192.168.60.117"]
}
EOF
systemctl daemon-reload
systemctl enable docker.service
systemctl start docker
快速安装脚本:cd /home && wget http://192.168.60.60/ranche-repo/docker_offline_install.sh && chmod +x docker_offline_install.sh && ./docker_offline_install.sh
这里docker_offline_install.sh
上传到了HTTPD服务上共用的
添加rancher用户组(rancher001-003)
useradd rancher
passwd rancher
# 添加进root和docker
usermod -a -G root rancher
#usermod -a -G docker rancher
tee -a /etc/sudoers<<EOF
rancher ALL=(ALL) ALL
EOF
免密登陆(rancher001上执行)
ssh-keygen -t rsa
ssh-copy-id rancher@192.168.60.63
ssh-copy-id rancher@192.168.60.64
ssh-copy-id rancher@192.168.60.65
创建rancher_cluster.yaml(rancher001上执行)
cd /apps/rancher
touch rancher_cluster.yaml
nodes:
- address: 192.168.60.63 # 离线环境节点 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /root/.ssh/id_rsa
- address: 192.168.60.64 # 离线环境节点 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /root/.ssh/id_rsa
- address: 192.168.60.65 # 离线环境节点 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /root/.ssh/id_rsa
private_registries:
- url: 192.168.60.117 # 私有镜像库地址
user: admin
password: "xxxxxx"
is_default: true
启动集群(rancher001上执行)
rke up --config ./rancher_cluster.yaml
查看集群情况
# 初始化kubectl
mkdir /root/.kube
cp /apps/rancher/kube_config_rancher_cluster.yaml /root/.kube/config
# 查看集群节点
kubectl get nodes
#NAME STATUS ROLES AGE VERSION
#192.168.20.233 Ready controlplane,etcd,worker 42h v1.20.4
#192.168.20.234 Ready controlplane,etcd,worker 42h v1.20.4
#192.168.20.237 Ready controlplane,etcd,worker 42h v1.20.4
# 如果不将kube_config_rancher_cluster.yaml作为kubectl默认配置的话,可以再运行时指定
kubectl --kubeconfig /apps/rancher/kube_config_rancher_cluster.yaml get nodes
4 Rancher 部署负载均衡器(rancher-load-balancer上执行)
离线安装docker脚本
wget http://192.168.60.60/ranche-repo/docker-20.10.5.tgz
tar -zxvf docker-20.10.5.tgz
mv docker/* /usr/bin/
touch /etc/systemd/system/docker.service
tee -a /etc/systemd/system/docker.service<<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
TimeoutStartSec=0
Delegate=yes
KillMode=process
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
EOF
chmod +x /etc/systemd/system/docker.service
mkdir -p /etc/docker
touch /etc/docker/daemon.json
tee -a /etc/docker/daemon.json<<EOF
{
"insecure-registries": ["192.168.60.117"]
}
EOF
systemctl daemon-reload
systemctl enable docker.service
systemctl start docker
快速安装脚本:cd /home && wget http://192.168.60.60/ranche-repo/docker_offline_install.sh && chmod +x docker_offline_install.sh && ./docker_offline_install.sh
部署nginx作为rancher的负载均衡器
# 获取镜像
docker pull 192.168.60.117:library/nginx:1.15
# 创建挂载目录
mkdir -p /data/nginx/{conf,logs,html}
# 创建配置文件
cd /data/nginx/conf && touch nginx.conf
nginx.conf内容
user nginx;
# 加一点点工作线程
worker_processes 4;
worker_rlimit_nofile 40000;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# 加一点连接数
events {
worker_connections 8192;
}
# rancher代理配置
stream {
upstream rancher_servers_http {
least_conn;
server <node1-ip>:80 max_fails=3 fail_timeout=5s;
server <node2-ip>:80 max_fails=3 fail_timeout=5s;
server <node3-ip>:80 max_fails=3 fail_timeout=5s;
}
server {
listen 80;
proxy_pass rancher_servers_http;
}
upstream rancher_servers_https {
least_conn;
server <node1-ip>:443 max_fails=3 fail_timeout=5s;
server <node2-ip>:443 max_fails=3 fail_timeout=5s;
server <node3-ip>:443 max_fails=3 fail_timeout=5s;
}
server {
listen 443;
proxy_pass rancher_servers_https;
}
}
替换里面的<node1-ip>为真实的节点ip
启动nginx
docker run --privileged --restart always -p 80:80 -p 443:443 --name nginx -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /data/nginx/logs:/var/log/nginx -v /data/nginx/html:/usr/share/nginx/html -d 192.168.60.117:library/nginx:1.15
5 通过helm 生成yaml配置,并安装rancher
=================================== 有网络的机器上执行 ===================================
# 添加stable 的 Rancher 仓库
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
# 下载特定版本 Rancher Chart
helm fetch rancher-stable/rancher --version=v2.5.7
# 添加 cert-manager 仓库
helm repo add jetstack https://charts.jetstack.io
# 更新仓库
helm repo update
# 下载0.12.0的cert-manager Chart
helm fetch jetstack/cert-manager --version v0.12.0
# 渲染cert-manager模板,<REGISTRY.YOURDOMAIN.COM:PORT>仓库的ip/域名和端口
helm template cert-manager ./cert-manager-v0.12.0.tgz --output-dir . \
--namespace cert-manager \
--set image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-controller \
--set webhook.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-webhook \
--set cainjector.image.repository=<REGISTRY.YOURDOMAIN.COM:PORT>/quay.io/jetstack/cert-manager-cainjector
# 下载 cert-manager 所需的 CRD 文件
curl -L -o cert-manager/cert-manager-crd.yaml https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml
# 渲染Rancher Chart模板,<VERSION>是rancher的版本,<RANCHER.YOURDOMAIN.COM>访问rancher的域名,<CERTMANAGER_VERSION> 为cert-manager的版本,<REGISTRY.YOURDOMAIN.COM:PORT>仓库的ip/域名和端口
helm template rancher ./rancher-<VERSION>.tgz --output-dir . \
--namespace cattle-system \
--set hostname=<RANCHER.YOURDOMAIN.COM> \
--set certmanager.version=<CERTMANAGER_VERSION> \
--set rancherImage=<REGISTRY.YOURDOMAIN.COM:PORT>/rancher/rancher \
--set systemDefaultRegistry=<REGISTRY.YOURDOMAIN.COM:PORT> \
--set useBundledSystemChart=true # 自v2.3.0可用,使用内嵌的 Rancher system charts
# 把cert-manager和rancher两个文件夹复制进内网
tar -zcvf helm-chart.tar.gz cert-manager rancher
helm fetch rancher-stable/rancher --version=v2.5.7
,helm fetch jetstack/cert-manager --version v0.12.0
,curl -L -o cert-manager/cert-manager-crd.yaml https://raw.githubusercontent.com/jetstack/cert-manager/release-0.12/deploy/manifests/00-crds.yaml
其实就是获取helm模板,这里也上传到了httpd服务上进行复用,所以可以直接使用内网已经下载好的.然后在对cert-manager和rancher进行helm模板渲染
wget http://192.168.60.60/rancher-repo/rancher-2.5.7.tgz
wget http://192.168.60.60/rancher-repo/cert-manager-v0.12.0.tgz
# 如果是自己下载cert-manager-crd.yaml的话,渲染完cert-manager模板后要手动mv到cert-manager文件夹内
wget http://192.168.60.60/rancher-repo/cert-manager-crd.yaml
=================================== (rancher-001上执行)部署机器上执行 ===================================
# 解压压缩包
tar -zxvf helm-chart.tar.gz
# 安装cert-manager
kubectl create namespace cert-manager
kubectl apply -f cert-manager/cert-manager-crd.yaml
kubectl apply -R -f ./cert-manager
# 安装rancher
kubectl create namespace cattle-system
kubectl -n cattle-system apply -R -f ./rancher
# 查看rancher和cert-manager是否都启动成功
kubectl get pods -n cert-manager
kubectl get pods -n cattle-system
如果都启动成功,则在window访问机器上添加dns解析<ip> <domain>
,这里使用60.139作为负载均衡器,域名使用rancher.domain.com,添加完成后,页面访问rancher.domain.com
即可看到UI界面,设置一下密码,确认一下访问域名即可进入管理界面,至此kubernetes和rancher管理工具安装完成
6 NFS服务安装
NFS服务作为kubernetes中pod的PV使用,数据集中挂载,实现数据持久化存储
NFS 服务端安装(每台作为NFS服务的机器上执行)
安装
# 获取NFS服务安装包(有外网或者完整yum源直接yum install)
wget http://192.168.60.60/rancher-repo/nfs-utils-1.3.0-0.68.el7.x86_64.rpm
# 安装服务(这里还会依赖一个rpcbind)
rpm -ivh nfs-utils-1.3.0-0.68.el7.x86_64.rpm --force --nodeps
# 创建共享文件夹
mkdir -p /nfs
# 如果没有rpcbind需要自行安装(有外网或者完整yum源直接yum install)
wget http://192.168.60.60/rancher-repo/rpcbind-0.2.0-49.el7.x86_64.rpm
rpm -ivh rpcbind-0.2.0-49.el7.x86_64.rpm --force --nodeps
# 如果缺少libtirpc依赖需要安装libtirpc(有外网或者完整yum源直接yum install)
yum -y install libtirpc
配置NFS
# 编辑配置文件
vim /etc/exports
# 增加配置,配置可以访问的网段(rw-读写,sync-写入共享,no_subtree_check-不检查父目录权限)
/nfs 192.168.60.0/24(rw,sync,no_subtree_check,no_root_squash) 192.168.70.0/24(rw,sync,no_subtree_check,no_root_squash) 192.168.80.0/24(rw,sync,no_subtree_check,no_root_squash) 192.168.20.0/24(rw,sync,no_subtree_check,no_root_squash)
# 刷新NFS配置表(查看配置有没有正常更新)
exportfs -ra
# 找出NFS正在使用的端口(防火墙关可闭忽略)
rpcinfo -p | grep nfs
# 打开上面输出的端口(防火墙关可闭忽略)
firewalld-cmd -zone=public --add-port=2049/tcp --permanent
启动NFS
# 允许开机启动(nfs,依赖rpcbind)
systemctl enable rpcbind
systemctl enable nfs
# 启动NFS服务
systemctl start rpcbind
systemctl start nfs
客户端验证
# 获取NFS服务安装包(有外网或者完整yum源直接yum install)
wget http://192.168.60.60/rancher-repo/nfs-utils-1.3.0-0.68.el7.x86_64.rpm
# 安装服务(这里还会依赖一个rpcbind,没有的话自己装192.168.60.60 yum有)
rpm -ivh nfs-utils-1.3.0-0.68.el7.x86_64.rpm --force --nodeps
# 创建共享文件夹
mkdir /nfs
# 查看rpcbind是否启动,未启动自行启动
service rpcbind status
# 启动nfs
service nfs start
# 挂载目录
mount -t nfs -o nolock,nfsvers=3 -o proto=tcp 192.168.60.69:/nfs /nfs
# df -h 查看是否挂载成功,一下是成功的结果(如果出现权限问题,则需要修改服务端的权限,添加no_root_squash)
#[root@localhost apps]# df -h
#192.168.60.69:/nfs 48G 4.4G 44G 10% /nfs
# 取消nfs挂载
umount /nfs
7 部署机安装rancher-cli(自动部署的机器上执行)
在部署机上安装kubectl和rancher-cli
# 安装kuctl
wget http://192.168.60.60/ranche-repo/kubectl
chmod +x kubectl
mv ./kubectl /usr/local/bin/kubectl
# 安装rancher-cli
wget http://192.168.60.60/ranche-repo/rancher-linux-amd64-v2.4.10.tar.gz
tar -zxvf rancher-linux-amd64-v2.4.10.tar.gz
mv rancher-v2.4.10/rancher /usr/bin/
rm -rf rancher-v2.4.10
在rancher ui管理界面获取api&key,配置一个永不过期的key
# api访问地址
https://racher.domain.com/v3
# Access Key(用户名)
token-*****
# Screct Key(密码)
********************************************************************
# Bearer Token(凭据)
token-*****:********************************************************************
在部署机上测试凭据是否可用
# 登陆格式 rancher login <api访问地址> --token <Bearer Token>
rancher login https://racher.domain.com/v3 --token token-*****:********************************************************************
# 更新工作负载镜像命令
rancher kubectl set image deployment/simple-web simple-web=192.168.60.117/simple-3.2.4-demo/simple-web:20210429110850
8 kubernetes添加worker节点
准备新的机器192.168.60.66
,被添加的节点需要做一下初始化工作
编号 | 工作 | 执行机器 |
---|---|---|
1 | 关闭selinux | 192.168.60.66 |
2 | 更新/etc/hosts文件(添加192.168.60.66 rancher-004) | 192.168.60.63~65 |
3 | 添加所有的机器的hostname到/etc/hosts中 | 192.168.60.66 |
4 | 和192.168.60.60进行时间同步 | 192.168.60.66 |
5 | 关闭swap分区交换 | 192.168.60.66 |
6 | 安装docker | 192.168.60.66 |
7 | 添加rancher用户 | 192.168.60.66 |
8 | 添加免密登陆(ssh-copy-id rancher@192.168.60.66) | 192.168.60.63 |
9 | 修改rancher_cluster.yaml,并更新集群 | 192.168.60.63 |
前面8步上面的章节已经有相关的操作说明,照葫芦画瓢就可以了.这里重点说明一下第9步的部分
原始rancher_cluster.yaml
内容
nodes:
- address: 192.168.60.63 # 离线环境节点 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /root/.ssh/id_rsa
- address: 192.168.60.64 # 离线环境节点 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /root/.ssh/id_rsa
- address: 192.168.60.65 # 离线环境节点 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /root/.ssh/id_rsa
private_registries:
- url: 192.168.60.117 # 私有镜像库地址
user: admin
password: "Harbor12345"
is_default: true
修改后的rancher_cluster.yaml
内容
nodes:
- address: 192.168.60.63 # 离线环境节点 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /root/.ssh/id_rsa
- address: 192.168.60.64 # 离线环境节点 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /root/.ssh/id_rsa
- address: 192.168.60.65 # 离线环境节点 IP
user: rancher
role: ["controlplane", "etcd", "worker"]
ssh_key_path: /root/.ssh/id_rsa
# 主要添加66节点,因为本次添加的点只有工作节点,所以role只添加worker
- address: 192.168.60.66 # 离线环境节点 IP
user: rancher
role: ["worker"]
ssh_key_path: /root/.ssh/id_rsa
private_registries:
- url: 192.168.60.117 # 私有镜像库地址
user: admin
password: "Harbor12345"
is_default: true
执行更新命令
# 仅仅更新
rke up --update-only --config ./rancher_cluster.yaml
# 出现以下内容说明节点已经添加完成
#INFO[0424] Finished building Kubernetes cluster successfully
# 在master上查看新节点,192.168.60.66 这个节点已经被添加进来了
#NAME STATUS ROLES AGE VERSION
#192.168.60.63 Ready controlplane,etcd,worker 16d v1.20.4
#192.168.60.64 Ready controlplane,etcd,worker 16d v1.20.4
#192.168.60.65 Ready controlplane,etcd,worker 16d v1.20.4
#192.168.60.66 Ready worker 16m v1.20.4