1.单节点安装rancher(安装高可用rancher可直接跳过)
到https://github.com/rancher/rancher/releases下载rancher版本的镜像和创建rancher集群需要的镜像压缩包
将压缩包通过docker load -i rancherd-amd64.tar.gz解压
等待rancher容器启动即可
docker run -d --restart=unless-stopped
-p 80:80 -p 443:443
–privileged
rancher/rancher:latest
1.1如果rancher要删除
rancher清理
删除容器
docker stop sudo docker ps -aq
sudo docker rm -f sudo docker ps -aq
删除挂载卷:
sudo docker volume rm $(sudo docker volume ls -q)
删除相关文件:
sudo rm -rf /etc/cni
sudo rm -rf /etc/kubernetes
sudo rm -rf /opt/cni
sudo rm -rf /opt/rke
sudo rm -rf /run/secrets/kubernetes.io
sudo rm -rf /run/calico
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/lib/cni
sudo rm -rf /var/lib/kubelet
sudo rm -rf /var/log/containers
sudo rm -rf /var/log/pods
sudo rm -rf /var/lib/rancher
sudo rm -rf /var/run/calico
sudo rm -rf /var/run/docker
sudo rm -rf /var/lib/docker
sudo rm -rf /app/docker
2. 高可用rancher安装
所需环境 etcd,k3s集群
通过在K3S集群部署rancher,可防止rancher单节点被破坏之后的可用性,数据保存在etcd集群中,先介绍etcd的安装
2.1etcd安装
最常见的 etcd 的datastore-endpoint参数的格式如下:
https://10.137.97.191:2379,https://10.137.97.192:2379,https://10.137.97.193:2379
2.1.1下载和分发 etcd 二进制文件
在每个节点下载etcd二进制文件(外网下载)
wget https://github.com/coreos/etcd/releases/download/v3.3.7/etcd-v3.3.7-linux-amd64.tar.gz
在三台上都安装 etcd
tar -xvf etcd-v3.3.4-linux-amd64.tar.gz
cd etcd-v3.3.4-linux-amd64
cp mv etcd* /usr/local/bin/在三台上都安装 etcd
2.1.2cfssl安装
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
2.1.3创建 CA 证书配置,生成 CA 证书和私钥
mkdir /etc/k3s/ssl
cd /etc/k3s/ssl
cfssl print-defaults config > config.json
cfssl print-defaults csr > csr.json
生成 CA 证书和私钥
cd /etc/k3s/ssl
cfssl gencert -initca csr.json | cfssljson -bare ca
2.1.4创建 etcd 证书配置,生成 etcd 证书和私钥
在 /etc/k3s/ssl 下添加文件 etcd-csr.json,内容如下
hosts中加入etcd集群主机ip
{
“CN”: “etcd”,
“hosts”: [
“127.0.0.1”,
“10.137.97.191”,
“10.137.97.192”,
“10.137.97.193”
],
“key”: {
“algo”: “rsa”,
“size”: 2048
},
“names”: [
{
“C”: “CN”,
“ST”: “BeiJing”,
“L”: “BeiJing”,
“O”: “etcd”,
“OU”: “Etcd Security”
}
]
}
2.1.5生成 etcd 证书和密钥
cd /etc/k3s/ssl
cfssl gencert -ca=ca.pem
-ca-key=ca-key.pem
-config=config.json
-profile=kubernetes etcd-csr.json | cfssljson -bare etcd
将证书分别传到各个节点并设置权限
chmod 644 /etc/k3s/ssl/*
scp etcd-key.pem etcd.pem ca.pem root@ip:绝对路径
分别添加 etcd 配置
vim /etc/etcd/etcd.conf
# [member]
ETCD_NAME=hostname #不同机器需要做修改 与下面集群配置相对应
ETCD_DATA_DIR="/data/etcd"
ETCD_LISTEN_PEER_URLS="https://10.137.97.191:2380"
ETCD_LISTEN_CLIENT_URLS="https://10.137.97.191:2379,http://127.0.0.1:2379
# [cluster]
ETCD_ADVERTISE_CLIENT_URLS="https://10.137.97.191:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://10.137.97.191:2380"
ETCD_INITIAL_CLUSTER_STATE=new
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
添加系统服务
vim /usr/lib/systemd/system/etcd.service
initial-cluster中主机hostname必须正确
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
EnvironmentFile=/etc/etcd/etcd.conf
ExecStart=/usr/local/bin/etcd \
--cert-file=/etc/k3s/ssl/etcd.pem \
--key-file=/etc/k3s/ssl/etcd-key.pem \
--peer-cert-file=/etc/k3s/ssl/etcd.pem \
--peer-key-file=//etc/k3s/ssl/etcd-key.pem \
--trusted-ca-file=/etc/k3s/ssl/ca.pem \
--peer-trusted-ca-file=/etc/k3s/ssl/ca.pem \
--initial-cluster cnode11=10.137.97.191,cnode12=10.137.97.192,cnode13=10.137.97.193
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
创建 data 目录,然后启动 etcd 服务
mkdir -p /data/etcd
systemctl enable etcd.service && systemctl start etcd.service
查看 etcd 集群成员
etcdctl --endpoints=https://10.137.97.191:2379 --ca-file="/etc/k3s/ssl/ca.pem" --cert-file="/etc/k3s/ssl/etcd.pem" --key-file="/etc/k3s/ssl/etcd-key.pem" member list
验证 etcd 集群状态
etcdctl --endpoints=https://10.137.97.191:2379 --cacert="/etc/k3s/ssl/ca.pem" --cert="/etc/k3s/ssl/etcd.pem" --key="/etc/k3s/ssl/etcd-key.pem" cluster-health
问题1:
如果集群配置有误导致集群内每个节点都health但是不在同一个集群内可删除data目录下的member文件夹重新启动service
2.2安装k3s
2.2.1下载所需文件
https://github.com/k3s-io/k3s/releases/
并通过 https://get.k3s.io 获取 K3s 安装脚本。
下载同一版本的K3s 的二进制文件(k3s)、K3s 依赖的镜像(k3s-airgap-images-amd64.tar)
将 tar 文件放在images目录下,k3s启动命令默认使用contained容器执行,需要将镜像压缩包放在特定目录下,例如:
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/
将 k3s 二进制文件放在 /usr/local/bin/k3s路径,并确保拥有可执行权限。完成后,现在可以转到下面的安装 K3s部分,开始安装 K3s。
mv k3s /usr/local/bin
mv install.sh /var/lib/rancher/k3s/
chmod a+x /usr/local/bin/k3s /var/lib/rancher/k3s/install.sh
使用数据库实现高可用 使用etcd时需要添加证书参数
使用docker作为容器启动,如果不加–docker默认contained,
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='server --docker --write-kubeconfig ~/.kube/config --datastore-endpoint=https://10.137.97.191:2379,https://10.137.97.192:2379,https://10.137.97.193:2379' K3S_DATASTORE_CERTFILE='/etc/k3s/ssl/etcd.pem' K3S_DATASTORE_KEYFILE='/etc/k3s/ssl/etcd-key.pem' K3S_DATASTORE_CAFILE='/etc/k3s/ssl/ca.pem' ./install.sh
如果我们把/etc/rancher/k3s/k3s.yaml中的kubeconfig内容添加到~/.kube/config文件中,那我们安装kubectl之后就可以直接通 过kubectl控制k3s集群了
在Linux上安装带有curl的kubectl二进制文件
使用命令下载最新版本:
curl -LO “https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl”
安装kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
问题2:
用上面k3s执行命令,默认使用contained容器,然后装rancher时,镜像导进去十分麻烦,后使用docker作为启动容器,此时报错
kubelet cgroup driver: “cgroupfs” is different from docker cgroup driver: “systemd”
解决方法1:
修改文件vim /etc/docker/daemon.json
将docker中“exec-opts”: [“native.cgroupdriver=systemd”]改为cgroupfs,与k3s一致
然后,要选择添加其他 agent,请在每个 agent 节点上执行以下操作。K3S_URL为刚才配置主机的ip,token可通过下面命令查看后复制
同样需要将前面下载的k3s执行文件以及Install.sh放入各个节点
cat /var/lib/rancher/k3s/server/node-token
INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://10.137.97.191:6443 K3S_TOKEN= ./install.sh
调整K3S工作节点的服务配置文件,以将K3S的默认容器引擎从Containerd切换到Docker
work节点使用docker
编辑配置文件/etc/systemd/system/k3s-agent.service
内容如下:
ExecStart=/usr/local/bin/k3s \
agent --docker
问题3:coredns crashloopback issue.plugin/forward: no nameservers found
/etc/resolv.conf 加上nameserver
2.2.2安装helm(主要是为了生成template,可以在外网操作之后将文件复制到内网机器即可,内网不用下载helm)
Helm的每个版本都为各种操作系统提供二进制版本。这些二进制版本可以手动下载和安装。
下载您想要的版本
解压(tar -zxvf helm-v3.0.0-linux-amd64.tar.gz)
在未打包的目录中找到helm二进制文件,并将其移动到所需的目的地 (mv linux-amd64/helm /usr/local/bin/helm)
使用helm repo add来添加仓库,不同的地址适应不同的 Rancher 版本,请替换命令中的<CHART_REPO>,替换为latest,stable或alpha。更多信息请参考如何选择 Rancher 版本。
latest: 最新版,建议在尝试新功能时使用。
stable:稳定版,建议生产环境中使用。
alpha:预览版, 未来版本的实验性预览。
helm repo add rancher-<CHART_REPO> https://releases.rancher.com/server-charts/<CHART_REPO>
2.2.3渲染模版
获取Rancher Chart,您会看到对应的 tgz 文件下载到本地。–version可指定版本
helm fetch rancher-stable/rancher --version=v2.5.8
使用 Rancher 默认的自签名证书#
默认情况下,Rancher 会生成一个 CA 并使用 cert-manager 颁发证书以访问 Rancher Server 界面。
在可以连接互联网的系统中,添加 cert-manager 仓库。
helm repo add jetstack https://charts.jetstack.io
helm repo update
从 Helm Chart 仓库 中获取最新的 cert-manager Chart。
helm fetch jetstack/cert-manager --version v0.12.0
使用您期望的参数渲染 chart 模板,切记设置image.repository以便从私有镜像仓库中拉取 Chart。这将生成一个包含相关 YAML 的名为cert-manager的文件夹。
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模版
镜像参数如果没用私有镜像可删除
hostname使用域名,负载均衡对应的dns,可以提前设置好,后续rancher自动生成ingress可以通过域名访问
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 a default private registry to be used in Rancher
--set useBundledSystemChart=true # Use the packaged Rancher system charts
如果是离线安装,只需将生成的两个文件夹移入内网主机
2.3安装rancher
安装 Cert-manager(仅限使用 Rancher 默认自签名证书)#
如果您使用的是 Rancher 默认的自签名证书,请安装 cert-manager:
为 cert-manager 创建 namespace。
kubectl create namespace cert-manager
创建 cert-manager CRD。
kubectl apply -f cert-manager/cert-manager-crd.yaml
启动 cert-manager。
kubectl apply -R -f ./cert-manager
安装 Rancher:
kubectl create namespace cattle-system
kubectl -n cattle-system apply -R -f ./rancher
2.4rancher集群内安装k8s
在主页内,添加集群选项
选择创建自定义集群
然后进行集群配置信息
下一步之后进入集群注册命令界面
可以根据需要进行主机的角色选择,然后将生成的命令复制到需要添加的主机上执行
注意:需要在添加到集群的主机上设置对rancher域名的解析
之后等待添加成功即可
问题4:rancher内k8s集群问题
cattle-cluster-agent pod 起不来,查看日志,发现无法ping通rancher.linux.com 域名解析使用的时cluster集群内部的dns解析
所以只需要把本地的域名解析加上去,这里面方法很多
kubectl edit configmap coredns -nkube-system
只能把解析hosts做在k8s的coredns上。
在configmap下找到coredns,追加hosts这一段
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
}
#追加hosts这一段
hosts {
192.168.5.41 openkube.azhuan.ren
fallthrougu
}
prometheus :9153
forward . "/etc/resolv.conf"
cache 30
loop
reload
loadbalance
}
也可以直接在deployment里面设置
apiVersion: apps/v1
kind: Deployment
metadata:
name: cattle-cluster-agent
namespace: cattle-system
spec:
replicas: 1
selector:
matchLabels:
app: cattle-cluster-agent
template:
metadata:
labels:
app: cattle-cluster-agent
spec:
hostAliases:
- ip: "192.168.200.101"
hostnames:
- "rancher.test.com"
问题5:K8s v1.20 无法挂载 nfs provisioner
要解决这个问题只需要在kube-api启动参数中添加–feature-gates=RemoveSelfLink=false 重新启用metadata.selfLink 字段
rancher集群中构建的k8s集群修改
在 YAML 中修改kube-api参数
我用的rancher时v2.5.8
选中全局,在菜单栏中选择工具下的RKE集群模板
集群选项右边编辑YAML
kube-api添加 feature-gates: ‘RemoveSelfLink=false’
kube-api:
always_pull_images: false
pod_security_policy: false
secrets_encryption_config:
enabled: false
service_node_port_range: 30000-32767
extra_args:
feature-gates: 'RemoveSelfLink=false'
之后保存模版,在集群内部修改版本,等待更新