前言
在容器化技术飞速发展的今天,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集群,导入步骤如下:
- 登录Rancher后,点击【添加集群】,选择【导入】;
- 【集群名称】设置为 k8s-cluster(可自定义),点击【创建】;
- 页面会生成3条导入命令,选择第三条"绕过证书检查"的命令(避免证书验证问题),复制该命令;
- 在k8s控制节点(master01)执行复制的命令(若第一次执行报错,重新执行一次即可):
bash
curl --insecure -sfL https://192.168.10.23/v3/import/ltlhl7vggnwz8knbjncgbxqlrf6krpbfbxtzh4qlpnqxrq5559k6gf_c-jf5bx.yaml | kubectl apply -f -
- 验证导入结果:
- 查看命名空间,确认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自带的监控功能:
- 在Rancher集群页面,点击【启用监控以查看实时监控】;
- 【监控组件版本】选择 0.2.1(其他保持默认);
- 点击【启用监控】,耐心等待约10分钟(监控组件部署需要一定时间);
- 部署完成后,即可在Rancher页面查看集群的CPU、内存、网络等实时监控数据。
六、通过Rancher仪表盘管理K8s集群(以创建Nginx服务为例)
导入集群并启用监控后,就可以通过Rancher的可视化仪表盘管理k8s资源了。下面以创建Nginx服务为例,演示完整流程:
1. 创建命名空间(Namespace)
命名空间用于隔离不同环境的资源(如开发、测试、生产):
- 点击【仪表盘】进入k8s集群仪表盘界面;
- 左侧菜单选择【Namespaces】,点击右侧【Create】;
- 【Name】输入 dev(自定义命名空间名称),【Description】可选填描述;
- 点击右下角【Create】,完成命名空间创建。
2. 创建Deployment资源
Deployment用于定义Pod的部署规则(如副本数、镜像版本等):
- 左侧菜单选择【Deployments】,点击右侧【Create】;
- 基础配置:【Namespace】下拉选择 dev,【Name】输入 nginx-dev,【Replicas】输入 3(创建3个Pod副本);
- 容器配置:点击【Container】,【Container Image】输入 nginx:1.14(指定Nginx镜像版本),【Pull Policy】选择 IfNotPresent(优先使用本地镜像,本地没有再拉取);
- 标签配置:
- 在【Pod Labels】下点击【Add Label】,【Key】输入 app,【Value】输入 nginx(给Pod打标签,用于后续关联Service);
- 在【Labels and Annotations】下点击【Add Label】,【Key】输入 app,【Value】输入 nginx(给Deployment打标签);
- 点击右下角【Create】,完成Deployment创建。
3. 创建Service资源
Service用于暴露Pod的网络访问(这里使用NodePort类型,通过节点IP+端口访问Nginx):
- 左侧菜单选择【Services】,点击右侧【Create】;
- 选择【Node Port】类型(适合测试环境暴露服务);
- 基础配置:【Namespace】下拉选择 dev,【Name】输入 nginx-dev;
- 端口配置:【Port Name】输入 nginx,【Listening Port】输入 80(Service监听端口),【Target Port】输入 80(Pod的目标端口,与Nginx默认端口一致),【Node Port】输入 30180(节点端口,范围需在30000-32767之间);
- 关联Pod:点击【Selectors】,【Key】输入 app,【Value】输入 nginx(与Deployment的Pod标签一致,实现Service与Pod的关联);
- 点击右下角【Create】,完成Service创建。
4. 访问Nginx服务
- 点击创建好的【nginx-dev】Service,查看是否已成功关联3个Pod;
- 打开浏览器,访问任意工作节点IP+NodePort:http://192.168.10.20:30180 (或 http://192.168.10.21:30180);
- 若能看到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 设计的核心是解决"紧耦合容器的协同部署和资源共享"问题,具体意义如下:
- 资源共享:Pod 内所有容器共享网络(同一 IP,无需跨容器端口映射)、存储卷(Volume)、主机名,降低容器间通信和数据共享的复杂度。
- 原子调度:K8s 只会将整个 Pod 调度到同一台宿主机,保证紧密关联的容器始终在一起运行,避免"主容器在节点 A,边车容器在节点 B"的问题。
- 生命周期统一:Pod 是最小的管理单元,K8s 对 Pod 进行整体的创建、销毁、重启、扩缩容,而非单独管理容器。
- 简化部署:将"核心业务 + 辅助功能"封装为一个 Pod,对外呈现为一个独立的服务单元,简化部署和运维逻辑。
3. Pod 实现的机制
Pod 不是直接运行容器,而是通过 Pause 容器(基础设施容器) 实现核心机制,核心逻辑如下:
- Pause 容器作为 Pod 的"骨架" :
- 创建 Pod 时,K8s 首先启动一个 Pause 容器(镜像为
k8s.gcr.io/pause),它占用极少资源(CPU/内存),主要作用是"占坑"。 - Pause 容器会创建并持有 Pod 的网络命名空间(Network Namespace)、UTS 命名空间(主机名)、IPC 命名空间(进程间通信)。
- 创建 Pod 时,K8s 首先启动一个 Pause 容器(镜像为
- 业务容器共享 Pause 容器的命名空间 :
- 后续启动的主容器、边车容器等,都会加入 Pause 容器的命名空间,因此所有容器共享同一 IP、主机名、IPC 通信通道。
- 即使 Pod 内的业务容器重启,Pause 容器依然运行,Pod 的网络标识、存储卷等资源不会丢失,保证 Pod 身份不变。
- 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"] # 模拟异常退出
小结
- 核心概念:Pod 是 K8s 最小调度单元,包含主容器、初始化容器、边车容器等,通过 Pause 容器实现资源共享和生命周期锚定;
- 存在意义:解决紧耦合容器的协同部署、原子调度、资源共享问题,简化服务管理;
- 关键策略:镜像拉取策略(Always/IfNotPresent/Never)控制镜像获取方式,重启策略(Always/OnFailure/Never)决定容器异常时的重启规则。
总结
通过Rancher,我们无需深入学习k8s的复杂命令和概念,就能通过可视化界面完成集群管理、资源部署、服务暴露等操作,极大降低了k8s的使用门槛。本文演示的只是Rancher的基础功能,它还支持多集群管理、权限控制、持续集成/持续部署(CI/CD)等高级特性,足以满足企业级容器管理的需求。
如果你正在为k8s的复杂操作发愁,不妨试试Rancher,让容器管理变得简单高效!如果在实践过程中有任何问题,可参考Rancher官方文档(https://docs.rancher.cn/)获取更多支持。