离线安装(单节点rancher)高可用rancher集群(ETCD)安装K8S集群以及常见问题

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 版本,请替换命令中的,替换为latest,stable或alpha。更多信息请参考如何选择 Rancher 版本。

latest: 最新版,建议在尝试新功能时使用。
stable:稳定版,建议生产环境中使用。
alpha:预览版, 未来版本的实验性预览。

helm repo add rancher- https://releases.rancher.com/server-charts/

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=/quay.io/jetstack/cert-manager-controller \
    --set webhook.image.repository=/quay.io/jetstack/cert-manager-webhook \
    --set cainjector.image.repository=/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-.tgz --output-dir . \
--namespace cattle-system \
--set hostname= \
--set certmanager.version= \
--set rancherImage=/rancher/rancher \
--set systemDefaultRegistry= \ # 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'

之后保存模版,在集群内部修改版本,等待更新

你可能感兴趣的:(k8s)