2603 字
13 分钟

基于k8s(v1.31.1)搭建的Rancher容器管理系统

🌟 什么是Rancher?#

Rancher 是一个 Kubernetes 管理工具,让你能在任何地方和任何提供商上部署和运行集群。

Rancher 可以创建来自 Kubernetes 托管服务提供商的集群,创建节点并安装 Kubernetes,或者导入在任何地方运行的现有 Kubernetes 集群。

Rancher 基于 Kubernetes 添加了新的功能,包括统一所有集群的身份验证和 RBAC,让系统管理员从一个位置控制全部集群的访问。

此外,Rancher 可以为集群和资源提供更精细的监控和告警,将日志发送到外部提供商,并通过应用商店(Application Catalog)直接集成 Helm。如果你拥有外部 CI/CD 系统,你可以将其与 Rancher 对接。没有的话,你也可以使用 Rancher 提供的 Fleet 自动部署和升级工作负载。

Rancher 是一个 全栈式 的 Kubernetes 容器管理平台,为你提供在任何地方都能成功运行 Kubernetes 的工具。

rancher
/
rancher
Waiting for api.github.com...
00K
0K
0K
Waiting...

Rancher登陆界面
Rancher主界面
Rancher功能展示

🧱 环境准备#

1. 主机信息(示例)#

主机名IP 地址角色
k8s-master192.168.25.10control-plane
k8s-node01192.168.25.11worker
k8s-node02192.168.25.12worker

🔧 第一步: 所有节点通用配置(master + node)#

1. 关闭防火墙(或放行必要端口)#

Terminal window
systemctl stop firewalld
systemctl disable firewalld
systemctl mask firewalld
systemctl is-active firewalld
systemctl status firewalld

2. 关闭SELinux#

Terminal window
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config

3. 关闭交换分区#

Terminal window
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab

4. 配置主机名和hosts#

Terminal window
# 在 master 上
hostnamectl set-hostname k8s-master
# 在 node1 上
hostnamectl set-hostname k8s-node1
# 在 node2 上
hostnamectl set-hostname k8s-node2

然后在 所有节点/etc/hosts 中添加以下内容:

Terminal window
cat >> /etc/hosts <<EOF
192.168.25.10 k8s-master
192.168.25.11 k8s-node01
192.168.25.12 k8s-node02
EOF

5. 各节点免密配置#

Terminal window
# 在每个节点上先执行以下命令,创建 SSH 密钥对
ssh-keygen -t rsa
/root/authorized.sh
# 编写一键配置脚本
#!/bin/bash
NODES=("192.168.25.10" "192.168.25.11" "192.168.25.12")
ME=$(hostname -I | awk '{print $1}')
[ ! -f ~/.ssh/id_rsa ] && ssh-keygen -t rsa -b 2048 -N "" -f ~/.ssh/id_rsa
mkdir -p ~/.ssh
chmod 700 ~/.ssh
> /tmp/cluster_keys
for ip in "${NODES[@]}"; do
if [[ "$ip" == "$ME" ]]; then
cat ~/.ssh/id_rsa.pub >> /tmp/cluster_keys
else
ssh -o StrictHostKeyChecking=no root@$ip 'cat ~/.ssh/id_rsa.pub' >> /tmp/cluster_keys 2>/dev/null || \
(echo "请先在 $ip 上运行 ssh-keygen" && exit 1)
fi
done
sort -u /tmp/cluster_keys -o /tmp/cluster_keys
for ip in "${NODES[@]}"; do
scp /tmp/cluster_keys root@$ip:/root/.ssh/authorized_keys
ssh root@$ip "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys && restorecon -R ~/.ssh"
done
echo "✅ 免密互信配置完成!"

6. 启动相关内核模块(用于Cilium)#

Terminal window
modprobe br_netfilter
modprobe xt_conntrack
modprobe overlay
echo "br_netfilter" >> /etc/modules-load.d/cilium.conf
echo "overlay" >> /etc/modules-load.d/cilium.conf
echo "xt_conntrack" >> /etc/modules-load.d/cilium.conf

(可选)配置kubelet

Terminal window
# 创建或编辑 kubelet 配置
cat > /etc/default/kubelet <<EOF
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
EOF
# 重启 kubelet
systemctl daemon-reload
systemctl restart kubelet

6. 设置 sysctl 参数#

Terminal window
cat > /etc/sysctl.d/k8s-cilium.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
sysctl --system

🐳 第二步: 安装 Containerd(所有节点)#

Kubernetes 1.29+ 已经弃用Docker Engine, 推荐使用 Containerd.

1. 安装依赖#

Terminal window
dnf install -y yum-utils device-mapper-persistent-data lvm2 vim wget curl net-tools bash-completion iproute-tc conntrack

2. 添加 DockerCE 仓库(用于获取 Containerd)#

Terminal window
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

3. 安装 Containerd#

Terminal window
dnf install -y containerd
dnf install -y containerd.io

4. 配置 Containerd#

Terminal window
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

编辑 /etc/containerd/config.toml,大概在100行左右, 找到 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options],确保 SystemdCgroup = true.

Terminal window
# 修改 containerd 配置:使用 systemd cgroup driver(重要!)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
cat /etc/containerd/config.toml | grep SystemdCgroup
Terminal window
# 同步 containerd 配置到所有节点
for ip in 192.168.25.1{0,1,2};do
scp /etc/containerd/config.toml root@$ip:/etc/containerd/config.toml
done

5. 启动并设置开机自启#

Terminal window
systemctl enable --now containerd

🧩 第三步: 安装 Kubernetes v1.31(所有节点)#

1. 添加 Kubernetes 仓库#

Terminal window
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/
enabled=1
gpgcheck=0
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.key
EOF
Terminal window
# 同步 kubernetes.repo 到所有节点
for ip in 192.168.25.1{0,1,2};do
scp /etc/yum.repos.d/kubernetes.repo root@$ip:/etc/yum.repos.d/kubernetes.repo
done

2. 安装 kubeadm, kubelet 和 kubectl#

Terminal window
# 安装指定版本
dnf install -y kubelet-1.31.0 kubeadm-1.31.0 kubectl-1.31.0 --disableexcludes=kubernetes
# 启用 kubelet(不启动,由 kubeadm 管理)
systemctl enable --now kubelet

⚠️ 注意: 不要启动 kubelet 服务,因为它由 kubeadm 管理,但 enable 是必要的。

🌐 第四步: 初始化 Master 节点(仅在 k8s-master 上操作)#

1. 初始化集群(禁用默认CNI)#

Terminal window
# 初始化控制平面(指定 pod 和 service 网段,Cilium 默认使用这些)
kubeadm init \
--control-plane-endpoint="192.168.25.10" \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--cri-socket=unix:///run/containerd/containerd.sock \
--kubernetes-version=v1.31.0
# 如果初始化失败可以尝试重置 kubeadm
kubeadm reset --cri-socket=unix:///run/containerd/containerd.sock -f
# -f 表示强制,不提示确认。

⚠️ 注意: 虽然 Cilium 默认使用 10.0.0.0/8,但为了兼容性我们先用 10.244.0.0/16(Flannel 默认段),Cilium 安装时会覆盖。你也可以直接用 10.0.0.0/8,但需保持一致。

✅ 成功后会输出 kubeadm join ... 命令,请保存!

如果没有保存可以使用 kubeadm token create --print-join-command 重新获取。

Terminal window
# 输出类似如下
kubeadm join 192.168.25.10:6443 --token 2xdavs.xx4aeo89dk99ioa6 \
--discovery-token-ca-cert-hash sha256:4a4b781096bd72fab079ef16a3a4b0a134b001ae705f2f6b0e9eaa0c8ee85dcf

2. 配置 kubectl#

Terminal window
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

3. (可选)启用 shell 自动补全#

Terminal window
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc

(可选)移除 master 节点的污点(可让 master 可调度)#

Terminal window
kubectl taint nodes --all node-role.kubernetes.io/control-plane-

如果你希望 master 不跑业务 Pod,可以跳过此步。

🧵 第五步: 安装Cilium CNI(仅在 k8s-master 上操作)#

Cilium 官方推荐使用 Helm 安装。

1. 安装 Helm(v3)#

Terminal window
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

2. 添加 Cilium Helm 仓库#

Terminal window
helm repo add cilium https://helm.cilium.io/
helm repo update

3. 安装 Cilium CNI(使用默认配置即可,自动检测环境)#

Terminal window
helm install cilium cilium/cilium \
--version 1.16.3 \
--namespace kube-system \
--set ipam.mode=kubernetes \
--set kubeProxyReplacement=true \
--set k8sServiceHost=192.168.25.10 \
--set k8sServicePort=6443 \
--set operator.replicas=1

kubeProxyReplacement=true 表示完全替代 kube-proxy(需要内核 ≥ 4.19)
ipam.mode=kubernetes:使用 K8s 原生 IP 分配(简单可靠)
ipam.mode=kubernetes 是默认值,可以省略。
--k8s-service-host/port 是为了绕过 kubeconfig 中的 localhost 问题(某些环境下需要)
如果你不确定是否支持完全替换,可先用 partial 模式。

Terminal window
--set kubeProxyReplacement=partial

但通常对于新部署,直接用 true 是安全的,只要:

  • 内核 ≥ 4.19
  • 启用 BPF 支持(containerd + systemd-cgroup 配置)

4. 验证 Cilium 安装#

Terminal window
# 检查 Cilium 组件是否运行
kubectl -n kube-system get pods -l k8s-app=cilium
kubectl exec -n kube-system ds/cilium -- cilium status --verbose

在输出中查找:

KubeProxyReplacement: Strict (或 "Probe" / "True")

如果显示 StrictTrue,说明成功启用了 eBPF 替代 kube-proxy。 应看到所有组件 OK

(可选)查看所有节点发现Kube-proxy存在解决办法#

Terminal window
kubectl -n kube-system delete ds kube-proxy

这是官方推荐做法:Kube-proxy-Free Quick-Start

删除后,Cilium 将完全接管 Service、NodePort、LoadBalancer 等功能。

验证 Cilium CNI#

Terminal window
kubectl get pods -n kube-system -l k8s-app=cilium

你应该看到所有 Cilium Pod Running,且状态为 Ready

👥 第六步: 加入工作节点(在 node01 和 node02 上)#

1. 执行 kubeadm join 命令(在 node01 和 node02 上操作)#

Terminal window
# 替换为你保存的 kubeadm join 命令
kubeadm join 192.168.25.10:6443 --token 2xdavs.xx4aeo89dk99ioa6 \
--discovery-token-ca-cert-hash sha256:4a4b781096bd72fab079ef16a3a4b0a134b001ae705f2f6b0e9eaa0c8ee85dcf

等待几分钟,成功加入后,在 k8s-master 上运行 kubectl get nodes 应该能看到 node01 和 node02。
应看到 3 个节点,状态为 Ready

🐄 第七步:部署 Rancher v2.13.1#

1. 安装 cert-manager(Rancher 依赖)#

Terminal window
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.15.3 \
--set installCRDs=true

等待 cert-manager pod 就绪:

Terminal window
kubectl wait --for=condition=ready pod -l app=cert-manager -n cert-manager --timeout=120s

2. 添加 Rancher Helm 仓库#

Terminal window
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update

3. 安装 Rancher (使用自签证书,仅用于测试)#

Terminal window
helm install rancher rancher-stable/rancher \
--namespace cattle-system \
--create-namespace \
--version 2.13.1 \
--set hostname=rancher.example.com \
--set replicas=1 \
--set bootstrapPassword=admin

⚠️ 请将 rancher.example.com 替换为你实际能解析的域名,或临时在本地 hosts 中绑定:

Terminal window
echo "192.168.25.10 rancher.example.com" >> /etc/hosts

如果没有添加--set bootstrapPassword=admin,可以使用如下命令获取初始密码

Terminal window
kubectl get secret --namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{"\n"}}'

4. 等待 Rancher 启动#

Terminal window
kubectl -n cattle-system rollout status deploy/rancher

5. 访问 Rancher 控制台#

浏览器访问:https://rancher.rancher.example.com

  • 首次登录密码为 admin
  • 登录后会提示修改密码

(可选)导入当前集群#

Rancher 默认会创建一个“Local”集群(即它自己运行的集群)。你可以在 UI 中查看节点、工作负载等。

如果你想用 Rancher 管理其他集群,可以点击 “Import Existing” → “Generic”。

🔍 遇到的报错及解决方案#

1. 通过浏览器访问不到Rancher UI#

问题描述:
浏览器访问 https://rancher.example.com 时,提示连接失败或超时。
初步排查:

  1. 检查域名是否正确解析到节点 IP。
  2. 确认节点 IP 是否在 --k8s-service-host 中指定。
  3. 检查节点防火墙是否放行 HTTPS 端口(默认 443)。

解决方案:#

⚠️ 注意: Nginx Ingress 官方已经停止维护,建议使用 Traefik 替代方案。

1. 安装 Nginx Ingress Controller (使用 Helm)#

Terminal window
# 添加 ingress-nginx 仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# 安装(使用 NodePort,便于测试)
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace \
--set controller.service.type=NodePort \
--set controller.admissionWebhooks.enabled=false

⏱️ 等待几分钟让 Pod 启动:

Terminal window
kubectl wait --namespace ingress-nginx \
--for=condition=ready pod \
--selector=app.kubernetes.io/component=controller \
--timeout=120s

2. 查看分配的 NodePort#

Terminal window
# 查看 NodePort
kubectl get svc -n ingress-nginx

你应该会看到类似:

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.96.123.123 <none> 80:32123/TCP,443:31987/TCP 2m

记下 443 对应的 NodePort(比如 31987)

3. 再次重试访问 Rancher UI#

现在你可以通过 HTTPS + NodePort 访问:
👉 [https://192.168.25.10:31987]

🔐 浏览器会提示证书不安全(因为是自签名),点击 “高级” → “继续前往” 即可。

或者,如果你配置了 DNS(rancher.exercisehx.top),也可以用:
👉 [https://rancher.exercisehx.top:31987]

💡 注意:必须用 https,不能用 http!

🛠️ 第一步: 验证 Ingress 是否生效#

安装 Nginx Ingress 后,检查是否有 Ingress 资源:

Terminal window
kubectl get ingress -A

你应该能看到类似:

NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
cattle-system rancher-ingress nginx rancher.example.com 192.168.25.10 80, 443 2m

如果 ADDRESS 列为空,可能是 Ingress Controller 还没完全就绪,稍等。

🛠️ 第二步: 确认 Ingress Class#

Rancher 默认创建的 Ingress 没有指定 ingressClassName,而较新版本的 ingress-nginx 要求显式声明或设置默认 IngressClass

1. 查看是否有默认 IngressClass#

Terminal window
kubectl get ingressclass

你应该能看到类似:

NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 2m

2. 检查 Ingress 是否有 IngressClassName#

Terminal window
kubectl get ingress rancher -n cattle-system -o jsonpath='{.spec.ingressClassName}'

如果输出为空,而集群 没有默认 IngressClass,那么 Nginx 就不会处理 Ingress 资源!

3. 解决方案#

有两种方法解决:

  1. 给 Rancher Ingress 显式指定 ingressClassName: nginx
Terminal window
kubectl patch ingress rancher -n cattle-system -p '{"spec":{"ingressClassName":"nginx"}}'

然后验证:

Terminal window
kubectl get ingress rancher -n cattle-system -o wide

输出应包含:

NAME CLASS HOSTS ADDRESS PORTS AGE
rancher nginx rancher.exercisehx.top 192.168.25.10 80, 443 5m
  1. 设置 nginx 为默认 IngressClass(推荐长期使用) 如果你希望所有未指定 class 的 Ingress 都由 nginx 处理:
Terminal window
kubectl annotate ingressclass nginx ingressclass.kubernetes.io/is-default-class="true" --overwrite

然后删除并重建 Rancher Ingress(或重新安装 Rancher),它会自动使用默认 class。

🔒 补充:后续如何重置密码(万一忘记)#

如果以后忘记了管理员密码,可以通过以下方式重置:

Terminal window
# 进入 Rancher Pod
kubectl exec -n cattle-system -it $(kubectl get pod -n cattle-system -l app=rancher -o jsonpath='{.items[0].metadata.name}') -- reset-password

它会输出一个临时新密码,用于登录后修改。


📋 总结#

✅ 验证清单#

  • 所有节点 Ready
  • Cilium pod 全部 Running
  • Rancher pod Running
  • 能通过浏览器访问 Rancher UI

🔒 安全建议(生产环境)#

  1. 不要关闭防火墙,而是精确放行端口。
  2. 使用 Let’s Encrypt 或企业证书代替自签名。
  3. Rancher 建议部署在 独立集群,避免权限污染。
  4. 启用 etcd 加密、PodSecurity、NetworkPolicy 等。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
基于k8s(v1.31.1)搭建的Rancher容器管理系统
https://exercisehx.top/posts/rancher-k8s/
作者
航.
发布于
2026-01-19
许可协议
CC BY-NC-SA 4.0

评论区

目录