Kubernetes 基础:Pods、Deployments、Services 与 Namespaces
既然我们已经搭好了集群并确认其正常工作,现在是时候创建我们的第一个应用了。
不过在创建第一个应用之前,了解 Kubernetes 的基础知识至关重要。如果您希望更系统地入门 Kubernetes,我建议查看 Introduction to Kubernetes 课程。
Kubernetes 中最基础的概念是 Pod、Deployment 和 Service。掌握这三类资源即可帮助您构建强大的应用。下面我们就深入了解它们。
什么是 Pod?
Pod 是 Kubernetes 中最小的可部署单元。它运行一个或多个紧密耦合的容器,这些容器共享相同的存储、网络与命名空间。Pod 总是被调度到某个 Kubernetes 节点上。
您可以为 Pod 指定可用资源的配额(例如 CPU 和内存)。
一个包含两个容器的示例应用可以是:一个应用容器加一个汇总日志并将其发送到其他位置的辅助容器。
Pod 的特性:
- 单实例: 每个 Pod 运行您的应用的一个实例。
- 天生短暂: Pod 设计为临时性资源,发生故障或更新时会被替换。
创建 Pod 的示例 YAML:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx-container
image: nginx:1.21
ports:
- containerPort: 80
然后,您可以使用 kubectl 安装该 Pod:
kubectl apply -f pod.yaml
这将启动名为 my-pod 的 Pod,为您运行一个 nginx Web 服务器。
什么是 Deployment?
Deployment 是用于管理 Pod 生命周期的更高层级 Kubernetes 对象。它确保期望数量的 Pod 副本在运行,并负责更新与回滚。
Deployment 的特性:
- 副本管理:确保始终有期望数量的 Pod 在运行。
- 自愈:自动替换不健康的 Pod。
- 滚动更新:按步骤更新应用版本且可无停机(若配置得当)。
下面看看一个 Deployment 的 YAML 文件示例,同样创建 nginx Web 服务器,但这次包含三个副本:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
您可以使用 kubectl 安装该 Deployment:
kubectl apply -f deployment.yaml
上述操作会创建一个名为 nginx-deployment 的 Deployment,它会创建三个 Pod,每个 Pod 均运行 nginx 容器。
什么是 Service?
现在来说最后一部分:Service。
Service 是一种抽象,能够为 Pod 提供稳定的网络访问,即便其 IP 地址发生变化。它充当您的应用与外部客户端之间的桥梁。
但为什么需要这样做?每个 Pod 都有自己的 IP 地址,为何不能直接使用该 IP 地址?
可以!但不建议。为什么?
因为 Pod 是短暂的。当 Pod 不健康时,Deployment 会将其终止,并扩容出新的 Pod;而新 Pod 会有不同的 IP 地址。这样一来,想要使用您应用的客户端就必须在每次 Pod 崩溃时不断更新 IP 地址,而这类情况可能经常发生。
这就是 Service 发挥作用的地方:它会查找匹配特定标签的所有 Pod,并自动将流量路由给它们。如果某个 Pod 不健康,Service 会停止向其转发流量;若有新 Pod 启动,Service 会开始向新 Pod 转发流量。
Service 还会在 Deployment 的所有副本之间分配流量,这非常棒——意味着您可以通过增加实例数来分摊流量,而无需在应用逻辑中处理这些事。
Service 的类型:
- ClusterIP(默认):在集群内暴露 Service。
- NodePort:在集群外可访问的端口上暴露 Service。
- LoadBalancer:与云厂商集成,通过负载均衡器暴露 Service。
将我们的 nginx Web 服务器暴露到集群外的示例 YAML:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
您同样可以使用 kubectl 创建该 Service:
kubectl apply -f service.yaml
该 Service 会将进入 80 端口的流量分发给所有带有 app=nginx 标签的 Pod。
如果对新创建的 Service 运行 describe 命令,您应能看到现在有三个 endpoints,每个 endpoint 代表当前运行的某个 Pod 的 IP 地址:
kubectl describe service nginx-service
上述命令应返回类似以下内容:
Name: nginx-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx
Type: NodePort
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.104.53.131
IPs: 10.104.53.131
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 32256/TCP
Endpoints: 10.244.0.5:80,10.244.0.6:80,10.244.0.7:80
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
Pods、Deployments 与 Services 之间的关系
快速总结如下:
- Pods:代表单个应用实例。
- Deployments:管理 Pod 生命周期并确保其健康。
- Services:为 Pod 提供稳定访问,并实现内外部通信。
什么是 Namespace?
Kubernetes 中的 Namespace 允许您在集群内组织并隔离资源。您可以将其视为同一物理集群内的“虚拟集群”。
使用 Namespace 的好处:
- 关注点分离:不同团队或应用可在各自的命名空间内独立运作,互不影响。
- 资源管理:可以为不同命名空间设置资源配额和限制。
- 安全与访问控制:可在命名空间层面实施策略。
默认情况下,Kubernetes 自带一些内置命名空间:
- default:默认命名空间,若未特别指定,资源会创建在此处。
- kube-system:用于 Kubernetes 内部组件(如 API server、scheduler 等)。
- kube-public:公开可读的命名空间。
- kube-node-lease:用于跟踪节点心跳。
您可以使用 YAML 文件创建命名空间:
apiVersion: v1
kind: Namespace
metadata:
name: my-namespace
将其保存为 namespace.yaml 文件并通过以下命令应用:
kubectl apply -f namespace.yaml
运行下面的命令时,您应能看到所有默认命名空间及刚创建的命名空间列表:
kubectl get namespaces
之后,您可以在资源的 metadata 部分设置 namespace,即可在该命名空间内创建资源。
如果我们希望在新建的命名空间内创建 nginx Deployment,YAML 如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: my-namespace
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
现在,您需要显式声明要从新命名空间中获取资源,可使用 -n 参数:
kubectl get deployment -n my-namespace
使用 Kubernetes 管理您的第一个应用
好了,既然您已经熟悉了 Kubernetes 的基本概念,现在就把第一个 Web 应用部署到 Kubernetes,并尝试进行访问。
本章我们将创建一个 nginx Web 服务器,通过 Service 将其暴露到外部世界;随后对应用进行扩容,以模拟高并发;最后通过滚动更新将应用升级到新版本。
那么,让我们开始做些有趣的事情吧!
创建一个简单的 Web 应用 Deployment
第一步是为我们的 Web 服务器创建一个 Deployment,使用 Nginx 镜像来创建容器。
复制下面的代码并保存为 nginx-deployment.yaml 文件。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
然后使用以下命令将该 Deployment 应用到集群:
kubectl apply -f nginx-deployment.yaml
接着,您可以验证 Pod 是否在运行:
kubectl get pods
通过 Service 暴露应用
我们需要通过 Service 将 nginx Web 服务器暴露到外部。为此,我们将创建 NodePort 类型的 Service,因为我们希望从 Kubernetes 集群外的本机访问 nginx Web 服务器。
创建名为 nginx-service.yaml 的文件,并添加以下内容:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
然后使用以下命令应用该 Service:
kubectl apply -f nginx-service.yaml
最后,您可以用 minikube 获取访问 nginx Web 服务器的 URL:
minikube service nginx-service --url
在浏览器中打开该 URL,您应能看到 nginx Web 服务器的欢迎页面。

本地浏览器中 nginx 欢迎页的截图。
扩容应用
目前我们有一个 Pod 正在运行。但访问我们网页的用户可能会激增。这也是为什么在 Kubernetes 中,您可以快速扩容应用,让更多 Pod 同时运行。
Service 会自动发现属于该 Deployment 的所有 Pod,并将进入的请求在运行 nginx Web 服务器的所有 Pod 之间做负载均衡。这有助于在高流量情况下提升网页的整体性能。
让我们使用下面的命令将应用扩容到 3 个副本:
kubectl scale deployment nginx-deployment --replicas=3
现在再次获取所有正在运行的 Pod,应该是三个:
kubectl get pods
您也可以使用下面的命令获取 nginx-service 所连接的所有 endpoints。应返回三个 endpoint,每个 endpoint 都是一个独立的集群内部 IP 地址:
kubectl get endpoints nginx-service
滚动更新
现在来看看使用 Kubernetes 的另一大优势:滚动更新。
滚动更新的目标是在不发生任何停机的情况下更新您的 Web 应用。想象一下,如果像 Amazon 这样的公司每次发布新版本时网页都会宕机,将造成多大的经济损失。
通过滚动更新,Kubernetes 会先扩容一个新 Pod,检查其健康状况良好后,再缩容旧的 Pod。
默认情况下,Kubernetes 会确保至少有 75% 的期望 Pod 数量保持运行,且最多 25% 的 Pod 可不可用。这意味着在我们当前有三个副本的情境下,Kubernetes 会一次只新增一个 Pod,检查其健康后再缩容一个旧 Pod。这个过程会重复,直到所有 Pod 都更新到新版本。
现在我们把 nginx 镜像版本从 latest 改为 1.23 来进行滚动更新:
kubectl set image deployment/nginx-deployment nginx=nginx:1.23
然后使用以下命令监控发布状态:
kubectl rollout status deployment/nginx-deployment
输出应类似如下:
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out
并且在整个发布过程中,您的网页始终可访问,没有任何停机!
是不是很棒?
管理 Kubernetes 资源
Kubernetes 提供了强大的工具来检查、修改和删除各类资源。掌握高效的资源管理方式,有助于更好地进行故障排查、资源分配与整体集群维护。
本节我们将深入了解其他一些关键命令,帮助您有效管理资源,并在出现问题时进行排障。
查看集群资源
在更改任何资源之前,查看并检查当前在集群中运行的资源非常重要。
例如,您可以列出所有正在运行的 Pod、Service 和 Deployment,以了解集群中的情况:
# list running Pods
kubectl get pods
# list running Services
kubectl get services
# list running Deployments
kubectl get deployments
如果您想更深入地了解某个特定资源,可以使用 describe 命令:
kubectl describe deployment nginx-deployment
该命令会显示更多信息,包括滚动更新、扩缩容或镜像拉取事件等。如果出了问题,这通常是您首先应该查看的地方。
您还可以查看某个正在运行的 Pod 的日志,以了解 Pod 内部的运行状况,命令如下:
kubectl logs <pod-name>
删除资源
当资源不再使用时,清理它们同样重要,以便为新应用释放集群资源。
您可以使用以下命令删除某个 Pod:
kubectl delete pod <pod-name>
我们可以对某个 nginx Pod 这么做。不过,由于它们由 Deployment 管理,且期望副本数为 3,一个新 Pod 会立刻被扩容出来。
因此,在这里我们需要删除 nginx-deployment:
kubectl delete deployment nginx-deployment
运行该命令后,所有正在运行的 nginx Pod 都应被删除。
我们也可以删除某个命名空间中的所有资源。以下命令会删除我们在 default 命名空间(默认)中创建的所有资源:
kubectl delete all --all
结语
恭喜您!您已读到这里,并顺利迈出了学习 Kubernetes 的第一步。
通过本教程,您已经学会了:
- 使用 minikube 搭建本地 Kubernetes 集群。
- 使用 Pods、Deployments、Services 与 Namespaces(Kubernetes 的基本构件)。
- 在 Kubernetes 中部署并管理一个简单的 Web 应用。
- 动态扩缩容应用,并在无停机的情况下执行滚动更新。
- 通过列出、描述与删除来管理 Kubernetes 资源。
Kubernetes 起初看起来可能很复杂(对我而言至少如此)。但将其拆解为基础概念后,就会变得更易上手。
不断尝试,部署更多应用。
学习 Kubernetes 的最佳方式就是动手实践——马上开始构建吧!
若想进一步提升您的 Kubernetes 技能,不妨探索:
- 使用 ConfigMap 与 Secret: 安全地存储与管理配置信息。
- 持久卷: 学习如何通过持久卷在 Pod 重启后仍然保留数据。
- 网络与 Ingress 控制器: 配置基于域名的路由并管理外部流量。
- Helm: 使用 Helm Chart 高效打包并部署复杂应用。
- 云端的 Kubernetes: 体验 AWS EKS、Azure AKS 或 Google GKE 等托管式 Kubernetes 服务。
最后,DataCamp 上的 Containerization and Virtualization with Docker and Kubernetes 学习路径,是同时练习 Docker 与 Kubernetes 的绝佳资源。
FAQs
如何在 Kubernetes 中跨 Pod 重启持久化数据?
Kubernetes 的 Pod 是短暂的,这意味着它们重启时数据会丢失。若需持久化数据,可以使用持久卷(PV)与持久卷申领(PVC)。它们允许将数据独立于 Pod 的生命周期进行存储。您可以在 YAML 中定义持久卷,并将其挂载到 Pod 上,这样即使 Pod 被删除并重建,数据也会保留。
如何使用域名将 Kubernetes 应用暴露到互联网?
若要使用自定义域名将您的应用暴露到公网,您需要使用 Ingress 控制器。Ingress 允许您定义将外部流量路由到服务的规则。它通常需要一个外部的 LoadBalancer,以及指向集群的 DNS 配置。NGINX Ingress Controller 是管理 Kubernetes 流量的常用选择。
如何防止未授权访问,保障我的 Kubernetes 集群安全?
安全在 Kubernetes 中至关重要。以下是保护集群的几个关键步骤:
- 使用基于角色的访问控制(RBAC)按用户角色限制访问权限。
- 启用网络策略以限制 Pod 之间的流量。
- 定期更新 Kubernetes 及其依赖项以修补安全漏洞。
- 通过身份验证与授权机制限制 API 访问。
- 使用 Secret 安全地管理 API 密钥与凭据等敏感数据。
如何监控 Kubernetes 集群的性能?
您可以使用以下工具监控集群:
- Prometheus 与 Grafana——采集并可视化指标。
- Kubernetes Dashboard——用于集群管理的 Web UI。
- kubectl top——提供节点与 Pod 的 CPU 与内存使用情况。
- 如 Fluentd 或 Loki 的日志方案——集中化日志便于排障。
如何将 Kubernetes 应用部署到生产环境?
在生产环境中,您应当:
- 使用托管式 Kubernetes 服务,如 AWS EKS、Azure AKS 或 Google GKE。
- 通过水平 Pod 自动扩缩(HPA)与集群自动扩缩器(Cluster Autoscaler)实现自动扩缩容。
- 使用 CI/CD 流水线(如 GitHub Actions、ArgoCD 或 Jenkins)实现自动化部署。
- 遵循最佳实践保障集群安全,如 RBAC、网络策略与镜像扫描。
- 使用 Prometheus、Loki 或云原生监控方案监控集群。

我是一名云工程师,拥有坚实的电气工程、机器学习和编程基础。我的职业生涯始于计算机视觉领域,专注于图像分类,随后转向 MLOps 和 DataOps。我擅长构建 MLOps 平台、支持数据科学家,并交付基于 Kubernetes 的解决方案,以优化机器学习工作流。
当我开始做机器学习工程师时,很快意识到,构建模型并不是最大的挑战;如何可靠且可扩展地部署它们才是。
也是在那时,我接触到了 Kubernetes——这款容器编排工具几乎成了业界人人谈论的话题。
起初,我很难理解它复杂的架构。我尝试通过阅读文档和介绍 Kubernetes 基础的指南来学习更多,但理解起来依然吃力。
直到我开始亲自动手实践,一切才发生了变化。通过搭建自己的 Kubernetes 集群、尝试不同配置、部署一些小型应用,我逐渐把知识点串联起来。实操体验让我更有信心,也终于理解了 Kubernetes 如何在大规模场景下简化应用管理。
本教程旨在为您带来同样的动手体验。无论您是初学者,还是希望夯实基础,这份指南都会带您完成本地 Kubernetes 集群的搭建、应用部署与高效资源管理。
学完后,您将对Kubernetes 基础有扎实的理解,并准备好将这些技能应用到真实项目中!
开始之前
先来回顾一下跟随本指南所需的先决条件与工具。
先决条件
cd、ls等命令,以及使用 nano 或 vim 进行基础文本编辑。工具
环境
想了解 Kubernetes 与 Docker 的比较?请查看这篇深入的Kubernetes 与 Docker 对比,帮助您理解它们在容器化环境中的角色分工。
搭建本地 Kubernetes 集群
现在进入实操,开始搭建您的本地 Kubernetes 集群!
但什么是 Kubernetes 集群?Kubernetes 集群是一起为您的应用提供运行环境的一组节点。它由两个组件构成:
Kubernetes 的核心组件。图片来自 Kubernetes.io
安装 minikube
Minikube 可在 Windows、Linux 和 MacOS 上安装。请按照官方 Minikube 文档中 Get Started 部分的指引操作。
我在 Windows 上工作,但因为更喜欢 Linux 界面,会使用 WSL2。如果您想在 Windows 机器上配置 WSL2,请参阅 Microsoft 安装指南。
安装 kubectl
kubectl 是用于管理 Kubernetes 资源的命令行界面。您可以按照官方 Kubernetes 文档进行安装,或使用 minikube 的集成安装方式。
我建议按照官方 Kubernetes 文档进行安装,这样可以将
kubectl作为独立命令使用。若通过 minikube 使用,您需要在命令前加上minikube前缀。启动 minikube 集群
现在我们已经安装了 minikube,可以在具有管理员权限的终端中使用以下命令启动一个集群:
该命令会自动拉取所需的 Kubernetes 二进制文件,并为您启动一个单节点集群。
验证集群
我们现在可以验证集群状态,检查是否一切运行正常:
输出应类似如下:
我们还可以更进一步,使用 kubectl 获取集群中的所有节点,此时应该只有一个:
上述命令应返回类似以下的结果:
停止集群
如果暂时不需要集群,想要释放一些资源,可以运行:
下次继续使用 Kubernetes 时再重新启动即可。
删除集群
如果您想要彻底删除 minikube 集群及其上添加的所有资源,可以运行: