0
点赞
收藏
分享

微信扫一扫

k8s教程(05)-kubectl详解


文章目录

  • ​​01 引言 ​​
  • ​​02 kubectl 命令 ​​
  • ​​2.1 kubectl 语法 ​​
  • ​​2.2 kubectl 子命令详解​​
  • ​​2.3 kubectl 可操作的资源对象详解​​
  • ​​2.4 kubectl 的公共参数说明​​
  • ​​2.5 kubectl 格式化输出​​
  • ​​03 kubectl 操作例子 ​​
  • ​​3.1 kubectl apply​​
  • ​​3.2 kubectl get​​
  • ​​3.3 kubectl describe​​
  • ​​3.4 kubectl delete​​
  • ​​3.5 kubectl exec​​
  • ​​3.6 kubectl logs​​
  • ​​3.7 kubectl edit ​​
  • ​​3.8 kubectl port-forward ​​
  • ​​3.9 kubectl cp ​​
  • ​​3.10 kubectl label ​​
  • ​​3.11 创建和使用命令行插件​​

01 引言

​kubectl ​​​作为客户端​​CLI​​​工具,可以让用户通过命令行对​​ Kubernetes​​​集群进行操作,本文对 ​​kubectl ​​的子命令和用法进行详细说明。

02 kubectl 命令

2.1 kubectl 语法

​kubectl ​​命令行的语法如下:

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

其含义如下:

  • command:子命令,用于操作资源对象,例如create、get、describe、delete等。
  • TYPE:资源对象的类型,区分大小写,能以单数、复数或者简写形式表示。例如以下 3 种 TYPE 是等价的。
kubectl get pod podl
kubectl get pods pod1
kubectl get po podl
  • NAME:资源对象的名称,区分大小写。如果不指定名称,系统则将返回属于 TYPE 的全部对象的列表,例如运行 kubectl get pods 命令后将返回所有 Pod 的列表。

在一个命令行中也可以同时对多个资源对象进行操作,以多个 ​​TYPE​​​ 和 ​​NAME​​ 的组合表示,示例如下。

① 获取多个相同类型资源的信息,以 ​​TYPE1 name1 name2 name <#>​​格式表示:

kubectl get pod example-pod1 example-pod2

② 获取多种不同类型对象的信息,以​​TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE<#>/name<#>​​格式表示:

kubectl get pod/example-pod1 replicationcontroller/example-rc1

③ 同时应用多个 ​​YAML​​​ 文件,以多个​​-f file​​ 参数表示:

kubectl get pod -f pod1.yaml -f pod2.yaml
kubectl create -f pod1.yaml -f rc1.yaml -f service1.yaml

④​​ flags​​​: ​​kubectl ​​​子命令的可选参数,例如使用​​-s​​​ 或​​-server ​​​设置 ​​API Server ​​​的 ​​URL​​ 地址,而不使用默认值。

2.2 kubectl 子命令详解

kubectl 的子命令非常丰富,涵盖了对 Kubernetes集群的主要操作,包括资源对象的创建、删除、查看、修改、配置、运行等。
k8s教程(05)-kubectl详解_命令行

k8s教程(05)-kubectl详解_kubernetes_02

k8s教程(05)-kubectl详解_容器_03

2.3 kubectl 可操作的资源对象详解

kubectl 可操作的资源对象列表如下图所示,可以通过 ​​kubectl api-resources​​​ 命令进行查看:
k8s教程(05)-kubectl详解_命令行_04

k8s教程(05)-kubectl详解_命令行_05

k8s教程(05)-kubectl详解_命令行_06

2.4 kubectl 的公共参数说明

每个子命令(如​​create、delete、get​​​等)还有其特定的命令行参数,可以通过 ​​$kubectl [command] -help ​​命令进行查看。

k8s教程(05)-kubectl详解_kubernetes_07
k8s教程(05)-kubectl详解_容器_08

2.5 kubectl 格式化输出

​kubectl ​​​命令可以对结果进行多种格式化显示,输出的格式通过​​-o​​ 参数指定:

kubectl  [command] [TYPE] [NAME] -o= <output format>

根据不同子命令的输出结果,可选的输出格式如图所示:
k8s教程(05)-kubectl详解_kubectl_09
常用的输出格式示例如下:

① 显示 ​​Pod​​ 的更多信息,例如 ​​Node IP ​​等:

kubectl get pod  <pod-name> -o wide

② 以 ​​YAML​​ 格式显示 ​​Pod​​ 的详细信息:

kubectl get pod  <pod-name> -o yaml

③ 以自定义列名显示 ​​Pod​​ 的信息:

kubectl get pod  <pod-name>-o

custom-columns=NAME:metadata. Name, RSRC: metadata. Resourceversion

④ 基于自定义列名配置文件进行输出:

kubectl get pods  <pod-name>-o=custom-columns-file=template.txt

​template.. txt​​文件的内容如下:

NAME          RSRC

metadata.Name metadata.Resourceversion

输出结果为如下:

NAME     RSRC

pod-name 52305

⑤ 关闭服务端列名。在默认情况下​​Kubernetes​​服务端会将资源对象的某些特定信息显示为列,这可以通过设置​​-server-print=false​​ 参数进行关闭,例如:

kubectl get pods  <pod-name> --server-print=false

输出结果:

NAME      AGE
pod-name 1m

⑥ 将输出结果按某个字段排序。可以通过​​--sort-by​​ 参数以 ​​jsonpath​​ 表达式进行指定:

kubectl  [command] [TYPE]  [NAME] --sort-by= <isonpath exp>

例如,按照资源对象的名称进行排序:

kubectl get pods --sort-by=.metadata. Name

03 kubectl 操作例子

3.1 kubectl apply

kubectl apply:以文件或 ​​stdin​​ 部署或更新一个或多个资源

基于 ​​example-service.yaml​​​ 中的定义创建一个​​ Service​​ 资源:

kubectl apply -f example-service.yaml

使用 ​​example--controller.yaml​​​ 中的定义创建一个 ​​Replication Controller​​资源:

kubectl apply -f example-controller.yaml

使用​​<directory>​​目录下所有yaml、yml 和json 文件中的定义进行创建:

kubectl apply -f  <directory>

3.2 kubectl get

kubectl get:列出一个或多个资源对象的信息

以文本格式列出所有 ​​Pod​​:

kubectl get pods

以文本格式列出所有 ​​Pod​​​,包含附加信息(如 ​​Node IP​​):

kubectl get pods -o wide

以文本格式列出指定名称的 ​​RC​​:

kubectl get replicationcontroller  <rc-name>

以文本格式列出所有 ​​RC​​​ 和​​ Service​​:

kubectl get rc, services

以文本格式列出所有 ​​Daemonset​​​,包括未初始化的 ​​Daemonset​​:

kubectl get ds --include-uninitialized

列出在节点 ​​server01​​​ 上运行的所有​​ Pod​​:

kubectl get pods --field-selector=spec.nodeName=server01

3.3 kubectl describe

kubectl describe:显示一个或多个资源的详细信息)

显示名称为​​<node-name>​​的节点的详细信息:

kubectl describe nodes  <node-name>

显示名称为​​<pod-name>​​的 Pod 的详细信息:

kubectl describe pods/ <pod-name>

显示名称为​​<rc-name>​​​的​​RC​​​控制器管理的所有​​Pod​​的详细信息:

kubectl describe pods  <rc-name>

描述所有 Pod 的详细信息:

kubectl describe pods

对​​ kubectl get​​​ 和​​ kubectl describe​​ 命令说明如下:

  • kubectl get命令:常用于查看同一资源类型的一个或多个资源对象,可以使用​​-o​​​ 或​​-output​​​ 参数自定义输出格式,还可以通过​​-w ​​​或​​-watch ​​参数开启对资源对象更新的监控。
  • kubectl describe 命令:更侧重于描述指定资源的各方面详细信息,通过对​​API Server​​​ 的多个​​API​​​ 调用来构建结果视图。例如通过​​kubectl describe node​​​ 命令不仅会返回节点信息,还会返回在其上运行的​​Pod​​ 的摘要、节点事件等信息。

3.4 kubectl delete

kubectl delete:该命令可以使用文件、​​stdin​​ 的输入删除指定的资源对象,还可以通过标签选择器、名称、资源选择器等条件来限定待删除的资源范围。

使用在 ​​pod.yaml​​​ 文件中指定的类型和名称删除 ​​Pod​​:

kubectl delete -f pod.yaml

删除所有带有​​<label-key> = <label-value>: ​​​标签的 ​​Pod ​​​和​​ Service​​:

kubectl delete pods, services -1  <label-key> = <label-value>

删除所有 Pod,包括未初始化的 Pod

kubectl delete pods -all

3.5 kubectl exec

kubectl exec:在 ​​Pod​​ 的容器中运行命令

在名称为​​<pod-name>​​​的 ​​Pod​​​ 的第 1 个容器中运行​​ date​​ 命令并打印输出结果:

kubectl exec  <pod-name> -- date

在指定的容器中运行 ​​date​​ 命令并打印输出结果:

kubectl exec  <pod-name> -c  <container-name> -- date

在​​Pod​​​的第1 个容器中运行​​bin/bash​​​ 命令进入交互式 ​​TTY​​ 终端界面:

kubectl exec -ti  <pod-name> /bin/bash

3.6 kubectl logs

kubectl logs:打印 Pod 中容器的日志

kubectl logs  <pod-name>

显示​​Pod​​​ 中名称为​​<container-name>​​​的容器输出到 ​​stdout ​​的日志:

kubectl logs  <pod-name> -c  <container-name>

持续监控显示 ​​pod​​​ 中的第 1 个容器输出到 ​​stdout ​​​的日志,类似于​​ tail -f​​ 命令的功能:

kubectl logs -f  <pod-name>

3.7 kubectl edit

kubectl edit 命令:编辑运行中的资源对象,例如使用下面的命令编辑运行中的一个 ​​Deployment​

kubectl edit deploy nginx

在命令运行之后,会通过 ​​YAML​​ 格式展示该对象的文本格式定义,用户可以对代码进行编辑和保存,从而完成对在线资源的直接修改。

3.8 kubectl port-forward

kubectl port-forward 命令:将 ​​Pod​​ 的端口号映射到宿主机

将 ​​Pod ​​​的 80 端口映射到宿主机的 8888 端口,客户端即可通过​​ http: //<NodeIP>:8888​​ 访问容器服务了:

kubectl port-forward --address 0.0.0.0\

pod/nginx-6ddbbc47fb-sfdcv 8888:80

3.9 kubectl cp

kubectl cp命令: 在容器和 Node之间复制文件

把​​Pod​​​(默认为第1个容器)中的​​/etc/fstab​​​文件复制到宿主机的​​/tmp​​ 目录下:

kubectl cp nginx-6ddbbc47fb-sfdcv:/etc/fstab /tmp

3.10 kubectl label

kubectl label命令: 设置资源对象的标签

名为“​​default​​​“”的命名空间设置“​​testing-=true​​”标签:

kubectl label namespaces default testing=true

3.11 创建和使用命令行插件

为了扩展 ​​kubectl​​​ 的功能,​​Kubernetes ​​​从 ​​1.8​​​ 版本开始引入插件机制,在 ​​1.14 ​​版本时达到稳定版。

用户自定义插件的可执行文件名需要以​​ kubectl-​​​”开头,复制到​​$PATH​​​中的某 个目录(如​​/usr/local/bin​​​)下,然后就可以通过​​kubectl<plugin-name>​​运行自定义插件了。

例如,通过 ​​Shell ​​​脚本实现一个名为 ​​hello​​​ 的插件,其功能为在屏幕上输出字符串“​​hello world​​​”。创建名为​​ kubectl-hello​​​的 ​​Shell ​​脚本文件,内容如下:

#!/bin/sh

echo "hello world"

为该脚本添加可执行权限:

chmod a+x./kubectl-hello

复制​​kubectl-helo​​​文件到​​/usr/local/bin/​​目录下,就完成了安装插件的工作:

cp ./kubectl-hello /usr/local/bin

然后在 ​​kubectl ​​命令后带上插件名称就能使用该插件了:

kubectl hello
hello world

卸载插件也很简单,只需要删除插件文件即可:

rm /usr/local/bin/kubectl-hello

通过插件机制,可以将某些复杂的​​kubectl​​​命令简化为运行插件的方式。例如想创建一个命令来查看当前上下文环境(​​context​​​)中的用户名,则可以通过 ​​kubectl config view​​​ 命令进行查看。为此,可以创建一个名为 ​​kubectl--whoami'​​​的 ​​Shell ​​脚本,内容如下:

#!/bin/bash

kubectl config view --template=' ({range contexts }) {if eq name "'$ (kubectl config current-context) '"}}Current user: {printf "%s\n"context.user }}{end)) { end }

为该脚本添加可执行权限,并复制到​​/usr/local/bin/​​目录下完成插件的安装:

chmod +x ./kubectl-whoami
cp ./kubectl-whoami /usr/local/bin

运行​​kubectl whoami​​命令,就能通过插件功能查看上下文环境中的用户名了:

kubectl whoami

Current user: plugins-user

另外,使用​​kubectl plugin list​​命令可以查看当前系统中已安装的插件列表:

kubectl plugin list

The following kubectl-compatible plugins are available:

/usr/local/bin/kubectl-hello

/usr/local/bin/kubectl-foo

/usr/local/bin/kubectl-bar


举报

相关推荐

0 条评论