Kubernetes 入门:kubectl 指南

Introduction

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

如何使用本指南:

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

前提条件

示例部署

为了演示本小抄中的一些操作和命令,我们将使用一个样例部署,该部署运行Nginx的两个副本:

 1[label nginx-deployment.yaml]
 2apiVersion: apps/v1
 3kind: Deployment
 4metadata:
 5  name: nginx-deployment
 6spec:
 7  replicas: 2
 8  selector:
 9    matchLabels:
10      app: nginx
11  template:
12    metadata:
13      labels:
14        app: nginx
15    spec:
16      containers:
17      - name: nginx
18        image: nginx
19        ports:
20        - containerPort: 80

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

安装kubectl

<$>[备注] 注意: 这些命令仅在** Ubuntu 18.04** 机器上测试过。要了解如何在其他操作系统上安装kubectl,请参考kubernetes文档中的安装和设置kubectl。 <$>

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

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

然后将Google Cloud GPG密钥添加到APT,并使kubectl包可用于您的系统:

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

最后,安装kubectl:

1sudo apt-get install -y kubectl

使用version测试安装成功:

1kubectl version

设置外壳自动补全

<$>[备注] 注意: 这些命令仅在** Ubuntu 18.04** 机器上测试过。要了解如何在其他操作系统上设置自动补全,请参考安装和设置Kubernetes文档中的kubectl。 <$>

Kubectl包含一个外壳自动完成脚本,您可以将其用于系统现有的外壳自动完成软件。

安装kubectl自动补全

首先,检查你是否安装了code-completion

1type _init_completion

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

接下来,~/.bashrc文件中的Sourcekubectl自动完成脚本:

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

或者 将补全脚本添加到/etc/bash_completion.d目录:

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

用法

要使用自动补全功能,请按TAB键以显示可用的kubectl命令:

1kubectl TAB TAB
1[secondary_label Output]
2annotate apply autoscale completion cordon delete drain explain kustomize options port-forward rollout set uncordon
3api-resources attach certificate config cp describe
4. . .

您还可以在部分键入命令后显示可用命令:

1kubectl d TAB
1[secondary_label Output]
2delete describe diff drain

连接、配置和使用上下文

接入

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

1kubectl cluster-info

如果kubectl可以成功向您的群集进行身份验证,您应该会看到以下输出:

1[secondary_label Output]
2Kubernetes master is running at https://kubernetes_master_endpoint
3CoreDNS is running at https://coredns_endpoint
4
5To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

使用_kubeconfig_配置文件配置kubectl。默认情况下,kubectl会在$HOME/.kube目录中查找名为config的文件。要改变这一点,您可以将$KUBECONFIG环境变量设置为自定义kubeconfig文件,或者在执行时使用--kubeconfig标志传入该自定义文件:

1kubectl cluster-info --kubeconfig=path_to_your_kubeconfig_file

<$>[备注] 注意: 如果您使用的是托管的Kubernetes集群,您的云提供商应该已经将其kubeconfig文件提供给您。 <$>

如果您不想在每个命令中都使用--kubeconfig标志,并且没有~/.kube/config文件 ,请在您的home目录中创建一个名为~/.kube的目录(如果该目录不存在),并复制kubeconfig文件,将其重命名为config`:

1mkdir ~/.kube
2cp your_kubeconfig_file ~/.kube/config

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

修改您的kubectl配置

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

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

1kubectl config view
1[secondary_label Output]
2apiVersion: v1
3clusters:
4- cluster:
5    certificate-authority-data: DATA+OMITTED
6. . .

修改集群

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

1kubectl config get-clusters
1[secondary_label Output]
2NAME
3do-nyc1-sammy

要将集群添加到您的配置中,请使用set-cluster子命令:

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

要从您的配置中删除集群,请使用ete-cluster

<$>[注] 注意: 这只会从您的配置中删除集群,不会删除实际的Kubernetes集群。 <$>

1kubectl config delete-cluster

修改用户

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

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

要从您的配置中删除用户,可以运行unset

1kubectl config unset users.username

背景

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

要查看您当前的上下文,可以使用Current-Conext

1kubectl config current-context
1[secondary_label Output]
2do-nyc1-sammy

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

1kubectl config get-contexts
1[secondary_label Output]
2CURRENT NAME CLUSTER AUTHINFO NAMESPACE
3*         do-nyc1-sammy do-nyc1-sammy do-nyc1-sammy-admin

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

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

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

1kubectl config use-context context_name
1[secondary_label Output]
2Switched to context "do-nyc1-sammy"

您可以通过删除-上下文来删除上下文:

1kubectl config delete-context context_name

使用命名空间

Kubernetes中的命名空间是一种抽象,它允许您将集群细分为多个虚拟集群。通过使用命名空间,您可以将集群资源分配给多个团队,并适当地确定对象的范围。例如,您可以为生产工作负载使用prod命名空间,为开发和测试工作负载使用dev命名空间。

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

1kubectl get namespace
1[secondary_label Output]
2NAME STATUS AGE
3default Active 2d21h
4kube-node-lease Active 2d21h
5kube-public Active 2d21h
6kube-system Active 2d21h

要为您当前的上下文设置命名空间,请使用set-Context--Current

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

要创建命名空间,请使用创建命名空间

1kubectl create namespace namespace_name
1[secondary_label Output]
2namespace/sammy created

类似地,要删除命名空间,可以使用删除命名空间

<$>[警告] 警告: 删除命名空间会删除命名空间中的** 一切** ,包括运行部署、实例和其他工作负载。只有当您确定要终止名称空间中正在运行的任何内容,或者如果要删除空的名称空间时,才运行此命令。 <$>

1kubectl delete namespace namespace_name

要获取给定命名空间中的所有Pod或对给定命名空间中的资源执行其他操作,请确保包含--命名空间标志:

1kubectl get pods --namespace=namespace_name

管理Kubernetes资源

通用语法

大多数kubectl管理命令的通用语法为:

1kubectl command type name flags

哪里

  • 命令是您想要执行的操作,如create
  • type为Kubernetes的资源类型,如部署
  • 名称是资源的名称,如app_Frontend
  • 标志是您想要包括的任何可选标志

例如,以下命令检索有关名为app_Frontend的部署的信息:

1kubectl get deployment app_frontend

声明式管理和kubectl应用

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

实际上,这意味着使用kubectl apply命令,该命令将特定的配置应用于给定的资源。如果目标资源不存在,则Kubernetes将创建该资源。如果资源已经存在,则Kubernetes将保存当前版本,并根据新的配置更新资源。这种_陈述性_方法的存在与运行kubectl createkubectl editkubectl scale命令集以管理资源的_PROMICAL_PROCESS相反。要了解有关管理Kubernetes资源的不同方式的更多信息,请参考Kubernetes文档中的Kubernetes Object Management

展开部署

例如,要将示例Nginx部署部署到您的集群,可以使用apply,并提供nginx-ployment.yaml清单文件的路径:

1kubectl apply -f nginx-deployment.yaml
1[secondary_label Output]
2deployment.apps/nginx-deployment created

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

1kubectl apply -k manifests_dir

您可以使用llout status来跟踪转出状态:

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

roll out status的替代方法是kubectl get命令,以及-w(手表)标志:

1kubectl get deployment -w
1[secondary_label Output]
2NAME READY UP-TO-DATE AVAILABLE AGE
3nginx-deployment 0/2 2 0 3s
4nginx-deployment 1/2 2 1 3s
5nginx-deployment 2/2 2 2 3s

您可以使用llout pausellout reasue暂停和恢复部署的铺开:

1kubectl rollout pause deployment/nginx-deployment
1[secondary_label Output]
2deployment.extensions/nginx-deployment paused
1kubectl rollout resume deployment/nginx-deployment
1[secondary_label Output]
2deployment.extensions/nginx-deployment resumed

修改正在运行的部署

如果要修改正在运行的部署,可以更改其清单文件,然后再次运行kubectl apply以应用更新。例如,我们将修改nginx-ployment.yaml文件,将副本数从2改为3

1[label nginx-deployment.yaml]
2. . .
3spec:
4  replicas: 3
5  selector:
6    matchLabels:
7      app: nginx
8. . .

kubectl diff命令允许您查看当前运行的资源与提供的配置文件中建议的更改之间的差异:

1kubectl diff -f nginx-deployment.yaml

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

1kubectl apply -f nginx-deployment.yaml

运行另一个‘GET DEPLOMENTION’应确认添加了第三个副本。

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

使用展开历史记录,您可以看到该部署的以前版本的列表:

1kubectl rollout history deployment/nginx-deployment
1[secondary_label Output]
2deployment.extensions/nginx-deployment
3REVISION CHANGE-CAUSE
41         <none>

使用rollout undo,您可以将Deployment恢复到其以前的任何版本:

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

取消选择部署

要删除正在运行的部署,请使用kubectl delete

1kubectl delete -f nginx-deployment.yaml
1[secondary_label Output]
2deployment.apps "nginx-deployment" deleted

命令式管理

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

创建部署

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

1kubectl create -f nginx-deployment.yaml --dry-run
1[secondary_label Output]
2deployment.apps/nginx-deployment created (dry-run)

现在,我们可以创建对象:

1kubectl create -f nginx-deployment.yaml
1[secondary_label Output]
2deployment.apps/nginx-deployment created

修改正在运行的部署

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

1kubectl scale --replicas=4 deployment/nginx-deployment
1[secondary_label Output]
2deployment.extensions/nginx-deployment scaled

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

1kubectl edit deployment/nginx-deployment

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

 1[label nginx-deployment]
 2# Please edit the object below. Lines beginning with a '#' will be ignored,
 3# and an empty file will abort the edit. If an error occurs while saving this file will be
 4# reopened with the relevant failures.
 5#
 6apiVersion: extensions/v1beta1
 7kind: Deployment
 8. . . 
 9spec:
10  progressDeadlineSeconds: 600
11  replicas: 4
12  revisionHistoryLimit: 10
13  selector:
14    matchLabels:
15. . .

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

现在运行get来检查更改:

1kubectl get deployment/nginx-deployment
1[secondary_label Output]
2NAME READY UP-TO-DATE AVAILABLE AGE
3nginx-deployment 2/2 2 2 6m40s

我们已经成功地将部署缩减为2个运行中的副本。您可以以类似的方式更新大多数Kubernetes对象的字段。

另一个用于就地修改对象的有用命令是kubectl patch。使用patch,您可以在不打开编辑器的情况下动态更新对象的字段。patch还允许使用各种合并和修补策略进行更复杂的更新。要了解更多相关信息,请参考使用kubectl patch.就地更新接口对象

下面的命令会补丁nginx-ployment对象,将Replicas字段从2更新为4ployployment对象的缩写。

1kubectl patch deploy nginx-deployment -p '{"spec": {"replicas": 4}}'
1[secondary_label Output]
2deployment.extensions/nginx-deployment patched

现在,我们可以检查更改:

1kubectl get deployment/nginx-deployment
1[secondary_label Output]
2NAME READY UP-TO-DATE AVAILABLE AGE
3nginx-deployment 4/4 4 4 18m

您也可以使用run命令强制创建部署。run将使用提供的镜像作为参数创建部署:

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

通过expose命令,您可以使用Kubernetes服务快速公开正在运行的部署,允许从您的Kubernetes集群外部进行连接:

1kubectl expose deploy nginx-deployment --type=LoadBalancer --port=80 --name=nginx-svc
1[secondary_label Output]
2service/nginx-svc exposed

这里我们将nginx-ployment部署暴露为负载均衡器服务,对外开放端口80,定向到容器端口80。我们将该服务命名为nginx-svc。使用LoadBalancer服务类型,负载均衡由Kubernetes自动预配和配置。要获取服务的外部IP地址,请使用get

1kubectl get svc nginx-svc
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)        AGE
3nginx-svc LoadBalancer 10.245.26.242 203.0.113.0 80:30153/TCP 22m

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

工作量检查和调试

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

查看Kubernetes资源

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

1kubectl get deployment -o wide
1[secondary_label Output]
2NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
3nginx-deployment 4/4 4 4 29m nginx nginx app=nginx

因为我们没有提供部署名称或命名空间,所以kubectl获取当前命名空间中的所有部署。-o标志提供额外的信息,如CONTAINERSIMAGES

除了get之外,您还可以使用Describe来获取资源及其关联资源的详细描述:

1kubectl describe deploy nginx-deployment
1[secondary_label Output]
2Name:                   nginx-deployment
3Namespace:              default
4CreationTimestamp:      Wed, 11 Sep 2019 12:53:42 -0400
5Labels:                 run=nginx-deployment
6Annotations:            deployment.kubernetes.io/revision: 1
7Selector:               run=nginx-deployment
8. . .

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

explain允许您快速拉取指定资源类型的可配置字段:

1kubectl explain deployment.spec

通过附加其他字段,您可以更深入地研究字段层次结构:

1kubectl explain deployment.spec.template.spec

获取容器的外壳访问权限

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

1kubectl get pod
1[secondary_label Output]
2nginx-deployment-8859878f8-7gfw9 1/1 Running 0 109m
3nginx-deployment-8859878f8-z7f9q 1/1 Running 0 109m

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

1kubectl exec -i -t nginx-deployment-8859878f8-7gfw9 -- /bin/bash
1[secondary_label Output]
2root@nginx-deployment-8859878f8-7gfw9:/#

现在,您可以通过外壳访问nginx容器。-i标志将stDIN传递给容器,而-t则给你一个交互的TTY。--双破折号充当kubectl命令和您想要在容器内运行的命令的分隔符。在本例中,我们运行的是/bin/bash

要在容器内部运行命令而不打开完整的外壳,可以省略-i-t标志,用您想运行的命令代替/bin/bash

1kubectl exec nginx-deployment-8859878f8-7gfw9 ls
 1[secondary_label Output]
 2bin
 3boot
 4dev
 5etc
 6home
 7lib
 8lib64
 9media
10. . .

拉取日志

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

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

1kubectl logs -f nginx-deployment-8859878f8-7gfw9
1[secondary_label Output]
210.244.2.1 - - [12/Sep/2019:17:21:33 +0000] "GET / HTTP/1.1" 200 612 "-" "203.0.113.0" "-"
32019/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"
4. . .

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

您也可以使用-p标志来拉取销毁容器的日志。当在之前运行容器实例的实例实例中使用该选项时,logs将打印被销毁容器的输出:

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

如果实例有多个容器,则可以使用-c标志指定要从中获取日志的容器。您可以使用--all-tainers=true标志从实例中的所有容器拉取日志。

端口转发和代理

若要获取实例的网络访问权限,可以使用port-forward

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

在本例中,我们使用sudo,因为本地端口80是保护端口。对于大多数其他端口,您可以省略sudo并以系统用户的身份运行kubectl命令。

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

您也可以使用部署/nginx-ployment作为要转发到的资源类型和名称。如果执行此操作,本地端口将转发到部署所选的Pod。

可以使用proxy命令在本地访问Kubernetes API服务器:

1kubectl proxy --port=8080
1[secondary_label Output]
2Starting to serve on 127.0.0.1:8080

在另一个外壳中,使用curl来浏览接口:

1curl http://localhost:8080/api/
 1[secondary_label Output]
 2{
 3  "kind": "APIVersions",
 4  "versions": [
 5    "v1"
 6  ],
 7  "serverAddressByClientCIDRs": [
 8    {
 9      "clientCIDR": "0.0.0.0/0",
10      "serverAddress": "203.0.113.0:443"
11    }
12  ]

CTRL-C关闭代理。

结论

本指南介绍了在管理Kubernetes集群和已部署到该集群的工作负载时可能使用的一些更常见的kubectl命令。

您可以通过咨询官方Kubernetes参考documentation.]了解更多关于kubectl的信息

作为使用kubectl的一部分,您可能会发现有更多的命令和变体非常有用。要了解有关所有可用选项的更多信息,您可以运行:

1kubectl --help
Published At
Categories with 技术
Tagged with
comments powered by Disqus