Kubectl 是 Kubernetes 中的命令行实用程序,用于对 Kubernetes 集群运行命令。您可以使用它来执行各种任务,包括部署应用程序/微服务、查看和管理资源、检查日志文件等等。

在本教程中,我们将介绍用于管理 Kubernetes (K8S) 集群的常用 kubectl 命令。

我们在 Ubuntu 22.04 上使用 Minikube 作为我们的本地 Kubernetes 集群。

创建 Kubernetes 对象/资源

在 Kubernetes 中,对象是持久性实体,可确保集群达到所需状态。它们是集群中工作负载的构建基块。对象包括副本集、部署、Pod、守护程序集、服务、命名空间、配置映射和密钥,以及持久卷等。

创建对象的最常见方法是使用 YAML 清单文件,通常带有.yaml or .yml文件扩展名。

要从 YAML 清单文件创建对象,请运行:

$ kubectl apply -f ./file1.yaml

若要从多个 YAML 文件创建资源,请运行:

$ kubectl apply -f ./file1.yaml  -f ./file2.yaml

若要从目录中的所有清单文件创建资源,请运行:

$ kubectl apply -f ./dir

要从 URL 创建资源,请执行:

$ kubectl apply -f https://sample-url.io

Kubernetes 集群中的节点

节点是运行支持工作负载的 Pod 和其他资源的物理机或虚拟机。每个节点都由一个称为控制窗格的主节点管理,该节点包含运行 Pod 所需的多个服务。一个集群通常有多个节点。

若要获取群集上的节点数,请运行:

$ kubectl get nodes

要让 Pod 在节点上运行,请执行:

$ kubectl get pods -o wide | grep <node_name>

若要将节点标记为“不可调度”,请运行。

$ kubectl cordon minikube

node/minikube cordoned

要将节点标记为可调度,请运行。

$ kubectl uncordon minikube

node/minikube uncordoned

要显示 RAM 和 CPU 运行等资源使用率指标,请执行以下操作:

$ kubectl top node <node_name>

若要删除一个或多个节点,请运行以下命令:

$ kubectl delete node <node_name>

集群管理和上下文

Kubernetes 集群是一组运行容器化应用程序的节点或服务器。一个节点可以运行一个或多个 Pod,其中包含一个或多个正在运行的容器。

列出有关主节点的信息。

$ kubectl cluster-info

检查 kubectl 版本。

$ kubectl version --short

显示 Kubernetes 集群配置。

$ kubectl config view

显示上下文。

$ kubectl config get-contexts

列出可用的 API 资源。

$ kubectl api-resources

列出可用的 API 版本。

$ kubectl api-versions

Kubernetes Pod

在 Kubernetes 中,Pod 是您可以在集群中创建和管理的最小可部署单元。容器包含一组容器,其中包含共享卷和网络资源,以及有关如何运行应用程序的说明。

豆荚是短暂的和一次性的,这意味着它们是短暂的,因此不会持续很长时间。因此,部署 Pod 的最佳方法是使用 YAML 文件的声明性配置。

由于可以重复使用,因此更具可重复性和便利性。此外,它还确保 YAML 文件中定义的资源受到 Kubernetes 的持续监控并按指定运行。

列出/删除 Pod

要获取集群中正在运行的 Pod 的列表,请运行以下命令:

$ kubectl get pods

要在窗格标签旁边显示窗格,请运行:

$ kubectl get pods --show-labels

要列出所有命名空间中的所有 Pod,请运行:

$ kubectl get pods --all-namespaces

要列出当前命名空间中的 Pod 并提供更多详细信息,请附加 wide 参数。-o

$ kubectl get pods -o wide

要显示特定容器的详细状态,请运行:

$ kubectl describe pod <pod-name>

要向 Pod 添加标签,请运行以下命令:

$ kubectl label pods my-pod new-label=awesome

要删除标签,请执行:

$ kubectl label pods my-pod new-label-

要获取具有容器 pod 的交互式 shell,请运行以下命令:

$ kubectl exec -it <pod_name> /bin/sh

要删除特定容器,请运行以下命令:

$ kubectl delete pod <pod name>

群集中的 ReplicaSet

ReplicaSet (RS) 确保在任何给定时间始终有稳定数量的正在运行的 Pod。它保证了 YAML 清单文件中定义的特定数量的 Pod 的可用性。

若要获取集群中的 ReplicaSet 数,请运行以下命令:

$ kubectl get replicasets

若要获取有关特定副本集的详细信息,请运行以下命令:

$ kubectl describe replicasets <replicasetname>

Pod 中的服务

服务是对 Pod 的网络抽象。服务提供 Pod 之间的发现和路由。例如,服务可以将应用程序的前端连接到其后端,每个后端都在单独的部署中运行。

若要列出服务,请运行:

$ kubectl get services

若要获取有关服务的更多详细信息,请运行以下命令:

$ kubectl describe services

Pod 中的服务帐户

服务账号是集群中 Pod 用于访问 Kubernetes API 服务器的对象。

若要列出服务帐户,请运行:

$ kubectl get serviceaccounts

若要获取有关服务帐户的更多详细信息,请执行:

$ kubectl describe serviceaccounts

若要删除服务帐户,请使用以下语法。

$ kubectl delete serviceaccounts <serviceaccount>

命名空间

命名空间是提供一种方法的单元,通过该方法,单个集群可以进一步细分为多个子集群,然后可以单独管理这些子集群。

要列出命名空间,请运行:

$ kubectl get namespaces

若要显示有关命名空间的详细信息,请使用以下语法:

$ kubectl describe namespace <namespace_name>

若要创建命名空间,请运行以下命令:

$ kubectl create namespace <namespace_name>

若要编辑或修改命名空间,请运行以下命令:

$ kubectl edit namespace <namespace_name>

要显示命名空间的资源使用情况,请运行:

$ kubectl top namespace <namespace_name>

若要删除命名空间,请运行以下命令:

$ kubectl delete namespace <namespace_name>

Kubernetes 机密

在 Kubernetes 中,机密是一个保存敏感和机密信息(如用户名和密码)的对象。

若要列出现有机密,请运行以下命令:

$ kubectl get secret

要列出有关现有密钥的详细信息,请执行:

$ kubectl describe secrets

若要创建密钥,请运行

$ kubectl create secret [flags] [options]

若要删除机密,请运行:

$ kubectl delete secret <secret_name>

Kubernetes 部署

部署是一个对象,可用于声明应用程序的所需状态。您可以定义副本数、Pod 的映像、Pod 数和其他资源。

若要获取部署数,请运行以下命令:

$ kubectl get deployment

列出特定部署的详细状态。

$ kubectl describe deployment <deployment-name>

若要删除部署,请运行以下命令:

$ kubectl delete deployment <deployment-name>

若要创建新部署,请执行以下命令:

$ kubectl create deployment <deployment-name>

Kubernetes 事件

在 Kubernetes 中,事件是响应资源(如 Pod、容器或节点)状态的变化而生成的对象。一个很好的例子是将 Pod 的状态从“待处理”更改为“正在运行”,或从“成功”更改为“失败”。

若要列出所有事件,请运行:

$ kubectl get events

要列出事件但排除 Pod 事件,请运行以下命令:

$ kubectl get events --field-selector involvedObject.kind!=Pod

要将事件与时间戳一起列出并按创建时间排序,请运行:

$ kubectl get events --sort-by=.metadata.creationTimestamp

Kubernetes 日志

日志对于记录群集事件以及帮助调试和排除故障至关重要。您可以使用以下命令查看或配置日志详细程度:

要打印特定容器运行的日志,请执行以下操作:

$ kubectl logs <pod_name>

要打印并跟踪特定 Pod 执行的实时日志,请执行以下操作:

$ kubectl logs -f <pod_name>

要打印 Pod 过去 X 小时(比如 3 小时)的日志,请运行:

$ kubectl logs --since=3h <pod_name>

要打印 Pod 中特定容器的日志,请运行

$ kubectl logs -c <container_name> <pod_name>

生成最近的 20 行日志

$ kubectl logs --tail=20 <pod_name>

生成 Pod 的日志,并将日志保存在名为 pod.log 的日志文件中

$ kubectl logs <pod_name> pod.log