常用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 是一个强大而复杂的系统,掌握其核心概念、架构和操作是入门的关键。建议从本地环境(如 Minikube)开始实践,逐步深入网络、存储、安全等高级主题,并结合 Helm、Operator、GitOps 等生态工具构建生产级应用。

更多推荐