k8s
使用教程
是什么?
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。
- 自动部署容器(如
Docker
容器) - 实现服务自动扩容/缩容
- 监控容器状态,自动重启失败的容器
- 负载均衡和服务发现
- 滚动升级和回滚
- 管理配置(
ConfigMap
)、密钥(Secret
)
可以把 Kubernetes 理解为:管理成百上千个 Docker 容器的“集群管理工具”。
组成部分
集群图
Kubernetes
(K8s
)集群主要由两个大部分组成:控制平面(Control Plane
)和 工作节点(Node
)
控制平面(Control Plane
)
负责 集群的管理和调度决策,相当于“大脑”。
组件 | 作用 |
---|---|
kube-apiserver | 集群的唯一入口,所有操作都通过它进行(REST API 网关) |
etcd | 存储整个集群的状态数据。(键值数据库) |
kube-scheduler | 决定 Pod 运行在哪个节点上 |
kube-controller-manager | 负责各种控制器(如副本控制器、节点控制器) |
cloud-controller-manager (可选) | 管理云平台资源(如负载均衡、存储等) |
etcd
etcd
是一个 分布式键值存储系统,简单来说,它就像 Kubernetes
的「数据库」,存储整个集群的状态数据:
- 所有
Pod
、Deployment
、Service
的定义 - 节点状态、事件日志
- 配置(如
ConfigMap
、Secrets
) - 网络、存储、权限信息等
工作节点(Node
)
运行用户的容器化应用
组件 | 作用 |
---|---|
kubelet | 与 kube-apiserver 通信,负责启动/停止 Pod |
kube-proxy | 负责服务发现和网络转发 |
容器运行时(如 containerd ) | 真正运行容器的引擎 |
Pod (用户的应用) | 每个 Pod 里包含一个或多个容器 |
containerd
containerd
是一个 容器运行时(Container Runtime),它负责 拉取镜像、创建容器、运行容器、管理容器的生命周期。
在每个 Kubernetes
节点上,kubelet
需要一个容器运行时来真正运行 Pod
中的容器。containerd
就是这个运行时之一。
常见的容器运行时有:
containerd
(主流,轻量,K8s
推荐)CRI-O
(Red Hat
系推荐)Docker
(现在已不直接支持,被拆分)
从 Kubernetes 1.20 起,官方推荐使用 containerd
替代 Docker。
Pod
在 Kubernetes
中,Pod 是 最小的部署单元,它表示一个或多个容器的集合。简单来说,Pod 是 容器的宿主,它包含了需要一起运行的容器、存储卷、网络设置等。Pod
中的容器共享相同的网络和存储资源
一个用户的应用可以对应一个pod
;假设我们有一个 Nginx
和一个后台应用(如 springboot
)组成的 Pod:
Nginx
容器用来接收请求,springboot
容器处理请求。- 这两个容器在同一个 Pod 中,它们共享一个 IP 地址,可以直接通过
localhost
相互通信。
Kubernetes简单实践
创建一个Kubernetes
集群
创建 Kubernetes
集群的方式主要有两大类:本地部署 和 云端部署,各自适用于开发测试和生产环境。下面是常见方式汇总:
本地部署(适合学习/开发)
工具 | 特点 |
---|---|
Minikube | 最常用的本地单节点集群工具,适合入门 |
Kind (Kubernetes IN Docker) | 在 Docker 容器中运行 K8s ,适合快速测试 |
K3s | 轻量级 Kubernetes ,资源占用小 |
MicroK8s | Ubuntu 推出的轻量化 K8s ,可快速安装 |
云端托管服务(适合生产)
云平台 | 服务名称 | 特点 |
---|---|---|
阿里云 | ACK | 集成阿里云资源,企业用得多 |
腾讯云 | TKE | 易于和腾讯云服务打通 |
华为云 | CCE | 华为生态集成 |
Google Cloud | GKE | 官方出品,稳定强大 |
AWS | EKS | 和 AWS 服务深度集成 |
Azure | AKS | 微软 Azure 平台上的 K8s 服务 |
使用 Minikube 创建集群
本教程使用Minikube
创建集群
安装Minikube
安装步骤:https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Fx86-64%2Fstable%2Fhomebrew
本机是macOS,安装非常简单
brew install minikube
创建 Minikube 集群
minikube start
部署一个应用
安装 kubectl
这是一个命令行工具,用于操作 K8s 集群
brew install kubectl
kubectl
命令的常见格式是:kubectl action resource
这会对指定的资源(类似 node
或 deployment
)执行指定的操作(类似 create
、describe
或 delete
)
全称 | 简写 |
---|---|
pod | po |
service | svc |
deployment | deploy |
namespace | ns |
configmap | cm |
secret | secret |
Deployment
Deployment
是 Kubernetes
中用于声明式管理 Pod 的控制器。它描述了一个期望的 Pod
运行状态,Kubernetes
会持续确保实际状态匹配期望状态。
Deployment → 创建 ReplicaSet → 生成多个 Pod → 每个 Pod 被调度到一个 Node 上运行
Deployment
的主要功能
- 创建和维护所需数量的 Pod 副本;
- 在镜像或配置变更时进行 滚动升级;
- 在失败时 自动回滚;
- 确保 Pod 高可用(Pod 挂了会自动重建)。
Deployment
的完整结构说明
以deployment_nginx.yml
为例
apiVersion: apps/v1 # 使用的 API 版本
kind: Deployment # 表示资源的类型是 Deployment
metadata: # 元数据
name: my-app # Deployment 的名称
spec: # 具体的部署规则
replicas: 3 # Pod 副本数
selector: # 选择器,匹配下面模板中 Pod 的标签
matchLabels:
app: my-app
template: # Pod 模板,定义每个 Pod 的样子
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container # 容器名称
image: nginx:1.25 # 容器镜像
ports:
- containerPort: 80 # 容器暴露端口
- replicas: 指定要运行的 Pod 副本数
- selector: 用于匹配要管理的 Pod(必须与 Pod 模板中的标签匹配)
- template:定义 Pod 的模板
- metadata.labels: Pod 的标签
- spec: Pod 的具体规格
部署应用
创建 Deployment
kubectl apply -f deployment_nginx.yml
# 或
kubectl create -f deployment_nginx.yml
二者的区别
命令 | 行为 |
---|---|
kubectl create | 仅创建,资源已存在则报错 |
kubectl apply | 创建或更新,推荐用于持续部署 |
刚刚通过创建 Deployment
部署了第一个应用。这个过程中执行了以下一些操作:
- 创建
Deployment
- 创建
ReplicaSet
:Deployment
内部用来控制Pod
副本数的控制器 - 创建
Pod
:实际运行容器的单元(比如 nginx:1.25) - 调度
Pod
到节点运行:自动选择合适的节点来运行容器 - 持续监控与自愈:
Pod
异常时自动重建;副本数量不对时自动调整
探索你的应用
输入kubectl get all
查看所有资源(Pod/Deployment/Service
等)
kubectl describe pod <pod-name>
查看详细运行信息
kubectl logs <pod-name>
查看日志输出
kubectl exec -it <pod-name> -- /bin/bash
进入容器终端
公开发布你的应用
Kubernetes
推荐使用 Service
来暴露 Deployment
,使其可以被集群内外访问。
Service
是 Kubernetes
中的服务抽象对象,提供一组 Pod 的稳定访问入口(IP 和端口),实现负载均衡和服务发现。核心作用:
- 稳定 IP:为一组 Pod 提供一个固定虚拟 IP
- 负载均衡:请求会平均分配给后端多个 Pod
- 服务发现:其他 Pod 可以通过 DNS 名称访问这个 Service
- 跨主机访问:支持不同 Node 上 Pod 的通信
YAML
文件 nginx-service.yaml
示例
apiVersion: v1 # API 版本,定义使用的是 v1 版本的 Service
kind: Service # 资源类型,这里是一个 Service(服务)
metadata:
name: my-service # Service 的名称,可用于 kubectl 管理
spec:
selector: # 选择器,匹配具有以下标签的 Pod
app: my-app # 会选择所有具有 app=my-app 标签的 Pod
ports:
- protocol: TCP # 使用的协议,这里是 TCP
port: 80 # Service 对外暴露的端口(集群内访问时使用)
targetPort: 80 # 后端 Pod 容器监听的端口(如 Nginx 的端口)
nodePort: 30080 # (仅 NodePort 类型)映射到物理节点的端口,外部访问入口
type: NodePort # Service 类型
字段解释:
selector
:选择哪一组 Pod(根据标签)作为后端port
:Service
的端口,集群内部访问时用这个targetPort
: Pod 实际监听的端口type
:Service
类型ClusterIP
(默认):集群内访问NodePort
:集群外访问LoadBalancer
:公网访问,仅在云平台使用,会自动向云平台申请一个 公网负载均衡器 IPExternalName
:集群内的应用想访问外部的服务,将外部服务映射到该服务
创建Servic
通过yaml
文件创建
kubectl apply -f nginx-service.yaml
通过kubectl expose
创建
kubectl expose deployment my-app \
--port=80 \ # Service 暴露的端口(集群内访问)
--target-port=80 \ # Pod 的端口(默认与 --port 相同)
--type=NodePort \ # Service 类型
--name=my-service # 可选:自定义 Service 名称
但 kubectl expose
不支持直接指定 nodePort
,所以如果你需要自定义 nodePort
,必须使用 YAML
文件。
访问 Nginx
在 minikube
上运行的话,可以用:
minikube service my-service
这条命令会自动打开浏览器访问 Nginx 首页
或者自己手动
http://<Node IP>:30080
Node IP
可以通过 minikube ip
命令得到。如果你是使用docker
启动的minikube
需要提前将30080端口映射到本机。使用http://localhost:30080
访问。
总结
Deployment
负责运行多个Nginx
实例(Pod);Service
统一暴露访问口(Cluster 内或外部);NodePort
让你从宿主机访问集群内的服务。
扩大你的应用规模
手动扩缩容
修改pod
副本的数量
kubectl scale deployment <deployment-name> --replicas=5
自动扩缩容(Horizontal Pod Autoscaler,HPA)
HPA(Horizontal Pod Autoscaler
) 是 Kubernetes
提供的机制,用于根据资源使用情况(如 CPU 或内存)自动调整 Deployment/ReplicaSet/StatefulSet
的副本数量。
首先需要安装Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
这样安装会报TLS 证书验证失败,具体错误是:
tls: failed to verify certificate: x509: cannot validate certificate for 192.168.49.2 because it doesn’t contain any IP SANs
这表明 Kubelet 的 TLS 证书没有包含 192.168.49.2 这个 IP 地址作为 Subject Alternative Name (SAN),导致 Metrics Server 无法验证证书的有效性。
所有我们可以先把它下载下来
在kind:deployment
这块加上一行
kubectl apply -f components.yaml
验证安装是否成功:
kubectl top pods
使用kubectl autoscale
进行自动扩缩容
kubectl autoscale deployment <deployment-name> \
--cpu-percent=60 \
--min=2 \
--max=10
- HPA 会定时从 Metrics Server 获取 Pod 的资源使用情况
- 如果当前平均 CPU 使用率 > 设定阈值(如 60%),就增加副本
- 如果 < 60%,则减少副本
- HPA 控制器默认每 15 秒检查一次,约每 30 秒更新一次副本数
查看hpa
状态
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-app Deployment/my-app cpu: <unknown>/60% 2 10 0 9s
更新你的应用
在 Kubernetes
中,滚动更新(Rolling Update) 是 Deployment
的默认更新策略,它会逐个或按比例替换旧 Pod 为新 Pod,确保服务不中断,允许在更新过程中实现零停机。
触发滚动更新的方式
-
修改镜像版本
kubectl set image deployment/<name> <container-name>=<new-image> kubectl set image deployment/my-app my-container=nginx:1.27
-
修改
YAML
配置修改
yaml
文件中kubectl apply -f deployment.yaml
查看滚动更新过程
kubectl rollout status deployment/<name>
查看更新历史
kubectl rollout history deployment/<name>
回滚更新
回滚到上一个版本
kubectl rollout undo deployment/<name>
回滚到指定版本(需先查版本号)
kubectl rollout history deployment/<name>
kubectl rollout undo deployment/<name> --to-revision=<版本号>