基于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 的工具。



🧱 环境准备
1. 主机信息(示例)
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| k8s-master | 192.168.25.10 | control-plane |
| k8s-node01 | 192.168.25.11 | worker |
| k8s-node02 | 192.168.25.12 | worker |
🔧 第一步: 所有节点通用配置(master + node)
1. 关闭防火墙(或放行必要端口)
systemctl stop firewalldsystemctl disable firewalldsystemctl mask firewalld
systemctl is-active firewalldsystemctl status firewalld2. 关闭SELinux
setenforce 0sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config3. 关闭交换分区
swapoff -ased -i '/swap/s/^/#/' /etc/fstab4. 配置主机名和hosts
# 在 master 上hostnamectl set-hostname k8s-master
# 在 node1 上hostnamectl set-hostname k8s-node1
# 在 node2 上hostnamectl set-hostname k8s-node2然后在 所有节点 的 /etc/hosts 中添加以下内容:
cat >> /etc/hosts <<EOF192.168.25.10 k8s-master192.168.25.11 k8s-node01192.168.25.12 k8s-node02EOF5. 各节点免密配置
# 在每个节点上先执行以下命令,创建 SSH 密钥对ssh-keygen -t rsa# 编写一键配置脚本#!/bin/bashNODES=("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 ~/.sshchmod 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) fidone
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)
modprobe br_netfiltermodprobe xt_conntrackmodprobe overlayecho "br_netfilter" >> /etc/modules-load.d/cilium.confecho "overlay" >> /etc/modules-load.d/cilium.confecho "xt_conntrack" >> /etc/modules-load.d/cilium.conf(可选)配置kubelet
# 创建或编辑 kubelet 配置cat > /etc/default/kubelet <<EOFKUBELET_EXTRA_ARGS="--cgroup-driver=systemd"EOF
# 重启 kubeletsystemctl daemon-reloadsystemctl restart kubelet6. 设置 sysctl 参数
cat > /etc/sysctl.d/k8s-cilium.conf <<EOFnet.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1net.ipv6.conf.all.forwarding = 1EOF
sysctl --system🐳 第二步: 安装 Containerd(所有节点)
Kubernetes 1.29+ 已经弃用Docker Engine, 推荐使用 Containerd.
1. 安装依赖
dnf install -y yum-utils device-mapper-persistent-data lvm2 vim wget curl net-tools bash-completion iproute-tc conntrack2. 添加 DockerCE 仓库(用于获取 Containerd)
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo3. 安装 Containerd
dnf install -y containerd或dnf install -y containerd.io4. 配置 Containerd
mkdir -p /etc/containerdcontainerd config default > /etc/containerd/config.toml编辑
/etc/containerd/config.toml,大概在100行左右, 找到[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options],确保SystemdCgroup = true.
# 修改 containerd 配置:使用 systemd cgroup driver(重要!)sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.tomlcat /etc/containerd/config.toml | grep SystemdCgroup# 同步 containerd 配置到所有节点for ip in 192.168.25.1{0,1,2};do scp /etc/containerd/config.toml root@$ip:/etc/containerd/config.tomldone5. 启动并设置开机自启
systemctl enable --now containerd🧩 第三步: 安装 Kubernetes v1.31(所有节点)
1. 添加 Kubernetes 仓库
cat <<EOF > /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/enabled=1gpgcheck=0gpgkey=https://pkgs.k8s.io/core:/stable:/v1.31/rpm/repodata/repomd.xml.keyEOF# 同步 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.repodone2. 安装 kubeadm, kubelet 和 kubectl
# 安装指定版本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)
# 初始化控制平面(指定 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
# 如果初始化失败可以尝试重置 kubeadmkubeadm 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
mkdir -p $HOME/.kubecp -i /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config3. (可选)启用 shell 自动补全
echo "source <(kubectl completion bash)" >> ~/.bashrcsource ~/.bashrc(可选)移除 master 节点的污点(可让 master 可调度)
kubectl taint nodes --all node-role.kubernetes.io/control-plane-如果你希望 master 不跑业务 Pod,可以跳过此步。
🧵 第五步: 安装Cilium CNI(仅在 k8s-master 上操作)
Cilium 官方推荐使用 Helm 安装。
1. 安装 Helm(v3)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash2. 添加 Cilium Helm 仓库
helm repo add cilium https://helm.cilium.io/helm repo update3. 安装 Cilium CNI(使用默认配置即可,自动检测环境)
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 安装
# 检查 Cilium 组件是否运行kubectl -n kube-system get pods -l k8s-app=ciliumkubectl exec -n kube-system ds/cilium -- cilium status --verbose在输出中查找:
KubeProxyReplacement: Strict (或 "Probe" / "True")如果显示
Strict或True,说明成功启用了 eBPF 替代 kube-proxy。 应看到所有组件 OK。
(可选)查看所有节点发现Kube-proxy存在解决办法
kubectl -n kube-system delete ds kube-proxy这是官方推荐做法:Kube-proxy-Free Quick-Start
删除后,Cilium 将完全接管 Service、NodePort、LoadBalancer 等功能。
验证 Cilium CNI
kubectl get pods -n kube-system -l k8s-app=cilium你应该看到所有 Cilium Pod Running,且状态为 Ready。
👥 第六步: 加入工作节点(在 node01 和 node02 上)
1. 执行 kubeadm join 命令(在 node01 和 node02 上操作)
# 替换为你保存的 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 依赖)
helm repo add jetstack https://charts.jetstack.iohelm repo update
helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.15.3 \ --set installCRDs=true等待 cert-manager pod 就绪:
kubectl wait --for=condition=ready pod -l app=cert-manager -n cert-manager --timeout=120s2. 添加 Rancher Helm 仓库
helm repo add rancher-stable https://releases.rancher.com/server-charts/stablehelm repo update3. 安装 Rancher (使用自签证书,仅用于测试)
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 启动
kubectl -n cattle-system rollout status deploy/rancher5. 访问 Rancher 控制台
浏览器访问:https://rancher.rancher.example.com
- 首次登录密码为
admin - 登录后会提示修改密码
(可选)导入当前集群
Rancher 默认会创建一个“Local”集群(即它自己运行的集群)。你可以在 UI 中查看节点、工作负载等。
如果你想用 Rancher 管理其他集群,可以点击 “Import Existing” → “Generic”。
🔍 遇到的报错及解决方案
1. 通过浏览器访问不到Rancher UI
问题描述:
浏览器访问https://rancher.example.com时,提示连接失败或超时。
初步排查:
- 检查域名是否正确解析到节点 IP。
- 确认节点 IP 是否在
--k8s-service-host中指定。- 检查节点防火墙是否放行 HTTPS 端口(默认 443)。
解决方案:
⚠️ 注意: Nginx Ingress 官方已经停止维护,建议使用 Traefik 替代方案。
1. 安装 Nginx Ingress Controller (使用 Helm)
# 添加 ingress-nginx 仓库helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm 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
# 查看 NodePortkubectl get svc -n ingress-nginx你应该会看到类似:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEingress-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 资源:
kubectl get ingress -A你应该能看到类似:
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGEcattle-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
kubectl get ingressclass你应该能看到类似:
NAME CONTROLLER PARAMETERS AGEnginx k8s.io/ingress-nginx <none> 2m
2. 检查 Ingress 是否有 IngressClassName
kubectl get ingress rancher -n cattle-system -o jsonpath='{.spec.ingressClassName}'如果输出为空,而集群 没有默认 IngressClass,那么 Nginx 就不会处理 Ingress 资源!
3. 解决方案
有两种方法解决:
- 给 Rancher Ingress 显式指定
ingressClassName: nginx
kubectl patch ingress rancher -n cattle-system -p '{"spec":{"ingressClassName":"nginx"}}'然后验证:
kubectl get ingress rancher -n cattle-system -o wide输出应包含:
NAME CLASS HOSTS ADDRESS PORTS AGErancher nginx rancher.exercisehx.top 192.168.25.10 80, 443 5m
- 设置
nginx为默认 IngressClass(推荐长期使用) 如果你希望所有未指定 class 的 Ingress 都由 nginx 处理:
kubectl annotate ingressclass nginx ingressclass.kubernetes.io/is-default-class="true" --overwrite然后删除并重建 Rancher Ingress(或重新安装 Rancher),它会自动使用默认 class。
🔒 补充:后续如何重置密码(万一忘记)
如果以后忘记了管理员密码,可以通过以下方式重置:
# 进入 Rancher Podkubectl 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
🔒 安全建议(生产环境)
- 不要关闭防火墙,而是精确放行端口。
- 使用 Let’s Encrypt 或企业证书代替自签名。
- Rancher 建议部署在 独立集群,避免权限污染。
- 启用 etcd 加密、PodSecurity、NetworkPolicy 等。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
🌈Hang🎉
冀ICP备2025113765号-1