引言

Kubectl 是一个命令行工具,用于管理 Kubernetes 对象和集群。 它提供了一个命令行界面 / 服务器来执行一些常见的操作,比如创建和扩展部署,切换上下文,以及访问运行容器中的 shell。

如何使用本指南:

  • 本指南采用备忘单格式,具有自包含的命令行代码段。
  • 它不是一个详尽的 kubectl 命令列表,但包含许多常见的操作和用例。 要获得更全面的参考资料,请查阅 Kubectl 参考文献
  • 跳转到任何与您要完成的任务相关的部分。

先决条件

  • 要使用 kubectl,您需要一个可用的 Kubernetes 集群。 要学习如何从头创建一个 Kubernetes 集群,你可以参考如何在 Ubuntu 18.04上使用 Kubeadm 创建一个 Kubernetes 集群。 或者,您可以使用 DigitalOcean Kubernetes 在几分钟内提供托管的 Kubernetes 集群。 要开始创建数字库伯尼茨集群,请参考如何使用控制面板创建库伯尼茨集群。
  • 您还需要一台远程机器,在这台机器上安装并运行 kubectl。 Kubectl 可以在许多不同的操作系统上运行。

部署示例

为了演示这个备忘单中的一些操作和命令,我们将使用一个运行两个 Nginx 副本的样例 Deployment:

nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

将此清单复制并粘贴到一个名为 nginx-deployment. yaml 的文件中。

安装 kubectl

注意: 这些命令只在 Ubuntu 18.04的机器上测试过。 要学习如何在其他操作系统上安装 kubectl,请参考 Kubernetes 文档中的 Install 和 Set kubectl。

首先,更新本地包索引并安装所需的依赖项:

  • sudo apt-get update && sudo apt-get install -y apt-transport-https

然后将 Google Cloud GPG 键添加到 APT,使 kubectl 包可以在你的系统中使用:

  • curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
  • echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
  • sudo apt-get update

最后,安装 kubectl:

  • sudo apt-get install -y kubectl

使用以下版本测试安装是否成功:

  • kubectl version

设置 Shell 自动完成

注意: 这些命令只在 Ubuntu 18.04的机器上测试过。 要了解如何在其他操作系统上设置自动完成,请参阅 Kubernetes 文档中的 Install 和 Set kubectl。

Kubectl 包含一个 shell 自动完成脚本,您可以将其提供给系统现有的 shell 自动完成软件。

安装 kubectl 自动完成

首先,检查是否安装了 bash-completion:

  • type _init_completion

您应该看到一些脚本输出。

接下来,在 ~ / . bashrc 文件中找到 kubectl 自动完成脚本的源代码:

  • echo 'source <(kubectl completion bash)' >>~/.bashrc
  • . ~/.bashrc

或者,您可以将完成脚本添加到 / etc / bash completion.d 目录:

  • kubectl completion bash >/etc/bash_completion.d/kubectl

用法

要使用自动完成功能,请按 TAB 键来显示可用的 kubectl 命令:

  • kubectl TAB TAB
Output
annotate apply autoscale completion cordon delete drain explain kustomize options port-forward rollout set uncordon api-resources attach certificate config cp describe . . .

你也可以在部分输入命令后显示可用的命令:

  • kubectl d TAB
Output
delete describe diff drain

连接、配置和使用上下文

联系

要测试 kubectl 是否可以通过你的集群进行身份验证和访问,可以使用 cluster-info:

  • kubectl cluster-info

如果 kubectl 能够成功地验证您的集群,您应该会看到以下输出:

Output
Kubernetes master is running at https://kubernetes_master_endpoint CoreDNS is running at https://coredns_endpoint To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Kubectl 使用 kubeconfig 配置文件进行配置。 默认情况下,kubectl 将在 $HOME / 中查找一个名为 config 的文件。 库贝目录。 要改变这一点,你可以将 $KUBECONFIG 环境变量文件设置为一个定制的 KUBECONFIG 文件,或者在执行时使用---- KUBECONFIG 标志传递定制文件:

  • kubectl cluster-info --kubeconfig=path_to_your_kubeconfig_file

注意: 如果您使用的是托管的 Kubernetes 集群,那么您的云提供商应该已经为您提供了它的 kubeconfig 文件。

如果您不想在每个命令中使用 -- kubeconfig 标志,并且没有现成的 ~ / 。 在 kube / config 文件中,创建一个名为 ~ / 的目录。 如果主目录不存在,那么请将它放在主目录中,然后将它复制到 kubiconfig 文件中,将其重命名为 config:

  • mkdir ~/.kube
  • cp your_kubeconfig_file ~/.kube/config

现在,再次运行 cluster-info 来测试您的连接。

修改 kubectl 配置

您还可以使用 kubectl 配置集的命令修改配置。

要查看你的 kubectl 配置,使用 view 子命令:

  • kubectl config view
Output
apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED . . .

修正集群

要获取 kubeconfig 中定义的集群列表,请使用 get-clusters:

  • kubectl config get-clusters
Output
NAME do-nyc1-sammy

要在配置文件中添加集群,请使用 set-cluster 子命令:

  • kubectl config set-cluster new_cluster --server=server_address --certificate-authority=path_to_certificate_authority

要从配置文件中删除一个集群,请使用 delete-cluster:

注意: 这只会从配置中删除集群,并不会删除实际的 Kubernetes 集群。

  • kubectl config delete-cluster

修改用户

您可以使用 set-credentials 为用户执行类似的操作:

  • kubectl config set-credentials username --client-certificate=/path/to/cert/file --client-key=/path/to/key/file

要从配置中删除一个用户,你可以运行 unset:

  • kubectl config unset users.username

背景

Kubernetes 中的上下文是一个对象,它包含集群的一组访问参数。 它由一个集群、名称空间和用户三元组组成。 上下文允许您在不同集群配置集之间快速切换。

要查看当前上下文,可以使用 current-context:

  • kubectl config current-context
Output
do-nyc1-sammy

要查看所有配置上下文的列表,请运行 get-contexts:

  • kubectl config get-contexts
Output
CURRENT NAME CLUSTER AUTHINFO NAMESPACE * do-nyc1-sammy do-nyc1-sammy do-nyc1-sammy-admin

要设置上下文,使用 set-context:

  • kubectl config set-context context_name --cluster=cluster_name --user=user_name --namespace=namespace

你可以使用 use-context 在上下文之间切换:

  • kubectl config use-context context_name
Output
Switched to context "do-nyc1-sammy"

你可以用 delete-context 来删除上下文:

  • kubectl config delete-context context_name

使用名称空间

Kubernetes 的名称空间是一个抽象概念,它允许您将集群划分为多个虚拟集群。 通过使用名称空间,您可以在多个团队和范围对象之间适当地划分集群资源。 例如,您可以有一个 prod Namespace 用于生产工作负载,以及一个 dev Namespace 用于开发和测试工作负载。

要获取并打印集群中所有名称空间的列表,请使用 get namespace:

  • kubectl get namespace
Output
NAME STATUS AGE default Active 2d21h kube-node-lease Active 2d21h kube-public Active 2d21h kube-system Active 2d21h

若要为当前上下文设置命名空间,请使用 set-context -- current:

  • kubectl config set-context --current --namespace=namespace_name

要创建名称空间,请使用 create Namespace:

  • kubectl create namespace namespace_name
Output
namespace/sammy created

类似地,要删除名称空间,使用 delete 名称空间:

警告: 删除名称空间将删除名称空间中的所有内容,包括正在运行的部署、 Pods 和其他工作负载。 只有在确定要终止在 Namespace 中运行的内容或者要删除一个空的 Namespace 时,才运行此命令。

  • kubectl delete namespace namespace_name

要获取给定 Namespace 中的所有 Pods,或者对给定 Namespace 中的资源执行其他操作,请确保包含 -- Namespace 标志:

  • kubectl get pods --namespace=namespace_name

管理 Kubernetes 资源

一般语法

大多数 kubectl 管理命令的一般语法是:

  • kubectl command type name flags

在哪里

  • 命令是一个你想要执行的操作,比如创建
  • 类型是 Kubernetes 资源类型,类似于部署
  • 名称是资源的名称,就像 app 前端一样
  • 旗帜是任何可选的旗帜,你想包括

例如,下面的命令检索关于部署命名的应用前端的信息:

  • kubectl get deployment app_frontend

声明式管理和 kubectl 应用

推荐的管理 Kubernetes 上工作负载的方法是尽可能依赖集群的声明性设计。 这意味着,与其运行一系列命令来创建、更新、删除和重新启动运行的 Pods,你应该定义你想在 YAML 清单文件中运行的工作负载、服务和系统,并将这些文件提供给 Kubernetes,后者将处理剩下的工作。

实际上,这意味着使用 kubectl apply 命令,该命令将特定的配置应用于给定的资源。 如果目标资源不存在,那么 Kubernetes 将创建该资源。 如果资源已经存在,那么 Kubernetes 将保存当前的修订,并根据新的配置更新资源。 这种声明式方法与运行 kubectl create、 kubectl edit 和 kubectl 缩放命令集来管理资源的命令式方法形成对比。 要了解更多关于管理 Kubernetes 资源的不同方法,请参考 Kubernetes 文档中的 Kubernetes 对象管理。

推出部署

例如,要将示例 Nginx Deployment 部署到您的集群,请使用 apply 并提供到 Nginx-Deployment 的路径。 Yaml 清单文件:

  • kubectl apply -f nginx-deployment.yaml
Output
deployment.apps/nginx-deployment created

F 标志用于指定包含有效配置的文件名或 URL。 如果希望应用目录中的所有清单,可以使用-k 标志:

  • kubectl apply -k manifests_dir

您可以使用输出状态跟踪输出状态:

  • kubectl rollout status deployment/nginx-deployment
Output
Waiting for deployment "nginx-deployment" rollout to finish: 1 of 2 updated replicas are available... deployment "nginx-deployment" successfully rolled out

除了 rollout 状态之外,还有一个替代选项是 kubectl get 命令,以及 -w (watch)标志:

  • kubectl get deployment -w
Output
NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 0/2 2 0 3s nginx-deployment 1/2 2 1 3s nginx-deployment 2/2 2 2 3s

使用滚出暂停和滚出恢复,您可以暂停并恢复部署的滚出:

  • kubectl rollout pause deployment/nginx-deployment
Output
deployment.extensions/nginx-deployment paused
  • kubectl rollout resume deployment/nginx-deployment
Output
deployment.extensions/nginx-deployment resumed

修改正在运行的部署

如果希望修改正在运行的 Deployment,可以对其清单文件进行更改,然后再次运行 kubectl apply 以应用更新。 例如,我们将修改 nginx-deployment。 将副本数目从2个改为3个:

nginx-deployment.yaml
. . .
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
. . .

通过 kubectl diff 命令,你可以看到当前正在运行的资源和提供的配置文件中提出的修改之间的差异:

  • kubectl diff -f nginx-deployment.yaml

现在允许 Kubernetes 使用 apply 执行更新:

  • kubectl apply -f nginx-deployment.yaml

运行另一个 get 部署应该会确认添加了第三个副本。

如果您在不修改清单文件的情况下再次运行 apply,那么 Kubernetes 将检测到没有进行任何更改,并且不会执行任何操作。

通过使用 rollout history,你可以看到 Deployment 之前修订的列表:

  • kubectl rollout history deployment/nginx-deployment
Output
deployment.extensions/nginx-deployment REVISION CHANGE-CAUSE 1 <none>

使用 rollout undo,您可以将 Deployment 恢复为其以前的任何修订:

  • kubectl rollout undo deployment/nginx-deployment --to-revision=1

删除部署

要删除正在运行的 Deployment,请使用 kubectl delete:

  • kubectl delete -f nginx-deployment.yaml
Output
deployment.apps "nginx-deployment" deleted

强制性管理

您还可以使用一组命令来直接操作和管理 Kubernetes 资源。

创建部署

使用 create 从文件、 URL 或 STDIN 创建对象。 请注意,与 apply 不同的是,如果具有相同名称的对象已经存在,则操作将失败。 -- dry-run 标志允许您预览操作的结果,而不需要实际执行它:

  • kubectl create -f nginx-deployment.yaml --dry-run
Output
deployment.apps/nginx-deployment created (dry-run)

我们现在可以创建对象:

  • kubectl create -f nginx-deployment.yaml
Output
deployment.apps/nginx-deployment created

修改正在运行的部署

使用 scale 将 Deployment 的副本数量从2扩展到4:

  • kubectl scale --replicas=4 deployment/nginx-deployment
Output
deployment.extensions/nginx-deployment scaled

您可以使用 kubectl 编辑就地编辑任何对象。 这将在默认编辑器中打开对象的清单:

  • kubectl edit deployment/nginx-deployment

您应该在编辑器中看到以下清单文件:

nginx-deployment
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: extensions/v1beta1
kind: Deployment
. . . 
spec:
  progressDeadlineSeconds: 600
  replicas: 4
  revisionHistoryLimit: 10
  selector:
    matchLabels:
. . .

将 replica 值从4改为2,然后保存并关闭文件。

现在运行 get 来检查更改:

  • kubectl get deployment/nginx-deployment
Output
NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 2/2 2 2 6m40s

我们已经成功地将部署缩小到了2个动态的副本。 您可以以类似的方式更新库伯内特斯对象的大部分字段。

就地修改对象的另一个有用命令是 kubectl patch。 使用 patch,您可以动态地更新对象的字段,而无需打开编辑器。 补丁还允许使用各种合并和修补策略进行更复杂的更新。 要了解更多关于这些的信息,请参考使用 kubectl 补丁在适当位置更新 API 对象。

下面的命令将为 nginx-deployment 对象打补丁,将 replicas 字段从2更新为4; deploy 是部署对象的简写形式。

  • kubectl patch deploy nginx-deployment -p '{"spec": {"replicas": 4}}'
Output
deployment.extensions/nginx-deployment patched

我们现在可以检查这些变化:

  • kubectl get deployment/nginx-deployment
Output
NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 4/4 4 4 18m

还可以使用 run 命令创建部署命令。 运行将创建一个部署使用一个图像作为参数提供:

  • kubectl run nginx-deployment --image=nginx --port=80 --replicas=2

通过 expose 命令,你可以快速暴露一个正在运行的带有 Kubernetes 服务的部署,允许来自 Kubernetes 集群之外的连接:

  • kubectl expose deploy nginx-deployment --type=LoadBalancer --port=80 --name=nginx-svc
Output
service/nginx-svc exposed

在这里,我们将 nginx-Deployment 公开为一个 LoadBalancer 服务,向外部通信开放端口80,并将其指向集装箱端口80。 我们将服务命名为 nginx-svc。 使用 LoadBalancer Service 类型,由 Kubernetes 自动供应和配置云负载均衡器。 要获取服务的外部 IP 地址,请使用 get:

  • kubectl get svc nginx-svc
Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-svc LoadBalancer 10.245.26.242 203.0.113.0 80:30153/TCP 22m

您可以通过在 web 浏览器中导航到 EXTERNAL-IP 来访问正在运行的 Nginx 容器。

工作负载检测与调试

您可以使用几个命令来获取有关在集群中运行的工作负载的更多信息。

检查库伯内特斯资源

获取给定的 Kubernetes 资源,并显示与其相关的一些基本信息:

  • kubectl get deployment -o wide
Output
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR nginx-deployment 4/4 4 4 29m nginx nginx app=nginx

由于我们没有提供部署名称或名称空间,kubectl 获取当前名称空间中的所有部署。 O 标志提供了其他信息,如 CONTAINERS 和 IMAGES。

除了 get,您还可以使用 describe 来获取资源和相关资源的详细描述:

  • kubectl describe deploy nginx-deployment
Output
Name: nginx-deployment Namespace: default CreationTimestamp: Wed, 11 Sep 2019 12:53:42 -0400 Labels: run=nginx-deployment Annotations: deployment.kubernetes.io/revision: 1 Selector: run=nginx-deployment . . .

显示的信息集将根据资源类型而有所不同。 还可以使用此命令而不指定资源名称,在这种情况下,将为当前 Namespace 中的所有此类型的资源提供信息。

允许你快速地为给定的资源类型提取可配置的字段:

  • kubectl explain deployment.spec

通过添加附加字段,你可以更深入地了解字段层次结构:

  • kubectl explain deployment.spec.template.spec

获得对容器的 Shell 访问权

若要获得对正在运行的容器的 shell 访问权,请使用 exec。 首先,找到包含你想要访问的运行容器的 Pod:

  • kubectl get pod
Output
nginx-deployment-8859878f8-7gfw9 1/1 Running 0 109m nginx-deployment-8859878f8-z7f9q 1/1 Running 0 109m

让我们进入第一个分离舱。 因为这个 Pod 只有一个容器,所以我们不需要使用 -c 标志来指定希望执行到哪个容器中。

  • kubectl exec -i -t nginx-deployment-8859878f8-7gfw9 -- /bin/bash
Output
[email protected]:/#

现在您可以通过 shell 访问 Nginx 容器。 I 标志将 STDIN 传递给容器,-t 提供一个交互式 TTY。 -- double-dash 用作 kubectl 命令和希望在容器中运行的命令的分隔符。 在本例中,我们运行 / bin / bash。

若要在容器内运行命令而不打开完整的 shell,请省略-i 和-t 标志,并用要运行的命令替代 / bin / bash:

  • kubectl exec nginx-deployment-8859878f8-7gfw9 ls
Output
bin boot dev etc home lib lib64 media . . .

获取日志

另一个有用的命令是 logs,它打印 Pods 和容器(包括终止容器)的日志。

要将日志流传到终端输出,您可以使用-f 标志:

  • kubectl logs -f nginx-deployment-8859878f8-7gfw9
Output
10.244.2.1 - - [12/Sep/2019:17:21:33 +0000] "GET / HTTP/1.1" 200 612 "-" "203.0.113.0" "-" 2019/09/16 17:21:34 [error] 6#6: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.244.2.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "203.0.113.0", referrer: "http://203.0.113.0" . . .

此命令将继续在终端中运行,直到被 ctrl + c 中断。 如果想打印日志输出并立即退出,可以省略-f 标志。

您还可以使用-p 标志为终止的容器获取日志。 当这个选项在 Pod 中使用时,日志将从终止的容器中打印输出:

  • kubectl logs -p nginx-deployment-8859878f8-7gfw9

C 标志允许您指定希望从中获取日志的容器,如果 Pod 有多个容器的话。 您可以使用 -- all-containers true 标志从 Pod 中的所有容器中获取日志。

端口转发和代理

要获得对 Pod 的网络访问,您可以使用端口转发:

  • sudo kubectl port-forward pod/nginx-deployment-8859878f8-7gfw9 80:80
Output
Forwarding from 127.0.0.1:80 -> 80 Forwarding from [::1]:80 -> 80

在这种情况下,我们使用 sudo 是因为本地端口80是受保护的端口。 对于大多数其他端口,您可以省略 sudo 并作为系统用户运行 kubectl 命令。

这里我们将本地端口80(在冒号之前)转发到 Pod 的容器端口80(在冒号之后)。

您还可以使用 deploy / nginx-deployment 作为要转发的资源类型和名称。 如果这样做,本地端口将被转发到 Deployment 选择的 Pod。

代理命令可用于本地访问 Kubernetes API 服务器:

  • kubectl proxy --port=8080
Output
Starting to serve on 127.0.0.1:8080

在另一个 shell 中,使用 curl 来探索 API:

curl http://localhost:8080/api/
Output
{ "kind": "APIVersions", "versions": [ "v1" ], "serverAddressByClientCIDRs": [ { "clientCIDR": "0.0.0.0/0", "serverAddress": "203.0.113.0:443" } ]

通过按 CTRL-C 关闭代理。

总结

本指南涵盖了您在管理集群时可能使用的一些更常见的 kubectl 命令以及部署到集群中的工作负载。

您可以通过查阅官方的 Kubernetes 参考文档来了解更多关于 kubectl 的信息。

还有更多的命令和变体,您可能会发现它们在您与 kubectl 的工作中非常有用。 要了解更多关于所有可用选项的信息,你可以运行:

kubectl --help