K8S 入门以及命令指南
第一部分:K8S 核心概念入门
在学命令之前,理解其背后的核心概念至关重要。
Pod:
- 是什么:K8S 中最小的可部署和管理的计算单元。一个 Pod 包含一个或多个容器(通常是一个)、存储资源、唯一的网络 IP 以及管理容器运行方式的策略。
- 关键点:Pod 是短暂的(生灭无常的),每个 Pod 都有自己的 IP 地址,但该 IP 地址在 Pod 重启或重建后会改变。
Deployment:
- 是什么:管理 Pod 副本集和生命周期的控制器。它让你可以声明性地定义 Pod 的期望状态(例如,需要运行 3 个副本),Deployment 控制器会以可控的速率将实际状态改变为期望状态。
- 关键点:用于部署无状态应用、实现滚动更新、回滚和扩缩容。这是最常用的控制器之一。
Service:
- 是什么:一个抽象层,定义了一组 Pod 的逻辑集合和访问它们的策略。由于 Pod 是动态的(IP会变),Service 提供了一个稳定的 IP 地址和 DNS 名称作为访问入口。
- 关键点:为 Pod 提供稳定的网络访问和负载均衡。
Namespace:
- 是什么:一种在单个物理集群中创建多个虚拟集群的方法。它将资源划分为不同的分组,便于管理和隔离(例如,
dev
,test
,production
环境)。 - 关键点:默认有
default
,kube-system
(系统组件),kube-public
等命名空间。
- 是什么:一种在单个物理集群中创建多个虚拟集群的方法。它将资源划分为不同的分组,便于管理和隔离(例如,
Node:
- 是什么:一个工作机器,可以是物理机或虚拟机。每个 Node 由 Master 节点管理。
- 关键点:Pod 就运行在 Node 上。
Cluster:
- 是什么:由一组 Node(工作节点)和 Master(控制平面)组成的集合,是 K8S 的完整部署环境。
第二部分:必备的 kubectl
命令
kubectl
是命令行工具,用于与 K8S 集群交互。其基本语法是:kubectl [command] [TYPE] [NAME] [flags]
1. 基础查询命令
命令 | 说明 | 示例 |
---|---|---|
kubectl get <resource> |
列出资源 | kubectl get pods kubectl get services kubectl get deployments kubectl get nodes |
kubectl describe <resource>/<name> |
显示资源的详细信息 | kubectl describe pod/my-pod kubectl describe svc/my-service |
kubectl logs <pod-name> |
打印 Pod 中容器的日志 | kubectl logs my-pod kubectl logs -f my-pod (实时流式日志) |
kubectl exec -it <pod-name> -- <command> |
在 Pod 的容器中执行命令 | kubectl exec -it my-pod -- /bin/bash (进入容器) |
2. 创建和删除资源
命令 | 说明 | 示例 |
---|---|---|
kubectl apply -f <file.yaml> |
通过 YAML 文件创建或更新资源 | kubectl apply -f my-deployment.yaml |
kubectl create <resource> |
直接创建资源(不常用,更推荐 apply ) |
kubectl create deployment nginx --image=nginx |
kubectl delete -f <file.yaml> |
通过 YAML 文件删除资源 | kubectl delete -f my-deployment.yaml |
kubectl delete <resource>/<name> |
直接删除资源 | kubectl delete pod/my-pod kubectl delete deployment my-deploy |
3. 部署和更新
命令 | 说明 | 示例 |
---|---|---|
kubectl rollout status deployment/<name> |
查看部署的滚动更新状态 | kubectl rollout status deployment/my-app |
kubectl rollout history deployment/<name> |
查看部署的更新历史 | kubectl rollout history deployment/my-app |
kubectl rollout undo deployment/<name> |
回滚到上一个版本 | kubectl rollout undo deployment/my-app |
kubectl rollout undo deployment/<name> --to-revision=n |
回滚到指定版本 | kubectl rollout undo deployment/my-app --to-revision=2 |
kubectl scale deployment/<name> --replicas=<number> |
扩缩容 | kubectl scale deployment/my-app --replicas=5 |
4. 交互和故障排查
命令 | 说明 | 示例 |
---|---|---|
kubectl config current-context |
显示当前使用的上下文(集群) | |
kubectl config get-contexts |
列出所有上下文 | |
kubectl config use-context <context-name> |
切换上下文 | kubectl config use-context my-cluster |
kubectl port-forward <resource>/<name> <local-port>:<pod-port> |
将本地端口转发到 Pod 的端口 | kubectl port-forward my-pod 8080:80 (本地8080 -> Pod的80) |
kubectl top <node/pod> |
显示资源(Node/Pod)的 CPU/内存使用情况 | kubectl top nodes kubectl top pods |
第三部分:实战示例
假设我们有一个名为 my-app.yaml
的部署文件:
# my-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21.6
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
操作流程:
- 部署应用:
kubectl apply -f my-app.yaml
# 输出: deployment.apps/my-nginx created
# service/my-nginx-service created
- 检查部署状态:
kubectl get pods
# 输出: NAME READY STATUS RESTARTS AGE
# my-nginx-5d5d6f4666-2jqkm 1/1 Running 0 10s
# my-nginx-5d5d6f4666-kk9wp 1/1 Running 0 10s
# my-nginx-5d5d6f4666-xb8vp 1/1 Running 0 10s
kubectl get deployments
kubectl get services
- 访问应用(测试):
由于 Service 类型是ClusterIP
,我们使用port-forward
在本地访问。
kubectl port-forward svc/my-nginx-service 8080:80
然后在浏览器中打开 http://localhost:8080
,你应该能看到 Nginx 欢迎页面。
- 查看日志:
# 先获取 Pod 的名字
kubectl get pods
# 查看其中一个 Pod 的日志
kubectl logs my-nginx-5d5d6f4666-2jqkm
- 扩缩容:
kubectl scale deployment/my-nginx --replicas=5
kubectl get pods # 查看 Pod 数量变为 5 个
- 清理:
kubectl delete -f my-app.yaml
第四部分:学习建议和下一步(拓展版)
动手实践(本地环境搭建):
- Minikube:这是最经典的本地单节点 K8S 集群方案,非常适合初学者学习和测试。
- Kind (Kubernetes in Docker):使用 Docker 容器来作为 Nodes,快速启动一个 K8S 集群。启动速度通常比 Minikube 更快。
- Docker Desktop:对于 macOS 和 Windows 用户,Docker Desktop 内置了单节点的 Kubernetes 集群,一键即可启用,非常方便。
- 核心任务:在你的电脑上选择并安装上述任意一种工具,成功启动集群,并确保
kubectl get nodes
命令能返回一个 Ready 状态的节点。
精通 YAML 和
kubectl explain
:- K8S 的一切资源定义都是 YAML 文件。你需要熟悉 YAML 的语法结构,特别是缩进和键值对。
- 最佳学习工具:
kubectl explain
命令。当你不清楚一个资源该怎么配置时,不要急于上网搜索,先问kubectl explain
。- 例如:
kubectl explain deployment
会列出 Deployment 的一级字段。 - 例如:
kubectl explain deployment.spec.template.spec.containers
会深入解释 Pod 模板中 containers 字段的详细定义。
- 例如:
循序渐进学习核心概念:
不要试图一次学完所有概念。按照以下顺序,逐个击破,并为每个概念亲手实践:- 工作负载控制器:在熟悉 Pod 后,重点学习 Deployment(无状态应用),然后是 StatefulSet(有状态应用,如数据库)和 DaemonSet(每个节点运行一个,如日志收集器)。
- 配置管理:学习 ConfigMap(存储配置信息)和 Secret(存储密码、令牌等敏感信息),并理解如何将它们作为环境变量或卷挂载到 Pod 中。
- 持久化存储:学习 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC),理解如何为 Pod 申请和使用持久化存储,以保证数据在 Pod 重启后不丢失。
- 外部网络访问:学习 Ingress 和 Ingress Controller。这是将集群内部服务暴露给外部用户的主要方式。
利用官方文档和知识库:
- Kubernetes 官方文档:这是最权威、最全面的学习资源。
- Kubernetes API 文档:当你需要了解一个资源的所有可用字段时,API 文档是最详细的参考。
- Kubernetes 博客:关注官方博客,了解最新的版本特性、最佳实践和案例研究。
下一步进阶方向:
- 安全和权限:学习 ServiceAccount, Role, 和 RoleBinding (RBAC - 基于角色的访问控制)。
- 包管理工具 Helm:学习使用 Helm 来管理复杂的应用部署。
- 监控和日志:探索 Prometheus + Grafana 的监控组合,以及 EFK 或 Loki 的日志收集方案。
- CI/CD 流水线:尝试将你的 K8S 部署流程集成到 Jenkins, GitLab CI, GitHub Actions 或 ArgoCD 等工具中。