安装版本: k3s(v1.21.7+k3s1)
参考站内k3s实践高可用架构图
官方文档参考顺序(官方文档记录的顺序有点乱)
1 2 3 4 5 6
| 0. 查看对应版本: https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/rancher-v2-6-3/ 1. 基础架构: https://rancher.com/docs/rancher/v2.6/en/installation/resources/k8s-tutorials/infrastructure-tutorials/infra-for-ha-with-external-db/ 2. 负载均衡: https://rancher.com/docs/rancher/v2.6/en/installation/resources/k8s-tutorials/infrastructure-tutorials/nginx/ 3. 部署k3s: https://rancher.com/docs/rancher/v2.6/en/installation/resources/k8s-tutorials/ha-with-external-db/ 4. 安装helm和rancher: https://rancher.com/docs/rancher/v2.6/en/installation/install-rancher-on-k8s/ 5. 添加tls: https://rancher.com/docs/rancher/v2.6/en/installation/resources/tls-secrets/
|
关于Datastore的选择
k3s的server节点既是master也是node, 所以官方案例中只要两个server节点就可以做到高可用, 但前提是使用非etcd数据源作为datastore
k3s既支持外部数据源, 官方也内置了etcd和sqlite3, 此部分可参考https://docs.rancher.cn/docs/k3s/installation/ha-embedded/_index/
如果使用官方内置etcd. 可将配置替换如下
master1
1 2 3 4
|
export K3S_CLUSTER_INIT=true
|
master2/3...
1 2 3 4 5
|
export K3S_TOKEN=XXX export K3S_URL="https://xxx:6443"
|
主server
在最末尾添加数据库连接
自行替换数据库连接参数(https://rancher.com/docs/k3s/latest/en/installation/install-options/)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| # 外部MySQL源 export K3S_DATASTORE_ENDPOINT="mysql://root:root@tcp(192.168.56.103:3306)/k3s_xiaowu" # 外部etcd源 # export K3S_DATASTORE_ENDPOINT="https://10.0.0.60:2379,https://10.0.0.61:2379,https://10.0.0.62:2379" # export K3S_DATASTORE_CAFILE='/etc/etcd/etcd-ca.crt' # export K3S_DATASTORE_CERTFILE='/etc/etcd/server.crt' # export K3S_DATASTORE_KEYFILE='/etc/etcd/server.key' # KUBECONFIG: 解决k3s执行helm命令报错:Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version?timeout=32s": dial tcp [::1]:8080: connect: connection refused # helm v3版本不再需要Tiller,而是直接访问ApiServer来与k8s交互,通过环境变量KUBECONFIG来读取存有ApiServre的地址与token的配置文件地址,默认地址为~/.kube/config export KUBECONFIG=/etc/rancher/k3s/k3s.yaml export INSTALL_K3S_VERSION=v1.21.7+k3s1
# 自定义安装执行项 # 如果将 K3s 服务器置于外部负载均衡器之后,应该在服务器上使用 --tls-san 标志将负载均衡器的主机名和/或 IP 地址添加到证书中,否则集群证书不认rancher.k3s.cn或者对应的IP, 可能会出现如下错误: Unable to connect to the server: x509: certificate is valid for xxx, xxx, xxx, xxx, 127.0.0.1, not rancher.k3s.cn # 注: 如果不使用ipvs模式部署(默认iptables), 将带有`kube-proxy-arg`的几行去掉 # max-pods: 默认单node 110个pod, # --kube-apiserver-arg service-node-port-range: 端口范围 # --kube-proxy-arg --ipvs-scheduler=rr //设置ipvs的负载均衡算法,默认是rr # --kube-proxy-arg --ipvs-min-sync-period=5s // 刷新IPVS规则的最小时间间隔 # --kube-proxy-arg --ipvs-sync-period=30s // 刷新IPVS规则的最大时间间隔 # --egress-selector-mode=disabled // 该exec参数可以参见`https://github.com/k3s-io/k3s/issues/5897` # --kube-apiserver-arg service-node-port-range // node port范围, 默认30000-32767
# 启动 kubelet 的时候,可以配置这些参数控制镜像清理的策略: # image-gc-high-threshold:磁盘使用率的上限,当达到这一使用率的时候会触发镜像清理。默认值为 90% # image-gc-low-threshold:磁盘使用率的下限,每次清理直到使用率低于这个值或者没有可以清理的镜像了才会停止. 默认值为 80% # minimum-image-ttl-duration:镜像最少这么久没有被使用才会被清理,可以使用 h(小时)、m(分钟)、s(秒)和 ms(毫秒)时间单位进行配置,默认是 2m(两分钟), 也就是说默认情况下,当镜像占满所在盘 90% 容量的时候,kubelet 就会进行清理,一直到镜像占用率低于 80% 为止。
export INSTALL_K3S_EXEC="server \ --tls-san rancher.k3s.cn \ --kube-proxy-arg proxy-mode=ipvs \ --kube-proxy-arg ipvs-scheduler=lc \ --kube-proxy-arg ipvs-min-sync-period=5s \ --kube-proxy-arg ipvs-sync-period=30s \ --kube-proxy-arg masquerade-all=true \ --kube-proxy-arg metrics-bind-address=0.0.0.0 \ --kubelet-arg max-pods=110 \ --kubelet-arg=image-gc-high-threshold=90 \ --kubelet-arg=image-gc-low-threshold=80 \ --kube-apiserver-arg service-node-port-range=30000-40000"
|
1 2 3 4 5
| - source /etc/profile
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh |INSTALL_K3S_MIRROR=cn sh -
|
- 配置镜像加速(小记: 第一个
>>是追加, >是覆盖)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| - cat > /etc/rancher/k3s/registries.yaml <<EOF mirrors: "x.x.x.x:5000": endpoint: - "http://x.x.x.x:5000" "docker.io": endpoint: - "https://0vlzmqf0.mirror.aliyuncs.com" configs: "x.x.x.x:5000": auth: username: x password: x EOF
- systemctl restart k3s/systemctl restart k3s-agent
|
- 查看主server节点token,需要留给之后的副server节点和agent节点使用
1
| cat /var/lib/rancher/k3s/server/node-token
|
副server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| export K3S_TOKEN="添加 上面server 节点的 node-token"
export K3S_DATASTORE_ENDPOINT="mysql://root:root@tcp(192.168.56.103:3306)/k3s_xiaowu"
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml export INSTALL_K3S_VERSION=v1.21.7+k3s1
export INSTALL_K3S_EXEC="server \ --tls-san rancher.k3s.cn \ --kube-proxy-arg proxy-mode=ipvs \ --kube-proxy-arg ipvs-scheduler=rr \ --kube-proxy-arg ipvs-min-sync-period=5s \ --kube-proxy-arg ipvs-sync-period=30s \ --kube-proxy-arg masquerade-all=true \ --kube-proxy-arg metrics-bind-address=0.0.0.0 \ --kubelet-arg max-pods=110 \ --kube-apiserver-arg service-node-port-range=30000-40000"
|
执行:
1 2
| - source /etc/profile curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh |INSTALL_K3S_MIRROR=cn sh -
|
agent执行(之后再加agent节点也像这样执行)
1 2 3 4 5 6 7 8 9 10 11 12
| export K3S_TOKEN="添加 上面server 节点的 node-token"
export K3S_URL="主节点url:6443或者配置的loadbalence地址(对应着tls-san)" export INSTALL_K3S_VERSION=v1.21.7+k3s1
export INSTALL_K3S_EXEC="agent \ --kube-proxy-arg proxy-mode=ipvs \ --kube-proxy-arg masquerade-all=true \ --kube-proxy-arg metrics-bind-address=0.0.0.0 \ --kubelet-arg max-pods=110"
|
1 2
| - source /etc/profile curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
|
mkdir -p /etc/rancher/k3stouch /etc/rancher/k3s/registries.yaml- 配置镜像加速(同主server)
检查
- 为agent节点添加标签[加上worker ROLES],默认标签展示none
1
| kubectl label node k3s-agent1 node-role.kubernetes.io/worker=worker
|
1 2
| kubectl get nodes kubectl get pods --all-namespaces
|
负载均衡 kubectl(此示例是结合nginx配置负载kubectl)
安装nginx,并配置stream
1 2 3 4 5 6 7 8 9 10 11 12 13
| stream { upstream k3s { least_conn; server 10.0.2.17:6443 max_fails=3 fail_timeout=5s; server 10.0.2.16:6443 max_fails=3 fail_timeout=5s; server 10.0.2.15:6443 max_fails=3 fail_timeout=5s; } server { listen 6443; proxy_pass k3s; } }
|
将/etc/rancher/k3s/k3s.yaml文件放置在位于集群外部的计算机上,路径为~/.kube/config, 然后将该server字段的值替换为 K3s 服务器的 IP 或名称(此示例填写的<nginx服务器所属ip>:6443)。
安装kubectl, 参考站内kubectl的安装
编辑~/.kube/config
1 2 3 4 5 6 7
| apiVersion: v1 clusters: - cluster: certificate-authority-data: [CERTIFICATE-DATA] server: rancher.k3s.cn:6443 name: default ...
|
进入helm的安装篇
进入kubectl的安装篇