Kubernetes实战:从入门到精通
常用k8s命令分类
集群管理
kubectl cluster-info
查看集群基本信息,包括API Server地址和核心服务状态。
kubectl get componentstatuses
检查控制平面组件(如scheduler、controller-manager)的健康状态。
kubectl top node
显示节点的CPU/内存资源使用情况,需安装metrics-server。
节点操作
kubectl cordon <node-name>
将节点标记为不可调度,防止新Pod被分配。
kubectl drain <node-name> --ignore-daemonsets
清空节点上的Pod(DaemonSet除外),常用于节点维护。
kubectl uncordon <node-name>
恢复节点的可调度状态。
Pod管理
kubectl get pods -o wide
查看Pod列表及所在节点信息。
kubectl describe pod <pod-name>
显示Pod的详细配置和事件日志。
kubectl logs -f <pod-name> --container <container-name>
实时查看容器日志,多容器Pod需指定容器名。
kubectl exec -it <pod-name> -- /bin/sh
进入Pod的交互式Shell。
kubectl port-forward <pod-name> 8080:80
将本地8080端口映射到Pod的80端口。
部署管理
kubectl rollout status deployment/<deploy-name>
监控部署的滚动更新状态。
kubectl rollout undo deployment/<deploy-name>
回滚到上一个部署版本。
kubectl scale deployment <deploy-name> --replicas=5
手动扩展Deployment的副本数。
服务暴露
kubectl expose deployment <deploy-name> --type=NodePort
创建NodePort类型的服务。
kubectl get svc -A
查看所有命名空间的服务列表。
配置管理
kubectl create configmap <name> --from-file=<path>
从文件创建ConfigMap。
kubectl edit secret <secret-name>
直接编辑Secret内容(base64编码)。
故障排查
kubectl get events --sort-by=.metadata.creationTimestamp
按时间排序查看集群事件。
kubectl api-resources
列出所有可操作的API资源类型。
kubectl get all -A
查看所有命名空间的资源概览。
高级命令示例
批量操作
kubectl delete pods --field-selector=status.phase=Failed
删除所有状态为Failed的Pod。
kubectl get pods --no-headers | awk '{print $1}' | xargs kubectl delete pod
批量删除所有Pod(慎用)。
资源分析
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}'
提取所有Pod使用的镜像名称。
kubectl get deployment -o custom-columns=NAME:.metadata.name,RS:.status.replicas
自定义列格式输出。
调试技巧
kubectl run debug-tool --image=busybox --restart=Never --rm -it -- /bin/sh
启动临时调试容器。
kubectl debug -it <problem-pod> --image=ubuntu --target=<container-name>
使用Ephemeral Container调试运行中的Pod(需K8s 1.18+)。
YAML操作技巧
kubectl apply -f - <<EOF ... EOF
通过标准输入传递YAML内容。
kubectl get pod <pod-name> -o yaml > pod.yaml
导出资源配置为YAML文件。
kubectl diff -f updated.yaml
预览实际变更内容(需安装diff插件)。
一、Kubernetes 概述
Kubernetes(常简称为 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它最初由 Google 设计并开源,现已成为云原生计算基金会(CNCF)的旗舰项目,是容器编排领域的事实标准。
核心价值:
- 自动化运维:自动部署、回滚、扩缩容、故障恢复。
- 服务发现与负载均衡:自动为容器分配 IP 地址和 DNS 名称,并实现流量分发。
- 存储编排:自动挂载存储系统(本地、云存储、网络存储等)。
- 自我修复:重启失败容器、替换不可用节点、杀死不健康容器。
- 密钥与配置管理:安全地存储和管理敏感信息(密码、令牌、SSH 密钥等)。
二、核心概念与架构
2.1 集群架构
一个 Kubernetes 集群由一组节点(Node)组成,分为控制平面(Control Plane)和工作节点(Worker Node)。
常用k8s命令分类
集群管理
kubectl cluster-info
查看集群基本信息,包括API Server地址和核心服务状态。
kubectl get componentstatuses
检查控制平面组件(如scheduler、controller-manager)的健康状态。
kubectl top node
显示节点的CPU/内存资源使用情况,需安装metrics-server。
节点操作
kubectl cordon <node-name>
将节点标记为不可调度,防止新Pod被分配。
kubectl drain <node-name> --ignore-daemonsets
清空节点上的Pod(DaemonSet除外),常用于节点维护。
kubectl uncordon <node-name>
恢复节点的可调度状态。
Pod管理
kubectl get pods -o wide
查看Pod列表及所在节点信息。
kubectl describe pod <pod-name>
显示Pod的详细配置和事件日志。
kubectl logs -f <pod-name> --container <container-name>
实时查看容器日志,多容器Pod需指定容器名。
kubectl exec -it <pod-name> -- /bin/sh
进入Pod的交互式Shell。
kubectl port-forward <pod-name> 8080:80
将本地8080端口映射到Pod的80端口。
部署管理
kubectl rollout status deployment/<deploy-name>
监控部署的滚动更新状态。
kubectl rollout undo deployment/<deploy-name>
回滚到上一个部署版本。
kubectl scale deployment <deploy-name> --replicas=5
手动扩展Deployment的副本数。
服务暴露
kubectl expose deployment <deploy-name> --type=NodePort
创建NodePort类型的服务。
kubectl get svc -A
查看所有命名空间的服务列表。
配置管理
kubectl create configmap <name> --from-file=<path>
从文件创建ConfigMap。
kubectl edit secret <secret-name>
直接编辑Secret内容(base64编码)。
故障排查
kubectl get events --sort-by=.metadata.creationTimestamp
按时间排序查看集群事件。
kubectl api-resources
列出所有可操作的API资源类型。
kubectl get all -A
查看所有命名空间的资源概览。
高级命令示例
批量操作
kubectl delete pods --field-selector=status.phase=Failed
删除所有状态为Failed的Pod。
kubectl get pods --no-headers | awk '{print $1}' | xargs kubectl delete pod
批量删除所有Pod(慎用)。
资源分析
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}'
提取所有Pod使用的镜像名称。
kubectl get deployment -o custom-columns=NAME:.metadata.name,RS:.status.replicas
自定义列格式输出。
调试技巧
kubectl run debug-tool --image=busybox --restart=Never --rm -it -- /bin/sh
启动临时调试容器。
kubectl debug -it <problem-pod> --image=ubuntu --target=<container-name>
使用Ephemeral Container调试运行中的Pod(需K8s 1.18+)。
YAML操作技巧
kubectl apply -f - <<EOF ... EOF
通过标准输入传递YAML内容。
kubectl get pod <pod-name> -o yaml > pod.yaml
导出资源配置为YAML文件。
kubectl diff -f updated.yaml
预览实际变更内容(需安装diff插件)。
控制平面组件(Master):
- API Server:集群的入口,所有组件都通过它进行通信。
- etcd:分布式键值存储,保存集群的所有配置数据。
- Scheduler:负责将 Pod 调度到合适的节点上。
- Controller Manager:运行各种控制器,确保集群的期望状态与实际状态一致。
- Cloud Controller Manager(可选):与云服务商 API 交互,管理负载均衡器、存储卷等。
工作节点组件:
- Kubelet:节点代理,负责与 API Server 通信,管理 Pod 和容器。
- Kube-proxy:网络代理,实现 Service 的网络规则和负载均衡。
- 容器运行时:负责运行容器(如 Docker、containerd、CRI-O)。
2.2 核心对象(API 资源)
Kubernetes 使用声明式 API,通过 YAML 或 JSON 文件定义资源对象。
- Pod:最小的部署单元,包含一个或多个紧密关联的容器,共享网络和存储。
- Deployment:管理 Pod 副本集,提供声明式更新、回滚和扩缩容。
- Service:定义一组 Pod 的访问策略,提供稳定的 IP 地址和 DNS 名称,实现负载均衡。
- ConfigMap:将非机密的配置数据存储为键值对,供 Pod 使用。
- Secret:存储敏感信息(密码、令牌、密钥),以 Base64 编码。
- Volume:为 Pod 中的容器提供持久化存储。
- Namespace:虚拟集群,用于在物理集群中划分资源,实现多租户隔离。
- Ingress:管理外部访问集群内部服务的规则,通常提供 HTTP/HTTPS 路由。
- StatefulSet:用于管理有状态应用,为 Pod 提供稳定的网络标识和持久化存储。
- DaemonSet:确保所有(或部分)节点上运行一个 Pod 副本,常用于日志收集、监控等。
- Job/CronJob:运行一次性任务或定时任务。
三、安装与配置
3.1 部署方式
- 本地开发:Minikube、Kind、Docker Desktop(内置 K8s)。
- 生产环境:
- 托管服务:Amazon EKS、Google GKE、Azure AKS、阿里云 ACK。
- 自建集群:kubeadm、kubespray、Rancher。
3.2 使用 kubeadm 快速搭建集群
# 在所有节点上安装 Docker 和 kubeadm
sudo apt-get update
sudo apt-get install -y docker.io kubelet kubeadm kubectl
sudo systemctl enable docker kubelet
在主节点初始化集群
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
配置 kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
安装网络插件(以 Calico 为例)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
将工作节点加入集群(在工作节点执行)
kubeadm join <MASTER_IP>:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH>
四、核心操作与命令
4.1 kubectl 常用命令
# 查看资源
kubectl get pods
kubectl get pods -n kube-system
kubectl get pods -o wide
kubectl describe pod <pod-name>
部署应用
kubectl apply -f deployment.yaml
kubectl create deployment nginx --image=nginx
扩缩容
kubectl scale deployment nginx --replicas=3
查看日志
kubectl logs <pod-name>
kubectl logs -f <pod-name> # 实时日志
进入容器
kubectl exec -it <pod-name> -- /bin/bash
删除资源
kubectl delete pod <pod-name>
kubectl delete -f deployment.yaml
端口转发
kubectl port-forward svc/nginx 8080:80
查看集群信息
kubectl cluster-info
kubectl get nodes
4.2 YAML 文件示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
五、网络与存储
5.1 网络模型
- Pod 网络:每个 Pod 拥有唯一 IP,Pod 内所有容器共享网络命名空间。
- Service 网络:虚拟 IP(ClusterIP),通过 kube-proxy 实现负载均衡。
- 网络插件:Calico、Flannel、Cilium、Weave Net 等,实现 Pod 间通信。
- Ingress:Nginx Ingress Controller、Traefik、HAProxy Ingress。
5.2 存储卷类型
- emptyDir:临时存储,随 Pod 删除而消失。
- hostPath:挂载节点文件系统到 Pod。
- PersistentVolume (PV):集群级别的存储资源。
- PersistentVolumeClaim (PVC):用户对存储的请求。
- StorageClass:动态供应 PV,按需创建存储。
- CSI:容器存储接口,支持第三方存储插件。
六、安全与权限
6.1 认证(Authentication)
- 客户端证书
- Bearer Token
- ServiceAccount Token
6.2 授权(Authorization)
- RBAC(基于角色的访问控制):最常用,通过 Role、ClusterRole、RoleBinding、ClusterRoleBinding 管理权限。
- ABAC(基于属性的访问控制)
- Node Authorization(节点授权)
6.3 安全上下文(Security Context)
在 Pod 或容器级别设置权限和访问控制。
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
allowPrivilegeEscalation: false
6.4 网络策略(NetworkPolicy)
控制 Pod 组之间的网络流量,实现网络隔离。
七、监控、日志与调试
7.1 监控方案
- Metrics Server:集群核心资源监控。
- Prometheus + Grafana:主流监控告警组合。
- cAdvisor:容器资源使用和性能分析。
7.2 日志收集
- EFK Stack:Elasticsearch + Fluentd + Kibana。
- Loki:Grafana 推出的轻量级日志聚合系统。
7.3 调试技巧
kubectl describe:查看资源详细状态和事件。kubectl logs:查看容器日志。kubectl exec:进入容器调试。kubectl port-forward:端口转发访问内部服务。kubectl debug:调试运行中的 Pod(需要 Ephemeral Containers 特性)。
八、高级特性与生态
8.1 自定义资源(CRD)与 Operator
扩展 Kubernetes API,定义和管理自定义资源,通过 Operator 实现自动化运维复杂应用(如数据库、消息队列)。
8.2 Helm
Kubernetes 包管理工具,通过 Chart 打包、版本管理和部署应用。
# 安装 Helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
添加仓库并安装应用
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-release bitnami/nginx
8.3 Service Mesh
- Istio:提供流量管理、安全、可观测性。
- Linkerd:轻量级 Service Mesh。
8.4 GitOps
使用 Git 作为声明式基础设施和应用的单一可信源,通过工具(如 ArgoCD、Flux)自动同步集群状态。
九、最佳实践
- 资源限制:为 Pod 设置 requests 和 limits,避免资源竞争。
- 健康检查:配置 livenessProbe 和 readinessProbe。
- 使用 Deployment:而非直接创建 Pod,便于管理。
- 标签与选择器:合理使用标签组织资源。
- 配置分离:使用 ConfigMap 和 Secret 管理配置,而非硬编码。
- 多环境管理:使用 Namespace 和 Kustomize/Helm 管理不同环境。
- 备份 etcd:定期备份集群关键数据。
- 持续更新:保持 Kubernetes 版本和组件更新。
十、学习资源与社区
- 官方文档:Kubernetes Documentation | Kubernetes
- Kubernetes 中文社区:Kubernetes中文社区_分享最新K8S资讯、教程、实践和中文文档
- 互动教程:Kubernetes Tutorials、Katacoda
- 认证:CKA(Kubernetes 管理员认证)、CKAD(应用开发者认证)。
- 书籍:《Kubernetes in Action》、《Kubernetes 权威指南》。
总结:Kubernetes 是一个强大而复杂的系统,掌握其核心概念、架构和操作是入门的关键。建议从本地环境(如 Minikube)开始实践,逐步深入网络、存储、安全等高级主题,并结合 Helm、Operator、GitOps 等生态工具构建生产级应用。
更多推荐

所有评论(0)