Kubernetes(K8s)入门实践
前言
Kubernetes,简称 K8s,是一个开源的容器编排平台,主要用于自动化部署、扩展和管理容器化应用。
在云原生技术体系中,K8s 已经成为非常重要的基础设施能力。它可以帮助我们更高效地管理容器应用的整个生命周期,例如部署、扩容、滚动更新、故障恢复、服务发现和负载均衡等。
本文将按照自己的入门学习路线,介绍 Kubernetes 的基本概念、整体架构、核心组件以及常用实践。
1. 什么是 Kubernetes?
Kubernetes 是由 Google 开源的容器编排系统,主要用于自动化容器化应用的部署、扩展和管理。
在没有 Kubernetes 之前,如果我们想运行多个容器应用,通常需要手动处理很多事情,例如:
- 容器部署在哪台机器上
- 某个容器挂了如何自动恢复
- 多个容器之间如何通信
- 应用如何扩容和缩容
- 新版本如何平滑发布
- 服务如何对外暴露
而 Kubernetes 的出现,就是为了解决这些问题。
简单来说,Kubernetes 的目标是:
让容器化应用的部署和管理变得简单、高效和可靠。
Kubernetes 提供了很多能力,例如:
- 服务发现
- 负载均衡
- 自动扩缩容
- 滚动更新
- 故障自愈
- 配置管理
- 密钥管理
- 存储编排
2. K8s 架构
Kubernetes 采用主从架构,主要由 控制平面 Control Plane 和 工作节点 Worker Node 组成。
控制平面负责管理整个集群,工作节点负责真正运行应用容器。

可以简单理解为:
- Control Plane:负责管理和调度
- Worker Node:负责运行具体业务应用
2.1 Control Plane 控制平面
Control Plane 是 Kubernetes 集群的大脑,负责整个集群的管理、调度和状态维护。
核心组件包括:
| 组件 | 说明 |
|---|---|
| API Server | K8s 的统一入口,提供 REST API,所有请求都通过它处理 |
| Scheduler | 负责将 Pod 调度到合适的 Worker 节点 |
| Controller Manager | 负责维护集群状态,例如副本数量、节点状态等 |
| etcd | 高可用的键值存储,用于保存集群的所有数据 |
其中,API Server 是整个 Kubernetes 的入口。无论是用户执行 kubectl 命令,还是集群内部组件之间通信,最终都会通过 API Server 完成。
2.2 Worker Node 工作节点
Worker Node 是真正运行应用容器的节点。
每个 Worker Node 中通常包含以下组件:
| 组件 | 说明 |
|---|---|
| Kubelet | 运行在节点上,负责管理 Pod 和容器的生命周期 |
| Kube-proxy | 负责为 Service 提供网络代理和负载均衡 |
| Container Runtime | 容器运行时,负责真正启动和运行容器,例如 containerd |
在 Worker Node 上,业务应用最终会以 Pod 的形式运行。
3. 核心概念
Kubernetes 中有很多资源对象,可以先从以下几个核心概念开始。
3.1 Pod
Pod 是 Kubernetes 中最小的部署单元。
一个 Pod 中可以包含一个或多个容器,这些容器会共享网络、存储等资源。
通常情况下,一个 Pod 中只运行一个主要业务容器。

Pod 的特点:
- K8s 中最小的调度单位
- 一个 Pod 可以包含一个或多个容器
- 同一个 Pod 内的容器共享网络
- Pod 的生命周期通常比较短
- Pod 异常后可以被重新创建
Pod 示例:
yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
创建 Pod:
bash
kubectl apply -f pod.yaml
查看 Pod:
bash
kubectl get pods
3.2 Deployment
Deployment 用于管理无状态应用,是日常使用最频繁的资源对象之一。
它并不是直接运行容器,而是通过 ReplicaSet 来管理 Pod。

Deployment 的主要作用:
- 管理 Pod 副本数量
- 支持滚动更新
- 支持版本回滚
- 自动恢复异常 Pod
- 保证应用始终运行在期望状态
Deployment 示例:
yaml
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:latest
ports:
- containerPort: 80
创建 Deployment:
bash
kubectl apply -f deployment.yaml
查看 Deployment:
bash
kubectl get deployments
查看 Pod:
bash
kubectl get pods
3.3 Service
Pod 的 IP 地址不是固定的。当 Pod 被删除或重新创建后,它的 IP 地址可能会发生变化。
如果其他服务直接访问 Pod IP,就会出现访问不稳定的问题。
Service 的作用就是为一组 Pod 提供一个稳定的访问入口。

常见 Service 类型如下:
| 类型 | 说明 |
|---|---|
| ClusterIP | 默认类型,只能在集群内部访问 |
| NodePort | 通过节点端口暴露服务 |
| LoadBalancer | 通过云厂商负载均衡器暴露服务 |
| ExternalName | 将服务映射到外部域名 |
Service 示例:
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
3.4 Namespace
Namespace 用于在同一个 Kubernetes 集群中划分不同的逻辑空间。
它可以帮助我们将不同环境、不同项目或不同团队的资源进行隔离。

常见使用场景:
- 开发环境:dev
- 测试环境:sit / uat
- 生产环境:prod
- 不同团队资源隔离
- 不同项目资源隔离
创建 Namespace:
bash
kubectl create namespace dev
查看 Namespace:
bash
kubectl get namespaces
在指定 Namespace 中创建资源:
bash
kubectl apply -f deployment.yaml -n dev
查看指定 Namespace 下的 Pod:
bash
kubectl get pods -n dev
3.5 ConfigMap & Secret
在实际项目中,应用通常需要读取配置,例如端口号、数据库地址、环境变量等。
如果把这些配置直接写死在镜像中,就会导致镜像不够灵活。
Kubernetes 提供了 ConfigMap 和 Secret 来解决这个问题。
ConfigMap
ConfigMap 用于保存普通配置信息。
示例:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
APP_ENV: production
APP_PORT: "8080"
在 Pod 中使用 ConfigMap:
yaml
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: app-config
key: APP_ENV
Secret
Secret 用于保存敏感信息,例如密码、Token、证书等。
示例:
yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
stringData:
DB_PASSWORD: "123456"
在 Pod 中使用 Secret:
yaml
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
需要注意的是,Secret 虽然用于保存敏感数据,但并不代表默认就是绝对安全的。生产环境中还需要结合 RBAC、加密存储等方式一起使用。
4. 安装 K8s
学习 Kubernetes 可以选择多种安装方式。
如果只是本地学习,可以使用 Minikube 或 Kind。如果想更接近生产环境,可以使用 kubeadm 搭建集群。
4.1 使用 kubeadm 安装
kubeadm 是 Kubernetes 官方提供的集群初始化工具,适合学习 K8s 集群搭建过程。
安装前通常需要准备:
- 至少 2 台 Linux 服务器
- 关闭 swap
- 配置容器运行时
- 安装 kubeadm、kubelet、kubectl
- 配置网络插件
初始化 Master 节点:
bash
kubeadm init
初始化成功后,会生成一条 kubeadm join 命令,用于 Worker 节点加入集群。
配置 kubectl:
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看节点:
bash
kubectl get nodes
安装网络插件后,节点状态会逐渐变为 Ready。
4.2 本地学习环境推荐
如果只是入门学习,不建议一开始就搭建复杂集群,可以先使用 Minikube:
bash
minikube start
或者使用 Kind:
bash
kind create cluster
这两种方式更适合本地快速学习和实验。
5. 常用命令
Kubernetes 日常操作主要通过 kubectl 命令完成。
查看节点:
bash
kubectl get nodes
查看 Pod:
bash
kubectl get pods
查看所有资源:
bash
kubectl get all
查看 Deployment:
bash
kubectl get deployments
查看 Service:
bash
kubectl get svc
查看资源详情:
bash
kubectl describe pod pod-name
查看日志:
bash
kubectl logs pod-name
进入容器:
bash
kubectl exec -it pod-name -- /bin/sh
删除资源:
bash
kubectl delete -f deployment.yaml
查看当前上下文:
bash
kubectl config current-context
切换 Namespace:
bash
kubectl config set-context --current --namespace=dev
6. 部署一个示例应用
下面使用 Deployment 和 Service 部署一个简单的 Nginx 应用。
6.1 创建 Deployment
创建 nginx-deployment.yaml 文件:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-nginx
spec:
replicas: 2
selector:
matchLabels:
app: demo-nginx
template:
metadata:
labels:
app: demo-nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
执行命令:
bash
kubectl apply -f nginx-deployment.yaml
查看 Deployment:
bash
kubectl get deployments
查看 Pod:
bash
kubectl get pods
6.2 创建 Service
创建 nginx-service.yaml 文件:
yaml
apiVersion: v1
kind: Service
metadata:
name: demo-nginx-service
spec:
type: NodePort
selector:
app: demo-nginx
ports:
- port: 80
targetPort: 80
nodePort: 30080
执行命令:
bash
kubectl apply -f nginx-service.yaml
查看 Service:
bash
kubectl get svc
访问服务:
bash
http://节点IP:30080
如果使用的是 Minikube,可以执行:
bash
minikube service demo-nginx-service
6.3 扩容应用
将副本数扩容到 5 个:
bash
kubectl scale deployment demo-nginx --replicas=5
查看 Pod 数量:
bash
kubectl get pods
6.4 更新应用
修改镜像版本:
bash
kubectl set image deployment/demo-nginx nginx=nginx:1.25
查看更新状态:
bash
kubectl rollout status deployment/demo-nginx
6.5 回滚应用
如果新版本有问题,可以回滚到上一个版本:
bash
kubectl rollout undo deployment/demo-nginx
查看历史版本:
bash
kubectl rollout history deployment/demo-nginx