Rancher 管理 Kubernetes 集群与Pod的详解

前言

在容器化技术飞速发展的今天,Kubernetes(简称k8s)已成为容器编排的事实标准。但对于不少开发者和运维人员来说,k8s复杂的概念和操作门槛让人望而却步。而Rancher的出现,彻底解决了这一痛点------它作为开源的企业级多集群Kubernetes管理平台,能实现混合云+本地数据中心下k8s集群的集中部署与管理,既保障了集群安全性,又能加速企业数字化转型。目前全球已有超过40000家企业每天通过Rancher快速创新,足以见得它的实用性和可靠性。

本文将带你从零开始,一步步完成Rancher的安装配置、k8s集群导入、监控系统部署,以及通过Rancher仪表盘创建Nginx服务,让你无需深入钻研k8s细节,也能轻松玩转容器管理。

一、Rancher和K8s的核心区别

很多人会混淆Rancher和k8s,其实两者定位完全不同:

  • 相同点:两者都可用于容器的调度与编排;
  • 核心区别:Rancher的能力更全面------它不仅能管理应用容器,更关键的是能管理k8s集群。Rancher2.x底层基于k8s调度引擎,通过封装简化了复杂操作,让不熟悉k8s概念的用户也能轻松将容器部署到k8s集群中。

简单说,k8s是"容器编排引擎",而Rancher是"k8s集群的管理平台",是更高维度的工具。

二、实验环境准备

在开始操作前,需准备以下节点(本文使用的IP地址可根据实际环境替换):

  • 控制节点(master01):192.168.10.19
  • 工作节点(node01):192.168.10.20
  • 工作节点(node02):192.168.10.21
  • Rancher节点(rancher):192.168.10.23

所有节点需提前安装Docker和kubectl工具(确保k8s集群已正常部署)。

三、Rancher安装与登录

1. 下载并启动Rancher镜像

首先在对应节点执行镜像下载和容器启动命令:

  • 步骤1:在master01节点下载rancher-agent镜像
bash 复制代码
docker pull rancher/rancher-agent:v2.5.7
  • 步骤2:在rancher节点下载rancher镜像并启动容器
bash 复制代码
# 下载镜像
docker pull rancher/rancher:v2.5.7
# 启动容器(映射80/443端口,设置自动重启)
docker run -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged --name rancher rancher/rancher:v2.5.7

参数说明:--restart=unless-stopped 表示容器退出时自动重启(Docker守护进程启动时已停止的容器除外),--privileged 赋予容器特权模式,确保正常运行。

  • 步骤3:验证容器是否启动成功
bash 复制代码
docker ps -a|grep rancher

若输出类似以下内容,说明Rancher容器启动成功:

复制代码
1326da432b17   rancher/rancher:v2.5.7   "entrypoint.sh"   13 seconds ago   Up 13 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   rancher

2. 登录Rancher平台

  • 步骤1:等待容器初始化完成(约1-2分钟),打开浏览器访问 Rancher节点IP:http://192.168.10.23
  • 步骤2:由于未使用授信证书,浏览器会提示安全报警,直接忽略并继续访问;
  • 步骤3:首次登录后,若页面为英文,可点击右下角语言选项切换为中文,操作更便捷。

四、导入已存在的K8s集群

Rancher支持管理已部署的k8s集群,导入步骤如下:

  1. 登录Rancher后,点击【添加集群】,选择【导入】;
  2. 【集群名称】设置为 k8s-cluster(可自定义),点击【创建】;
  3. 页面会生成3条导入命令,选择第三条"绕过证书检查"的命令(避免证书验证问题),复制该命令;
  4. 在k8s控制节点(master01)执行复制的命令(若第一次执行报错,重新执行一次即可):
bash 复制代码
curl --insecure -sfL https://192.168.10.23/v3/import/ltlhl7vggnwz8knbjncgbxqlrf6krpbfbxtzh4qlpnqxrq5559k6gf_c-jf5bx.yaml | kubectl apply -f -
  1. 验证导入结果:
  • 查看命名空间,确认cattle-system、fleet-system已创建并处于Active状态:
bash 复制代码
kubectl get ns

输出示例:

复制代码
NAME              STATUS   AGE
cattle-system     Active   3m24s
default           Active   27d
fleet-system      Active   2m14s
kube-node-lease   Active   27d
kube-public       Active   27d
kube-system       Active   27d
  • 查看cattle-system命名空间下的Pod,确认状态为Running:
bash 复制代码
kubectl get pods -n cattle-system -o wide
  • 查看fleet-system命名空间下的Pod,确认状态为Running:
bash 复制代码
kubectl get pods -n fleet-system -o wide

当两个命名空间下的Agent Pod都正常运行时,说明k8s集群已成功导入Rancher。

五、部署Rancher监控系统

为了实时监控k8s集群的运行状态,需启用Rancher自带的监控功能:

  1. 在Rancher集群页面,点击【启用监控以查看实时监控】;
  2. 【监控组件版本】选择 0.2.1(其他保持默认);
  3. 点击【启用监控】,耐心等待约10分钟(监控组件部署需要一定时间);
  4. 部署完成后,即可在Rancher页面查看集群的CPU、内存、网络等实时监控数据。

六、通过Rancher仪表盘管理K8s集群(以创建Nginx服务为例)

导入集群并启用监控后,就可以通过Rancher的可视化仪表盘管理k8s资源了。下面以创建Nginx服务为例,演示完整流程:

1. 创建命名空间(Namespace)

命名空间用于隔离不同环境的资源(如开发、测试、生产):

  1. 点击【仪表盘】进入k8s集群仪表盘界面;
  2. 左侧菜单选择【Namespaces】,点击右侧【Create】;
  3. 【Name】输入 dev(自定义命名空间名称),【Description】可选填描述;
  4. 点击右下角【Create】,完成命名空间创建。

2. 创建Deployment资源

Deployment用于定义Pod的部署规则(如副本数、镜像版本等):

  1. 左侧菜单选择【Deployments】,点击右侧【Create】;
  2. 基础配置:【Namespace】下拉选择 dev,【Name】输入 nginx-dev,【Replicas】输入 3(创建3个Pod副本);
  3. 容器配置:点击【Container】,【Container Image】输入 nginx:1.14(指定Nginx镜像版本),【Pull Policy】选择 IfNotPresent(优先使用本地镜像,本地没有再拉取);
  4. 标签配置:
    • 在【Pod Labels】下点击【Add Label】,【Key】输入 app,【Value】输入 nginx(给Pod打标签,用于后续关联Service);
    • 在【Labels and Annotations】下点击【Add Label】,【Key】输入 app,【Value】输入 nginx(给Deployment打标签);
  5. 点击右下角【Create】,完成Deployment创建。

3. 创建Service资源

Service用于暴露Pod的网络访问(这里使用NodePort类型,通过节点IP+端口访问Nginx):

  1. 左侧菜单选择【Services】,点击右侧【Create】;
  2. 选择【Node Port】类型(适合测试环境暴露服务);
  3. 基础配置:【Namespace】下拉选择 dev,【Name】输入 nginx-dev;
  4. 端口配置:【Port Name】输入 nginx,【Listening Port】输入 80(Service监听端口),【Target Port】输入 80(Pod的目标端口,与Nginx默认端口一致),【Node Port】输入 30180(节点端口,范围需在30000-32767之间);
  5. 关联Pod:点击【Selectors】,【Key】输入 app,【Value】输入 nginx(与Deployment的Pod标签一致,实现Service与Pod的关联);
  6. 点击右下角【Create】,完成Service创建。

4. 访问Nginx服务

  1. 点击创建好的【nginx-dev】Service,查看是否已成功关联3个Pod;
  2. 打开浏览器,访问任意工作节点IP+NodePort:http://192.168.10.20:30180 (或 http://192.168.10.21:30180);
  3. 若能看到Nginx默认欢迎页面,说明服务创建成功。
    你想系统地了解 Kubernetes 中 Pod 的核心知识,包括它的概念、容器类型、存在意义、实现机制,以及镜像拉取和容器相关策略,我会从基础到核心机制,逐一为你清晰讲解。

七、 Pod 的详解

基本概念

Pod 是 Kubernetes 中最小的部署和调度单元,不是容器,而是一个"容器组"。你可以把 Pod 理解成一个"逻辑主机",里面可以封装一个或多个紧密关联的容器,这些容器共享网络命名空间(同一 IP、端口空间)、存储卷(Volume)等资源,在同一台宿主机上运行。

1.Pod 中的几种容器类型
容器类型 作用 使用场景
主容器(Main Container) 执行 Pod 的核心业务逻辑,是 Pod 存在的核心目的 运行 Web 服务(如 Nginx)、应用程序(如 Java 服务)等核心业务
初始化容器(Init Container) 在主容器启动前执行,完成初始化工作(如配置加载、依赖检查、数据准备) 启动前等待数据库就绪、下载配置文件、初始化目录权限等
边车容器(Sidecar Container) 与主容器并行运行,为核心业务提供辅助功能(非核心但必需) 日志收集(如 Fluentd)、监控采集(如 Prometheus Agent)、网络代理(如 Envoy)
临时容器(Ephemeral Container) 临时创建的调试容器,用于排查 Pod 故障(K8s 1.16+ 支持) 进入运行中的 Pod 查看日志、调试网络、检查文件系统等

示例:包含主容器 + 边车容器的 Pod 配置

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-sidecar
spec:
  containers:
  # 主容器:运行 Nginx
  - name: nginx-main
    image: nginx:alpine
    ports:
    - containerPort: 80
  # 边车容器:收集 Nginx 日志
  - name: log-collector
    image: fluentd:alpine
    volumeMounts:
    - name: nginx-log
      mountPath: /var/log/nginx
  volumes:
  - name: nginx-log
    emptyDir: {}

2. Pod 存在的意义

Pod 设计的核心是解决"紧耦合容器的协同部署和资源共享"问题,具体意义如下:

  1. 资源共享:Pod 内所有容器共享网络(同一 IP,无需跨容器端口映射)、存储卷(Volume)、主机名,降低容器间通信和数据共享的复杂度。
  2. 原子调度:K8s 只会将整个 Pod 调度到同一台宿主机,保证紧密关联的容器始终在一起运行,避免"主容器在节点 A,边车容器在节点 B"的问题。
  3. 生命周期统一:Pod 是最小的管理单元,K8s 对 Pod 进行整体的创建、销毁、重启、扩缩容,而非单独管理容器。
  4. 简化部署:将"核心业务 + 辅助功能"封装为一个 Pod,对外呈现为一个独立的服务单元,简化部署和运维逻辑。

3. Pod 实现的机制

Pod 不是直接运行容器,而是通过 Pause 容器(基础设施容器) 实现核心机制,核心逻辑如下:

  1. Pause 容器作为 Pod 的"骨架"
    • 创建 Pod 时,K8s 首先启动一个 Pause 容器(镜像为 k8s.gcr.io/pause),它占用极少资源(CPU/内存),主要作用是"占坑"。
    • Pause 容器会创建并持有 Pod 的网络命名空间(Network Namespace)、UTS 命名空间(主机名)、IPC 命名空间(进程间通信)。
  2. 业务容器共享 Pause 容器的命名空间
    • 后续启动的主容器、边车容器等,都会加入 Pause 容器的命名空间,因此所有容器共享同一 IP、主机名、IPC 通信通道。
    • 即使 Pod 内的业务容器重启,Pause 容器依然运行,Pod 的网络标识、存储卷等资源不会丢失,保证 Pod 身份不变。
  3. Pod 的生命周期由 Pause 容器锚定
    • K8s 通过监控 Pause 容器的状态判断 Pod 是否"存活",只要 Pause 容器运行,Pod 就被认为是"存在"的;只有 Pause 容器终止,整个 Pod 才会被销毁。

4. 镜像拉取策略(Image Pull Policy)

镜像拉取策略决定 K8s 在创建容器时何时从镜像仓库拉取镜像 ,核心配置为 imagePullPolicy,有 3 种取值:

策略值 触发拉取的条件 适用场景
Always 每次创建/重启容器时,都从镜像仓库拉取最新镜像 开发环境(需要实时更新镜像)
Never 从不拉取镜像,仅使用节点本地已存在的镜像;若本地无镜像,创建容器失败 离线环境(无外网访问)
IfNotPresent 仅当节点本地没有该镜像,或镜像标签不是 :latest 时,才从仓库拉取(默认策略) 生产环境(减少网络开销)

注意

  • 若镜像标签为 :latest,默认拉取策略为 Always
  • 若镜像标签为固定版本(如 nginx:1.25),默认拉取策略为 IfNotPresent

示例:配置镜像拉取策略

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pull-policy-demo
spec:
  containers:
  - name: nginx
    image: nginx:1.25  # 固定标签,默认 IfNotPresent
    imagePullPolicy: IfNotPresent  # 显式指定策略
  - name: busybox
    image: busybox:latest  # latest 标签,默认 Always
    imagePullPolicy: Always

5. 容器重启策略(Restart Policy,你提到的"镜像容器策略"核心是重启策略)

Pod 的重启策略决定 K8s 在容器异常退出时如何重启容器 ,配置为 restartPolicy,作用于 Pod 内所有容器,有 3 种取值:

策略值 重启规则 适用场景
Always 只要容器终止(无论退出码是 0 还是非 0),就自动重启(默认策略) 长期运行的服务(如 Web 服务)
OnFailure 仅当容器异常退出(退出码非 0)时重启;正常退出(退出码 0)不重启 一次性任务(如数据备份)
Never 容器终止后永不重启 测试/调试场景

注意

  • 重启策略是 Pod 级别的,无法为单个容器单独配置;
  • 重启操作是在原宿主机上重启容器,而非重新调度 Pod 到其他节点;
  • 若容器反复重启失败,K8s 会触发"退避策略"(back-off),重启间隔逐渐变长(10s → 20s → 40s...),避免频繁重启消耗资源。

示例:配置重启策略

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: restart-policy-demo
spec:
  restartPolicy: OnFailure  # 仅异常退出时重启
  containers:
  - name: backup-job
    image: busybox
    command: ["sh", "-c", "echo '备份数据' && exit 1"]  # 模拟异常退出

小结

  1. 核心概念:Pod 是 K8s 最小调度单元,包含主容器、初始化容器、边车容器等,通过 Pause 容器实现资源共享和生命周期锚定;
  2. 存在意义:解决紧耦合容器的协同部署、原子调度、资源共享问题,简化服务管理;
  3. 关键策略:镜像拉取策略(Always/IfNotPresent/Never)控制镜像获取方式,重启策略(Always/OnFailure/Never)决定容器异常时的重启规则。
总结

通过Rancher,我们无需深入学习k8s的复杂命令和概念,就能通过可视化界面完成集群管理、资源部署、服务暴露等操作,极大降低了k8s的使用门槛。本文演示的只是Rancher的基础功能,它还支持多集群管理、权限控制、持续集成/持续部署(CI/CD)等高级特性,足以满足企业级容器管理的需求。

如果你正在为k8s的复杂操作发愁,不妨试试Rancher,让容器管理变得简单高效!如果在实践过程中有任何问题,可参考Rancher官方文档(https://docs.rancher.cn/)获取更多支持。

相关推荐
可爱又迷人的反派角色“yang”16 小时前
k8s(二)
linux·运维·docker·云原生·容器·kubernetes·云计算
旧日之血_Hayter16 小时前
docker部署项目,/var/lib/docker/overlay2目录满了如何清理?
运维·docker·容器
m0_4887776516 小时前
Kubernetes基础
云原生·容器·kubernetes·yaml
文言一心16 小时前
基于 Docker + Docker Compose 实现一键部署(单节点部署场景下轻量、易维护、可一键启停)
运维·docker·容器
守护砂之国泰裤辣17 小时前
Windows+docker下简单kafka测试联调
java·运维·spring boot·docker·容器
释怀不想释怀17 小时前
Docker(常见命令)
docker·容器·eureka
hanyi_qwe17 小时前
K8S网络和基本命令 【 K8S (二)】
网络·容器·kubernetes
Zsr102317 小时前
Rancher:一站式Kubernetes管理平台,让容器运维更简单
运维·kubernetes·rancher
叽里咕噜怪17 小时前
Rancher
运维·rancher