kubectl命令示例,作为系统管理员要了解

Kubernetes,也被称为K8S,是一个流行的容器编排工具,用于管理和扩展容器化基础设施。

kubectl是我们用来查询和管理Kubernetes集群的常用CLI工具。kubectl使用Kubernetes的API接口来查看、控制和管理集群。它支持不同的平台,并且可以轻松设置来管理一个集群。

在本文中,我们将介绍一些常用的kubectl命令,这些命令有助于日常管理Kubernetes

获取kubectl

kubectl已经作为Kubernetes集群设置的一部分安装好。如果您从远程系统管理一个集群,您可以轻松地安装它以适应任何集群设置。

Linux系统上,您可以使用以下命令获取最新版本的kubectl:

$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

请确保将下载的二进制文件放置到固定位置,将该位置添加到您的PATH变量中,并使用chmod +x命令使其可执行。

Windows系统上,您可以通过首先从https://dl.k8s.io/release/stable.txt获取最新的稳定版本来下载最新可用的kubectl版本。

然后,使用curl替换{version}为最新版本进行下载,如下所示:

$ curl -LO https://dl.k8s.io/release/{version}/bin/windows/amd64/kubectl.exe

对于v 1.20.0,以下是curl命令:

$ curl -LO https://dl.k8s.io/release/v1.20.0/bin/windows/amd64/kubectl.exe

如果您的系统上没有curl,您还可以像下载其他文件一样使用浏览器下载kubectl可执行文件。

有关其他支持的方法和平台,请查阅官方指南以获取kubectl的详细信息here

验证kubectl设置

要检查kubectl的设置,可以运行以下版本命令:

$ kubectl version --client

kubectl使用的常见语法是:

$ kubectl [command] [TYPE] [NAME] [flags]

设置上下文和配置

在使用kubectl命令管理Kubernetes集群之前,我们必须首先设置配置和上下文。这可以使用kubectl命令自身完成。

要查看kubectl当前的配置,使用:

$ kubectl config view

要列出所有可用的上下文:

$ kubectl config get-contexts

要获取kubectl的当前上下文:

$ kubectl config current-context

我们可以使用以下命令更改正在使用的上下文:

$ kubectl config use-context [cluster-name]

要授权新用户添加到kubeconf中,可以使用以下命令:

$ kubectl config set-credentials NAME [--client-certificate=path/to/certfile] [--client-key=path/to/keyfile] [--token=bearer_token] [--username=basic_user] [--password=basic_password]

例如,要仅在“cluster-admin”上设置“client-key”字段而不触及其他值,可以使用以下命令:

$ kubectl config set-credentials cluster-admin --client-key=~/.kube/admin.key

或者,作为另一个示例,要为“cluster-admin”条目设置基本身份验证,可以指定用户名和密码如下:

$ kubectl config set-credentials cluster-admin --username=[username] --password=[password]

如果您想将客户端证书数据嵌入“cluster-admin”条目中,语法变为:

$ kubectl config set-credentials cluster-admin --client-certificate=~/.kube/admin.crt --embed-certs=true

如果您想让kubectl在特定的命名空间中使用,并将其保存为该上下文中所有后续kubectl命令的默认值:

$ kubectl config set-context --current --namespace=[NAMESPACE]

创建对象

kubectl用于部署Kubernetes集群中支持的不同对象。它的清单可以在一个YAMLJSON文件中定义,扩展名分别为.yaml.yml.json

使用给定的清单文件,我们可以使用以下命令创建定义的资源:

$ kubectl apply -f [manifest.yaml]

或者要指定多个YAML文件,请使用:

$ kubectl apply -f [manifest1.yaml] [manifest2.yaml]

要在目录中的所有清单文件中创建资源:

$ kubectl apply -f ./dir

或者从URL创建资源:

$ kubectl apply -f [URL]

或者直接从存储库中的镜像名称创建:

$ kubectl create deployment [deployment-name] --image=[image-name]

例如,要部署一个Nginx Web服务器的单个实例:

$ kubectl create deployment nginx --image=nginx

最后,要直接通过在CLI中输入YAML的内容而不引用实际保存的清单文件来部署资源,请尝试以下命令:

# 从stdin创建多个YAML对象
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - "1000000"
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox-sleep-less
spec:
  containers:
  - name: busybox
    image: busybox
    args:
    - sleep
    - "1000"
EOF

查看/查找资源

kubectl提供了get命令来列出部署的资源,获取其详细信息并了解更多信息。

要列出默认命名空间中的所有服务,请使用:

$ kubectl get services

类似地,要在所有命名空间中列出Pod,语法如下:

$ kubectl get pods --all-namespaces

如果我们需要列出部署的Pod的更多详细信息,请使用-o wide标志:

$ kubectl get pods -o wide

获取部署详细信息的语法如下:

$ kubectl get deployment [deployment-name]

要获取Pod的YAML内容,我们可以使用-o yaml标志,如下所示:

$ kubectl get pod [pod-name] -o yaml

通常,我们需要获取有关Kubernetes资源的详细信息。kubectl的describe命令有助于获取这些详细信息。

我们可以获取有关节点的更多详细信息,如下所示:

$ kubectl describe nodes [node-name]

或者类似地获取Pod的详细信息:

$ kubectl describe pods [pod-name]

kubectl允许基于特定字段对输出进行排序。要按服务名称排序列出服务,请使用:

$ kubectl get services --sort-by=.metadata.name

或者要获取命名空间中所有运行中的Pod,我们可以尝试:

$ kubectl get pods --field-selector=status.phase=Running

要获取所有节点的外部IP(如果已分配),我们可以使用以下语法与-o jsonpath标志:

$ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'

要获取与资源(如Pod)相关联的标签,请尝试:

$ kubectl get pods --show-labels

要按时间戳排序获取事件列表,可以使用-sort-by标志:

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

如果我们想将集群的当前状态与应用清单应用时的状态进行比较,可以使用diff命令:

$ kubectl diff -f ./manifest-file.yaml

修改资源

部署的资源通常需要进行任何配置更改。

要通过更新其镜像来执行“frontend”部署的“www”容器的滚动更新,可以使用以下命令:

$ kubectl set image deployment/frontend www=image:v2

我们可以查看部署的历史记录,包括修订版本,如下所示:

$ kubectl rollout history deployment/frontend

或者要回滚到以前的部署,使用:

$ kubectl rollout undo deployment/frontend

我们还可以通过指定--to-revision标志来回滚到特定的修订版本,如下所示:

$ kubectl rollout undo deployment/frontend --to-revision=2

要检查滚动更新的状态,我们使用:

$ kubectl rollout status -w deployment/frontend

要执行滚动重启,例如“frontend”部署,使用:

$ kubectl rollout restart deployment/frontend

我们可以通过将其传递给标准输入来指定要替换Pod的JSON清单,如下所示:

$ cat pod.json | kubectl replace -f -

可能会出现需要强制替换、删除然后重新创建资源的情况(注意:这也会导致服务中断),可以使用以下命令:

$ kubectl replace --force -f [manifest-file]

标记资源(支持标签)很容易,可以使用以下命令:

$ kubectl label pods [pod-name] new-label=[label]

类似地,可以使用以下命令向资源添加注释:

$ kubectl annotate pods [pod-name] icon-url=[url]

可以使用以下命令对部署进行自动缩放:

$ kubectl autoscale deployment [dep-name] --min=[min-val] --max=[max-val]

这里,dep-name是要自动缩放的部署的名称,min-valmax-val表示用于自动缩放的最小值和最大值。

编辑资源

可以使用edit命令在首选编辑器中编辑API资源。

$ kubectl edit [api-resource-name]

或者使用自己的替代编辑器,指定KUBE_EDITOR,例如:

KUBE_EDITOR="nano" kubectl edit [api-resource-name]

扩展资源

Kubernetes支持扩展资源的功能之一,而kubectl使其易于实现。

要将名为foo的副本集扩展到3个副本,我们使用:

$ kubectl scale --replicas=3 rs/foo

或者,我们可以引用一个清单YAML文件来指定要扩展的资源,如下所示:

$ kubectl scale --replicas=3 -f foo.yaml

我们还可以根据部署的当前状态执行扩展操作,如下所示:

$ kubectl scale --current-replicas=2 --replicas=3 deployment/nginx

删除资源

创建的资源最终需要进行修改或删除。使用kubectl,我们可以以几种方式删除现有的资源。

要使用JSON文件中的规范删除一个pod,可以使用以下命令:

$ kubectl delete -f ./pod.json

我们可以使用相同名称pod-nameservice-name删除pod和service:

$ kubectl delete pod,service [pod-name] [service-name]

如果资源被标记,并且我们需要删除具有特定标签的资源,比如label-name,可以使用以下命令:

$ kubectl delete pods,services -l name=[label-name]

要删除命名空间中包含的所有pod和service,请使用以下命令:

$ kubectl -n [namespace] delete pod,svc --all

与运行中的Pod交互

我们可以使用kubectl获取有关运行中pod的详细信息,以帮助链接_3。

其中一个常用的命令是获取pod的日志,可以使用以下命令:

$ kubectl logs [pod-name]

或者通过特定标签来获取pod的日志:

$ kubectl logs -l name=[label-name]

或者获取特定容器的日志:

$ kubectl logs -l name=[label-name] -c [container-name]

我们还可以像使用Linux的tail -f命令一样使用kubectl的-f标志来实时查看日志:

$ kubectl logs -f [pod-name]

可以使用kubectl以交互方式运行pod:

$ kubectl run -i --tty busybox --image=busybox -- sh

或者在特定命名空间中运行pod:

$ kubectl run nginx --image=nginx -n [namespace]

可以使用attach命令将其连接到运行中的容器:

$ kubectl attach [pod-name] -i

可以通过以下命令在运行时为pod进行端口转发:

$ kubectl port-forward [pod-name] [local-machine-port]:[pod-port]

要直接在pod登录并获取输出,请使用以下命令:

$ kubectl exec [pod-name] -- [command]

如果pod包含多个容器,则需要使用以下命令:

$ kubectl exec [pod-name] -c [container-name] -- [command]

要显示给定pod及其容器的性能指标,可以使用以下命令:

$ kubectl top pod [pod-name] --containers

或者按照CPU或内存等指标进行排序,可以使用以下命令:

$ kubectl top pod [pod-name] --sort-by=cpu

与节点和集群交互

kubectl可以与节点和集群进行交互。以下是kubectl用于此目的的一些命令。

要将节点标记为不可调度,请使用以下命令:

$ kubectl cordon [node-name]

作为维护准备的一部分,可以将节点排出:

$ kubectl drain [node-name]

要将节点标记为可调度,请使用以下命令:

$ kubectl uncordon [node-name]

要获取与节点相关的性能指标,请使用以下命令:

$ kubectl top node [node-name]

要获取有关当前集群的详细信息,请使用以下命令:

$ kubectl cluster-info

我们还可以使用以下命令将群集状态转储到标准输出:

$ kubectl cluster-info dump

或者转储到文件中使用:

$ kubectl cluster-info dump --output-directory=/path/to/cluster-state

结论

Kubernetes 是该行业中的热词,了解如何有效地管理它将始终推动您的职业发展。kubectl是与Kubernetes集群进行交互的主要接口,本文演示了这个工具在经验丰富的用户手中的强大功能。

然而,我们只能概述kubectl可能做的更多。要进一步详细了解并查看其支持的所有内容,请参阅其官方文档 here

类似文章