## 14.8 Kubernetes 命令行 kubectl

[kubectl](https://github.com/kubernetes/kubernetes) 是 Kubernetes 自带的客户端，可以用它来直接操作 Kubernetes。

kubectl 的基本用法格式为：

```bash
kubectl [command] [resource] [name] [flags]
```

其中 `command` 是操作命令（如 get、apply、delete），`resource` 是资源类型（如 pod、deployment、service），`name` 是资源名称（可选），`flags` 是各种选项参数。

### 14.8.1 get

显示一个或多个资源。最常用的命令之一，用于查询集群中的资源状态。

```bash
# 查看所有 Pod
$ kubectl get pods

# 查看指定命名空间中的 Deployment
$ kubectl get deployment -n kube-system

# 查看所有资源
$ kubectl get all

# 使用更详细的输出格式
$ kubectl get pods -o wide

# 输出为 YAML 格式
$ kubectl get pod my-pod -o yaml

# 根据标签选择资源
$ kubectl get pods -l app=nginx
```

### 14.8.2 describe

显示资源的详细信息，包括事件、状态、配置等。用于调试和查看资源的完整信息。

```bash
# 查看特定 Pod 的详情
$ kubectl describe pod my-pod

# 查看 Node 的详情
$ kubectl describe node node-1

# 查看 Deployment 的详情
$ kubectl describe deployment nginx-deployment
```

### 14.8.3 apply

从文件或标准输入应用配置。这是声明式资源管理的标准方式，可用于创建或更新资源。

```bash
# 应用 YAML 文件
$ kubectl apply -f deployment.yaml

# 应用目录中的所有 YAML 文件
$ kubectl apply -f ./manifests/

# 从标准输入应用配置
$ cat deployment.yaml | kubectl apply -f -
```

### 14.8.4 create

从文件或标准输入创建资源。与 apply 不同，create 仅用于创建新资源，如果资源已存在会报错。

```bash
# 创建资源
$ kubectl create -f pod.yaml

# 从标准输入创建
$ kubectl create -f - < deployment.yaml
```

### 14.8.5 delete

删除一个或多个资源。支持按名称、标签、资源类型等多种方式删除。

```bash
# 按名称删除
$ kubectl delete pod my-pod

# 删除整个 Deployment（同时删除其管理的 Pod）
$ kubectl delete deployment nginx-deployment

# 按标签删除
$ kubectl delete pods -l app=nginx

# 从文件删除
$ kubectl delete -f deployment.yaml
```

### 14.8.6 logs

查看 Pod 中容器的日志。用于调试应用和查看容器输出。

```bash
# 查看 Pod 的日志
$ kubectl logs my-pod

# 查看 Pod 中特定容器的日志
$ kubectl logs my-pod -c container-name

# 实时跟踪日志（类似 tail -f）
$ kubectl logs -f my-pod

# 查看最近 100 行日志
$ kubectl logs my-pod --tail=100

# 查看 Pod 启动前的日志（适用于已崩溃的容器）
$ kubectl logs my-pod --previous
```

### 14.8.7 exec

在运行中的容器内部执行命令。用于调试、排查问题或执行应用内的操作。

```bash
# 进入容器的交互式 shell
$ kubectl exec -it my-pod -- /bin/sh

# 在容器中执行命令
$ kubectl exec my-pod -- ls -la /app

# 在 Pod 中的特定容器执行命令
$ kubectl exec -it my-pod -c container-name -- /bin/bash
```

### 14.8.8 port-forward

将本地端口转发到 Pod 的端口。用于本地访问集群内的服务，无需暴露 Service。

```bash
# 将本地 8080 端口转发到 Pod 的 80 端口
$ kubectl port-forward pod/my-pod 8080:80

# 使用随机本地端口
$ kubectl port-forward pod/my-pod :80

# 转发到 Service
$ kubectl port-forward svc/my-service 8080:80
```

### 14.8.9 rollout

对 Deployment、DaemonSet、StatefulSet 等资源执行滚动更新、暂停、继续或回滚操作。

```bash
# 查看滚动更新状态
$ kubectl rollout status deployment/nginx-deployment

# 暂停滚动更新
$ kubectl rollout pause deployment/nginx-deployment

# 继续滚动更新
$ kubectl rollout resume deployment/nginx-deployment

# 查看更新历史
$ kubectl rollout history deployment/nginx-deployment

# 回滚到前一个版本
$ kubectl rollout undo deployment/nginx-deployment

# 回滚到特定版本
$ kubectl rollout undo deployment/nginx-deployment --to-revision=2
```

### 14.8.10 label

向资源添加、修改或删除标签。标签用于组织和选择资源。

```bash
# 为 Pod 添加标签
$ kubectl label pod my-pod env=production

# 修改已有标签
$ kubectl label pod my-pod env=staging --overwrite

# 删除标签
$ kubectl label pod my-pod env-

# 为多个资源添加标签
$ kubectl label pods -l app=nginx version=v1
```

### 14.8.11 annotate

向资源添加或修改注解。注解用于存储任意元数据，不用于资源选择。

```bash
# 添加注解
$ kubectl annotate pod my-pod description="Production pod"

# 修改注解
$ kubectl annotate pod my-pod description="Staging pod" --overwrite

# 删除注解
$ kubectl annotate pod my-pod description-
```

### 14.8.12 edit

直接编辑 Kubernetes 资源。编辑器由 `EDITOR` 环境变量指定。

```bash
# 编辑 Pod
$ kubectl edit pod my-pod

# 编辑 Deployment
$ kubectl edit deployment nginx-deployment
```

### 14.8.13 config

管理 kubectl 的配置文件（通常位于 `~/.kube/config`）。

```bash
# 查看当前配置
$ kubectl config view

# 切换上下文
$ kubectl config use-context my-cluster

# 查看所有上下文
$ kubectl config get-contexts

# 设置默认命名空间
$ kubectl config set-context --current --namespace=my-namespace
```

### 14.8.14 cluster-info

显示集群的连接信息和组件状态。

```bash
# 显示集群信息
$ kubectl cluster-info

# 显示完整的集群状态（注：componentstatuses 自 1.19 起已弃用，建议使用下方替代命令）
$ kubectl get componentstatuses
# 推荐替代：
$ kubectl get --raw='/readyz?verbose'
```

### 14.8.15 version

显示 kubectl 客户端和 Kubernetes API server 的版本信息。

```bash
# 显示版本
$ kubectl version

# 仅显示客户端版本
$ kubectl version --client

# 以 JSON 格式输出
$ kubectl version --output=json
```

### 14.8.16 api-versions

列出 API server 支持的所有 API 版本，格式为 “组/版本”。

```bash
$ kubectl api-versions
```

### 14.8.17 explain

解释资源的字段含义。用于了解 YAML 配置文件中各字段的作用。

```bash
# 查看 Pod 资源的字段说明
$ kubectl explain pod

# 查看 Pod 下 spec 字段的说明
$ kubectl explain pod.spec

# 查看具体字段的详细说明
$ kubectl explain pod.spec.containers
```

### 14.8.18 auth

检查用户权限，用于验证 RBAC 配置。

```bash
# 检查当前用户是否有权限执行操作
$ kubectl auth can-i create pods

# 检查特定用户的权限
$ kubectl auth can-i create pods --as=other-user
```

### 14.8.19 help

显示任何命令的帮助信息。

```bash
# 显示 kubectl 的一般帮助
$ kubectl help

# 显示特定命令的帮助
$ kubectl get --help

# 显示资源的 API 文档
$ kubectl explain deployment
```
