K3S

环境声明

系统 配置 节点 部署
Ubuntu-Server(20.04) 2c4g root@m1(192.168.1.150) k3s(v1.24.9+k3s1) server + Mysql(5.7) + Helm(3.10.3)
Ubuntu-Server(20.04) 2c4g root@s1(192.168.1.151) k3s(v1.24.9+k3s1) agent + rancher(2.7)
Ubuntu-Server(20.04) 2c4g root@s2(192.168.1.152) k3s(v1.24.9+k3s1) agent + rancher(2.7)

P.S. 内存要大于2g,或者rancher单独部署一个节点,不然装了k3s后就装不了rancher。版本很重要,需要自己摸索,否则装不上报错


安装 Ubuntu-Server

下载地址:Get Ubuntu Server | Download | Ubuntu

语言:English

image-20230109165034623

是否更新:Continue without updating

image-20230109165225454

键盘选中文

image-20230109165509201

自定义网卡

1
2
3
4
5
Subnet: 子网掩码 192.168.1.0/24
Address: ip地址 192.168.1.150
GateWay: 网关 192.168.1.1
Name servers: DNS 223.5.5.5
Search domains: 填hostname m1
image-20230109165630421

设置 apt-getsnapd 的代理(非必须)

如果你能访问外网,可设置代理,此代理会在 /etc/apt/apt.conf.d/90curtin-aptproxy/etc/systemd/system/snapd.service.d/snap_proxy.conf 自动帮你配置好你写的代理,如果代理不可用,记得去这两个文件中删掉代理相关配置,否则 apt-getsnapd 命令会走代理而导致软件无法安装

如果你不能访问外网,这里无需填写,但后面所有的安装你都需要单独配置国内镜像,否则龟速下载或者超时。

image-20230109170408009
1
2
3
4
5
6
7
root@m1:~# cat /etc/apt/apt.conf.d/90curtin-aptproxy
#Acquire::http::Proxy "http://192.168.1.46:8889";
#Acquire::https::Proxy "http://192.168.1.46:8889";
root@m1:~# cat /etc/systemd/system/snapd.service.d/snap_proxy.conf
#[Service]
#Environment="HTTP_PROXY=http://192.168.1.46:8889"
#Environment="HTTPS_PROXY=http://192.168.1.46:8889"

Ubuntu Mirrors 地址:https://mirrors.tuna.tsinghua.edu.cn/ubuntu/

此处建议直接使用国内镜像地址,原理是帮你修改了 /etc/apt/sources.list,后面如果想换镜像地址记得来这里改。

image-20230109170556227

image-20230109171321173


分区:此处自行配置。如果你没有大容量存储挂载点,记得给根目录多一点空间。如果你有大容量存储挂载点,记得后面所有的组件都要考虑安装位置,也就是需要手动指定缓存、data等数据的存放问题,否则按照软件默认安装的位置,会堆满根目录。

image-20230109171016649 image-20230109171515103 image-20230109171552496

用户名、密码、hostname:

image-20230109171652594

安装SSH:这里记得安装,要不然后面还得去服务器上手动装一下,才能远程连接。

image-20230109171811578

其他应用:都不选,我们自己装

image-20230109172000503

安装完成,重启:如果它在安装更新,可以等一等,也可以取消直接重启。

然后ssh连接即可,先不要用root用户(目前你登不上),用你自己创建的那个用户远程登录。



准备工作

更改root密码(普通用户、所有节点)

1
sudo passwd root

允许root远程登录(普通用户、所有节点)

1
2
3
4
5
6
7
sudo nano /etc/ssh/sshd_config

PermitRootLogin yes
AllowTcpForwarding yes
AuthorizedKeysFile %h/.ssh/authorized_keys

sudo systemctl restart sshd

AllowTcpForwarding yesAuthorizedKeysFile %h/.ssh/authorized_keys 是为了后面如果使用 RKE 安装的准备工作,可以先不设置(本文暂不使用 RKE 安装)


切换为Root用户(普通用户、所有节点)

1
su - root

更改时区并同步时间(Root用户、所有节点)

1
2
3
4
5
sudo dpkg-reconfigure tzdata
sudo apt-get install ntpdate
ntpdate cn.pool.ntp.org
hwclock -w
reboot

dpkg-reconfigureAsia/Shanghai


更改hosts(Root用户、所有节点)

1
2
3
4
5
nano /etc/hosts

192.168.1.150 m1
192.168.1.151 s1
192.168.1.152 s2

节点相互免密(Root用户、所有节点)

1
2
3
4
ssh-keygen
ssh-copy-id m1
ssh-copy-id s1
ssh-copy-id s2

如果报 The authenticity of host 'm1 (192.168.1.150)' can't be established. ,可尝试 ssh-copy-id -o StrictHostKeyChecking=no m1。本机与本机也要免密


关闭防火墙(Root用户、所有节点)

1
2
systemctl disable ufw
systemctl stop ufw

设定host-name(Root用户、所有节点)

1
2
3
4
5
6
7
8
# m1单独执行
hostnamectl set-hostname m1

# s1单独执行
hostnamectl set-hostname s1

# s2单独执行
hostnamectl set-hostname s2

如果你在安装的时候配置了,此处无需配置。


安装docker(Root用户、所有节点)

1
curl -sSL https://get.daocloud.io/docker | sh

此处使用了国内镜像 daocloud 脚本执行,也可使用 curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun


禁用缓存(Root用户、所有节点)

1
2
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

必须关闭缓存,否则无法安装!


开启转发(Root用户、所有节点)

1
2
3
nano /etc/sysctl.conf
net.bridge.bridge-nf-call-iptables=1
sysctl -p /etc/sysctl.conf

其他

HttpSocket 代理

具体请搜索 proxychains4


安装 K3s

官方文档:K3s - Lightweight Kubernetes | K3s

中文文档:K3s - 轻量级 Kubernetes | Rancher文档

P.S. 后续所有操作均用ROOT用户执行


下载安装脚本与二进制文件(所有节点)

此处我们使用二进制手动安装,首先把安装脚本文件下载下来

外网:wget -O /tmp/k3s-install.sh https://get.k3s.io

国内:wget -O /tmp/k3s-install.sh https://rancher-mirror.rancher.cn/k3s/k3s-install.sh

再下载 k3s 二进制文件:Releases · k3s-io/k3s (github.com)

注意:请确认k3s的版本,这里建议先去rancher查看最新的稳定版支持的最大kubernetes版本是多少,否则后面rancher安装不了

所有文件我都放在/k3s里了

1
2
mkdir /k3s
mv /tmp/k3s-install.sh /k3s/

部署外部数据库(任意一个节点)

此处我选择部署 Mysql:5.7.31,采用 docker-compose 方式安装,生产环境请勿使用此方式安装

选用外部数据库的目的是为了 k3s高可用

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
41
42
43
apt -y install docker-compose
mkdir /k3s/mysql
cd !$
nano docker-compose.yaml

version: '3'
services:
mysql:
container_name: mysql57
image: mysql:5.7.31
restart: always
ports:
- 3306:3306
privileged: true
volumes:
- $PWD/log:/var/log/mysql
- $PWD/conf/my.cnf:/etc/mysql/my.cnf
- $PWD/data:/var/lib/mysql
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: "123465"
MYSQL_USER: 'k3s'
MYSQL_PASS: '123465'
networks:
- myweb

networks:
myweb:
driver: bridge

mkdir /k3s/mysql/conf /k3s/mysql/data /k3s/mysql/logs
touch /k3s/mysql/conf/my.cnf
docker-compose up -d
docker exec -it mysql57 /bin/bash

mysql -uroot -p123465
use mysql;
create user 'k3s'@'%' identified by '123465';
grant all privileges on k3s.* to 'k3s'@'%' with grant option;
flush privileges;
exit;

exit

安装

所有节点

1
2
3
4
cd /k3s
chmod a+x k3s
cp k3s /usr/local/bin/k3s
chmod a+x k3s-install.sh

P.S. 离线安装可先从 GitHubReleases · k3s-io/k3s (github.com),把 k3s 版本的镜像 tar 文件。

1
2
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp ./k3s-airgap-images-$ARCH.tar /var/lib/rancher/k3s/agent/images/

Server 节点(m1

1
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='server --docker' K3S_DATASTORE_ENDPOINT='mysql://root:123465@tcp(192.168.1.150:3306)/k3s' /k3s/k3s-install.sh

这里的安装参数可参考安装选项介绍 | Rancher文档,比如是否使用docker,定制化组件,多网卡指定等功能

此处是报错最容易出现、且是二进制安装最复杂的问题。如果出现问题,请先执行 journalctl -x ,找到含有 [k3s]表示的错误信息,然后google。

报错可能原因有:

  • 未禁用缓存 :swapoff -a

  • 数据库无法连接:请确保你能连上你的外部数据库

  • 多次安装但环境清除不干净:starting kubernetes: preparing server: bootstrap data already found and encrypted with different token

    使用 /usr/local/bin/k3s-uninstall.sh 先删除,然后清空数据库 k3s

  • 数据库编码问题:Jan 05 17:33:24 m1 k3s[206368]: time="2023-01-05T17:33:24+08:00" level=fatal msg="starting kubernetes: preparing server: creating storage endpoint: starting kine backend: Error 1267: Illegal mix of collations (ascii_general_ci,IMPLICIT) and (utf8mb4_general_ci,COERCIBLE) for operation 'like'",这个问题源于你的外部数据库(Mysql8.0),降级到5.7试一下,不要设定任何编码配置。

安装成功后,执行 kubectl get pods -ASTATUSError表示安装成功:

1
2
3
4
5
6
7
8
9
root@m1:/k3s# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7b5bbc6644-7llcm 1/1 Running 0 9m45s
kube-system local-path-provisioner-687d6d7765-5rsrx 1/1 Running 0 9m45s
kube-system helm-install-traefik-crd-k9rmd 0/1 Completed 0 9m46s
kube-system metrics-server-667586758d-pkzm4 1/1 Running 0 9m45s
kube-system helm-install-traefik-thkf8 0/1 Completed 2 9m46s
kube-system svclb-traefik-ce1649e0-9dkmv 2/2 Running 0 8m51s
kube-system traefik-64b96ccbcd-nwtrm 1/1 Running 0 8m51s

如果 kubectl get pods -A 报错 connection refused ,但你的k3s已经安装完成且无报错已启动,那可能需要你手动执行下配置

1
2
3
4
5
mkdir ~/.kube
nano ~/.kube/config
server: https://m1:6443
echo export KUBECONFIG=/etc/rancher/k3s/k3s.yaml>>/etc/profile
source /etc/profile

Agent 节点(s1s2

首先在Server节点查看 token

1
cat /var/lib/rancher/k3s/server/node-token

Agent节点执行

1
INSTALL_K3S_SKIP_DOWNLOAD=true K3S_TOKEN=K10051272bb1c7362352vdsf5c3e9d9dsxv972a36882b018753f85c7f04::server:14e34fa1aa95526e192273d1ff852e0b INSTALL_K3S_EXEC='agent --docker --server https://m1:6443' K3S_DATASTORE_ENDPOINT='mysql://root:123465@tcp(192.168.1.150:3306)/k3s' /k3s/k3s-install.sh

其他

删除k3s

Server: /usr/local/bin/k3s-uninstall.sh

Agent: /usr/local/bin/k3s-agent-uninstall.sh

数据库:清空k3s数据库


在线安装

1
2
3
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='server --docker --flannel-backend=wireguard' sh - 

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='agent --docker --server https://m1:6443' K3S_TOKEN=c8e82001e8bf628393a6a51ad345bbc9 sh -

这里我使用了 wireguard 加密流量(需要所有节点安装 wireguard),docker而不是默认containerd


目录表

此处列举下 k3s 相关的默认目录配置

名称 地址 备注
K3s registry /etc/rancher/k3s/registries.yaml 想配置私有仓库需在每个使用镜像仓库的节点上以 root 身份创建这个文件
containerd /var/lib/rancher/k3s/agent/etc/containerd/config.toml containerd配置文件
db /var/lib/rancher/k3s/server/db 嵌入式数据库文件
CoreDNS /var/lib/rancher/k3s/server/manifests/coredns.yaml 修改此文件重启失效,需要修改 /var/lib/rancher/k3s/server/manifests/c.yaml
Traefik /var/lib/rancher/k3s/server/manifests/traefik.yaml

升级 K3s

离线环境的升级可以通过以下步骤完成:

  1. K3s GitHub Release页面下载要升级到的 K3s 版本。将 tar 文件放在每个节点的/var/lib/rancher/k3s/agent/images/目录下。删除旧的 tar 文件。
  2. 复制并替换每个节点上/usr/local/bin中的旧 K3s 二进制文件。复制https://get.k3s.io 的安装脚本(因为它可能在上次发布后发生了变化)。再次运行脚本。
  3. 重启 K3s 服务。

安装 HelmServer节点)

我们通过安装Helm来安装RancherHelm | 快速入门指南

1
2
3
4
5
6
cd /tmp
wget https://mirrors.huaweicloud.com/helm/v3.10.3/helm-v3.10.3-linux-amd64.tar.gz
tar -xvzf helm-v3.10.3-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/

helm version

如果你有代理,也可使用如下方法一键安装:curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash


安装 RancherServer节点)

自定义证书

在安装Rancher之前,我们需要先生成自定义证书(10年有效期),如果你想使用rancher协助安装证书,或者使用LE,请参考官方文档使用的证书示例

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
mkdir /k3s/cert
nano create_self-signed-cert.sh
create_self-signed-cert.sh

#!/bin/bash -e

help ()
{
echo ' ================================================================ '
echo ' --ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为www.rancher.local,如果是ip访问服务,则可忽略;'
echo ' --ssl-trusted-ip: 一般ssl证书只信任域名的访问请求,有时候需要使用ip去访问server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开;'
echo ' --ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(SSL_TRUSTED_DOMAIN),多个扩展域名用逗号隔开;'
echo ' --ssl-size: ssl加密位数,默认2048;'
echo ' --ssl-cn: 国家代码(2个字母的代号),默认CN;'
echo ' 使用示例:'
echo ' ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \ '
echo ' --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650'
echo ' ================================================================'
}

case "$1" in
-h|--help) help; exit;;
esac

if [[ $1 == '' ]];then
help;
exit;
fi

CMDOPTS="$*"
for OPTS in $CMDOPTS;
do
key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
case "$key" in
--ssl-domain) SSL_DOMAIN=$value ;;
--ssl-trusted-ip) SSL_TRUSTED_IP=$value ;;
--ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;;
--ssl-size) SSL_SIZE=$value ;;
--ssl-date) SSL_DATE=$value ;;
--ca-date) CA_DATE=$value ;;
--ssl-cn) CN=$value ;;
esac
done

# CA相关配置
CA_DATE=${CA_DATE:-3650}
CA_KEY=${CA_KEY:-cakey.pem}
CA_CERT=${CA_CERT:-cacerts.pem}
CA_DOMAIN=cattle-ca

# ssl相关配置
SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'}
SSL_DATE=${SSL_DATE:-3650}
SSL_SIZE=${SSL_SIZE:-2048}

## 国家代码(2个字母的代号),默认CN;
CN=${CN:-CN}

SSL_KEY=$SSL_DOMAIN.key
SSL_CSR=$SSL_DOMAIN.csr
SSL_CERT=$SSL_DOMAIN.crt

echo -e "\033[32m ---------------------------- \033[0m"
echo -e "\033[32m | 生成 SSL Cert | \033[0m"
echo -e "\033[32m ---------------------------- \033[0m"

if [[ -e ./${CA_KEY} ]]; then
echo -e "\033[32m ====> 1. 发现已存在CA私钥,备份"${CA_KEY}"为"${CA_KEY}"-bak,然后重新创建 \033[0m"
mv ${CA_KEY} "${CA_KEY}"-bak
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
else
echo -e "\033[32m ====> 1. 生成新的CA私钥 ${CA_KEY} \033[0m"
openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
fi

if [[ -e ./${CA_CERT} ]]; then
echo -e "\033[32m ====> 2. 发现已存在CA证书,先备份"${CA_CERT}"为"${CA_CERT}"-bak,然后重新创建 \033[0m"
mv ${CA_CERT} "${CA_CERT}"-bak
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
else
echo -e "\033[32m ====> 2. 生成新的CA证书 ${CA_CERT} \033[0m"
openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
fi

echo -e "\033[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} \033[0m"
cat > ${SSL_CONFIG} <<EOM
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, serverAuth
EOM

if [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} || -n ${SSL_DOMAIN} ]]; then
cat >> ${SSL_CONFIG} <<EOM
subjectAltName = @alt_names
[alt_names]
EOM
IFS=","
dns=(${SSL_TRUSTED_DOMAIN})
dns+=(${SSL_DOMAIN})
for i in "${!dns[@]}"; do
echo DNS.$((i+1)) = ${dns[$i]} >> ${SSL_CONFIG}
done

if [[ -n ${SSL_TRUSTED_IP} ]]; then
ip=(${SSL_TRUSTED_IP})
for i in "${!ip[@]}"; do
echo IP.$((i+1)) = ${ip[$i]} >> ${SSL_CONFIG}
done
fi
fi

echo -e "\033[32m ====> 4. 生成服务SSL KEY ${SSL_KEY} \033[0m"
openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}

echo -e "\033[32m ====> 5. 生成服务SSL CSR ${SSL_CSR} \033[0m"
openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}

echo -e "\033[32m ====> 6. 生成服务SSL CERT ${SSL_CERT} \033[0m"
openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} \
-CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} \
-days ${SSL_DATE} -extensions v3_req \
-extfile ${SSL_CONFIG}

echo -e "\033[32m ====> 7. 证书制作完成 \033[0m"
echo
echo -e "\033[32m ====> 8. 以YAML格式输出结果 \033[0m"
echo "----------------------------------------------------------"
echo "ca_key: |"
cat $CA_KEY | sed 's/^/ /'
echo
echo "ca_cert: |"
cat $CA_CERT | sed 's/^/ /'
echo
echo "ssl_key: |"
cat $SSL_KEY | sed 's/^/ /'
echo
echo "ssl_csr: |"
cat $SSL_CSR | sed 's/^/ /'
echo
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^/ /'
echo

echo -e "\033[32m ====> 9. 附加CA证书到Cert文件 \033[0m"
cat ${CA_CERT} >> ${SSL_CERT}
echo "ssl_cert: |"
cat $SSL_CERT | sed 's/^/ /'
echo

echo -e "\033[32m ====> 10. 重命名服务证书 \033[0m"
echo "cp ${SSL_DOMAIN}.key tls.key"
cp ${SSL_DOMAIN}.key tls.key
echo "cp ${SSL_DOMAIN}.crt tls.crt"
cp ${SSL_DOMAIN}.crt tls.crt
1
2
./create_self-signed-cert.sh --ssl-domain=rancher.leofitz7.com --ssl-trusted-domain=rancher.leofitz7.com \
--ssl-trusted-ip=192.168.1.46,192.168.1.150,192.168.1.151,192.168.1.152 --ssl-size=2048 --ssl-date=3650

注意:--ssl-trusted-ip建议在生产环境配置,其他参数配置请参考脚本文件说明


配置证书:

1
2
3
kubectl create ns cattle-system
kubectl -n cattle-system create secret tls tls-rancher-ingress --cert=/k3s/cert/tls.crt --key=/k3s/cert/tls.key
kubectl -n cattle-system create secret generic tls-ca --from-file=/k3s/cert/cacerts.pem

执行Helm安装

参考文档:4. 安装 Rancher | Rancher Manager

1
2
3
4
5
6
7
8
9
10
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--set hostname=rancher.leofitz7.com \
--set ingress.tls.source=secret \
--set systemDefaultRegistry=registry.cn-hangzhou.aliyuncs.com \
--set replicas=2 \
--set bootstrapPassword=testrancher \
--set privateCA=true

如果安装报 Error: Kubernetes cluster unreachable ,是因为kubeconfig未注入环境变量

1
2
echo export KUBECONFIG=/etc/rancher/k3s/k3s.yaml>>/etc/profile
source /etc/profile

验证是否安装成功

1
kubectl -n cattle-system rollout status deploy/rancher

如果有报错,请在kubectl get pods -A -o wide 查看出错的 pod ,并用 kubectl describe pods -n 命名空间 pod名查看具体出错原因


安装 Nginx

配置证书、负载均衡

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
apt-get -y install nginx
nano /etc/nginx/conf.d

upstream rancher {
server s1:80;
server s2:80;
}

map $http_upgrade $connection_upgrade {
default Upgrade;
'' close;
}

server {
listen 443 ssl http2;
server_name rancher.leofitz7.com;
ssl_certificate /k3s/cert/tls.crt;
ssl_certificate_key /k3s/cert/tls.key;

location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://rancher;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# 这里将允许您在 Rancher UI 中打开命令行窗口时,窗口可以保留最多15分钟。没有这个参数时,默认值为1分钟,一分钟后在Rancher>中的shell会自动关闭。
proxy_read_timeout 900s;
proxy_buffering off;
}
}

server {
listen 80;
server_name rancher.leofitz7.com;
return 301 https://$server_name$request_uri;
}
1
2
3
systemctl enable nginx
nginx -t
nginx -s reload

访问页面

在服务器中配置 hosts

1
2
nano /etc/hosts
192.168.1.150 rancher.leofitz7.com

在你的电脑中配置 hosts

1
2
C:\Windows\System32\drivers\etc\hosts
192.168.1.150 rancher.leofitz7.com

访问Rancher主页

访问页面:https://rancher.leofitz7.com

如果你的k3srancher相关的pod都运行正常,但你仍无法访问,那我们排查的方法如下:

Server节点:

  • 查看rancher podip 地址

    1
    2
    kubectl get pods -A -o wide
    cattle-system rancher-76b88c9899-qbm7x 1/1 Running 3 (133m ago) 140m 10.42.0.22 m1
  • Server 节点上执行 curl --cert /k3s/cert/cacerts.pem --key /k3s/cert/cakey.pem --insecure https://rancher的ip:443 ,查看是否有 html输出。如果有输出,证明pod运行正常。

  • Server 节点上执行 curl --cert /k3s/cert/cacerts.pem --key /k3s/cert/cakey.pem --insecure https://rancher.leofitz7.com:443 ,查看是否有 html输出。如果有输出,证明pod运行正常,如果没有输出,则说明你的 dns pod 可能不正常,或者你的 hosts 不正常

你的电脑:

  • 尝试 ping https://rancher.leofitz7.com ,看是否能 ping 通,如果能 ping 通,且 ip地址为 server 节点的地址,才算正确
  • 尝试 tracert rancher.leofitz7.com,查看是否有多余的跃点或某跃点出现故障,逐一排查
  • 如果你开启了代理,请将此域名添加至白名单,让其直连,或者关闭代理,再次请求。

重置密码

1
kubectl -n cattle-system exec $(kubectl -n cattle-system get pods -l app=rancher | grep '1/1' | head -1 | awk '{ print $1 }') -- reset-password

在访问页面中输入此密码,成功进入 Rancher


其他

删除 Rancher

官方脚本删除:清理节点 | Rancher文档


其他方法:

这里的删除就不像k3s那样的脚本方便了,而且很容易出现长时间Termating

1
kubectl delete -n cattle-system MutatingWebhookConfiguration rancher.cattle.io

使用 kubectl get ns,查看与 Rancher 相关的 namespace,并手动 kubectl delete ns 命名空间,如果卡住,我们开启两个终端,其中一个执行 kubectl proxy ,另一个执行:

1
2
3
4
5
6
7
8
9
10
curl -H "Content-Type: application/json" -XPUT -d '{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"cattle-monitoring-system"},"spec":{"finalizers":[]}}' http://localhost:8001/api/v1/namespaces/cattle-monitoring-system/finalize
curl -H "Content-Type: application/json" -XPUT -d '{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"cattle-ui-plugin-system"},"spec":{"finalizers":[]}}' http://localhost:8001/api/v1/namespaces/cattle-ui-plugin-system/finalize
curl -H "Content-Type: application/json" -XPUT -d '{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"cattle-system"},"spec":{"finalizers":[]}}' http://localhost:8001/api/v1/namespaces/cattle-system/finalize
curl -H "Content-Type: application/json" -XPUT -d '{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"cattle-fleet-clusters-system"},"spec":{"finalizers":[]}}' http://localhost:8001/api/v1/namespaces/cattle-fleet-clusters-system/finalize
curl -H "Content-Type: application/json" -XPUT -d '{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"cattle-fleet-local-system"},"spec":{"finalizers":[]}}' http://localhost:8001/api/v1/namespaces/cattle-fleet-local-system/finalize
curl -H "Content-Type: application/json" -XPUT -d '{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"cattle-fleet-system"},"spec":{"finalizers":[]}}' http://localhost:8001/api/v1/namespaces/cattle-fleet-system/finalize
curl -H "Content-Type: application/json" -XPUT -d '{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"cattle-global-data"},"spec":{"finalizers":[]}}' http://localhost:8001/api/v1/namespaces/cattle-global-data/finalize
curl -H "Content-Type: application/json" -XPUT -d '{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"cattle-global-nt"},"spec":{"finalizers":[]}}' http://localhost:8001/api/v1/namespaces/cattle-global-nt/finalize
curl -H "Content-Type: application/json" -XPUT -d '{"apiVersion":"v1","kind":"Namespace","metadata":{"name":"cattle-impersonation-system"},"spec":{"finalizers":[]}}' http://localhost:8001/api/v1/namespaces/cattle-impersonation-system/finalize
c

请根据实际名称自行修改,强制删除命名空间