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集群中支持的不同对象。它的清单可以在一个YAML
或JSON
文件中定义,扩展名分别为.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-val
和max-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-name
和service-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。