Introduction
Kubectl是一个命令行工具,旨在管理Kubernetes对象和集群。它提供了一个命令行界面,用于执行常见操作,如创建和扩展部署、切换上下文以及访问运行容器中的外壳。
如何使用本指南:
- 本指南采用备忘单格式,包含自包含的命令行代码段。
- 它不是kubectl命令的详尽列表,但包含许多常见操作和用例。更详细的参考请参考Kubectl参考文档
- 跳转到与您要完成的任务相关的任何部分。
前提条件
- 要使用kubectl,您需要一个可用的Kubernetes集群。要了解如何从头开始创建Kubernetes集群,可以参考如何在Ubuntu 18.04上使用Kubeadm创建Kubernetes集群。或者,您可以使用DigitalOcean Kubernetes在几分钟内配置托管Kubernetes集群。要开始创建DigitalOcean Kubernetes集群,请参阅如何使用控制面板创建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
文件中的Source
kubectl自动完成脚本:
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_是一个对象,它包含一组集群的访问参数。它由cluster
、namespace
和user
三元组组成。上下文允许您在不同的群集配置集之间快速切换。
要查看您当前的上下文,可以使用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 create
、kubectl edit
和kubectl 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 pause
和llout 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
更新为4
;ploy
是ployment
对象的缩写。
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
标志提供额外的信息,如CONTAINERS
和IMAGES
。
除了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