kubectl 用法概述

  • kubectl 命令行语法如下
[root@server1 ~]# kubectl [command] [TYPE] [NAME] [flags]
#command: 子命令,用于操作资源对象,例如:create,get,describe,delete等
#TYPE:资源对象类型,区分大小写,能以单数、复数或者简写形式表示
#NAME:资源对象名称,区分大小写
#flags: kubectl 子命令可选参数,例如:-s或者--server
  • 在一个命令行中也可以同时对多个资源对象进行操作,以多个TYPE和NAME的组合表示,例如
#获取多个相同类型资源的信息
$kubectl get pod example-pod1 example-pd2
#获取多个不同类型对象的信息
$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 servicel.yaml

kubectl 常用子命令详解

  • kubectl的子命令非常丰富,涵盖了对kubenetes集群的主要操作,包括资源对象的创建、删除、查看、修改、配置、运行等
子命令 语法 说明
annotate kubectl annotate (-f filename / TYPE NAME / TYPE/NAME) KEY_1=VAL_1 [--overwrite] [--all] 添加或更新资源对象的annotation信息
api-versions kubectl api-versions [flags] 列出当前系统支持的API版本列表
apply kubectl apply -f FILENAME [flags] 从配置文件或stdin中对资源对象进行配置更新
auth kubectl auth [flags] [options] 检测RBAC权限设置
attach kubectl attach POD -c container [flags] 附着到一个正在运行的容器上
autosccale kubectl autosccale (-f filename type name type/name) [--min=] --max=maxpods [--cpu-percent=CPU] 对Deployment、ReplicaSet 或ReplicationController 进行水平自动扩容和缩容操作的设置
cluster-info kubectl cluster-info [flags] 显示集群master和内置服务的信息
completion kubectl completion shell [flags] 输出shell命令的执行结果码(bash或zsh)
config kubectl config SUBCOMMAND [flags] 修改kubeconfig文件
rollout content2 content3
rolling-update content2 content3
scale content2 content3
autoscale content2 content3
apply content2 content3
describe content2 content3

kubectl格式化输出

  • kubectl 命令可以对结果进行多种格式化显示,输出的格式通过-o参数指定
$ kubectl [command] [TYPE] [NAME] -o=<output_format>
  • 可选输出格式如下
输出格式 说明
-o=custom-columns=<spec> 根据自定义列名进行输出,以逗号分隔
-o=custom-columns-file=<filename> 设置自定义列名的配置文件名称
-o=json 输出 JSON 格式的 API 对象
-o=jsonpath=<template> 打印 jsonpath 表达式中定义的字段
-o=jsonpath-file=<filename> 打印由 文件中的 jsonpath 表达式定义的字段
-o=name 仅打印资源名称
-o=wide 以纯文本格式输出任何附加信息,对于 Pod ,包含节点名称
-o=yaml 输出 YAML 格式的 API 对象
  • 常用输出格式如下
#显示pod的更多信息
$ kubecrl get pod <pod-name> -o wide
 
#以yaml格式显示Pod信息
$ kubecrl get pod <pod-name> -o yaml

#以自定义列名显示Pod信息
$ kubecrl get pod <pod-name> -o custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion

#基于自定义列名配置文件进行输出
$ kubecrl get pod <pod-name> -o=custom-columns-file=template.txt

#关闭服务端列名
$ kubecrl get pod <pod-name> --server-print=false

#将输出结果按照某字段排序
$ kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>
#例如:
$ kubecrl get pod <pod-name> --sort-by=.metadata.name

kubectl 常用操作示例

1.1 kubectl apply

  • 对现有对象进行增量更改,根据yaml文件里面列出来的内容,升级现有的资源对象,yaml文件的内容可以只写需要升级的属性
#语法
$ kubectl apply -f FILENAME

#创建资源对象
$ kubectl apply -f service.yaml
$ kubectl apply -f controller.yaml
#使用目录下所有的yaml、json、yml文件
$ kubectl apply -f <dir>

1.2 kubectl get

  • 列出一个或多个资源对象的信息
#要对所有类型相同的资源进行分组,请执行以下操作:TYPE1 name1 name2 name
$ kubectl get pod example-pod1 example-pod2
#分别指定多个资源类型:TYPE1/name1 TYPE1/name2 TYPE2/name3 TYPE/name

#获取所有资源信息
$ kubectl get all

#显示所有命名空间
$ kubectl get namespace

#显示指定命名空间的pods
$ kubectl get pods --namespace=default
$ kubectl get pods -n default

#同时获取所有的rc和service
$ kubectl get rc,services

#查看节点 labels
$ kubectl get node --show-labels

#列出节点server01上运行的多有Pod
$ kubectl get pods --field-selector=spec.nodeName=server01

1.3 kubectl describe

  • 显示一个或多个资源的详细信息
#显示所有Node的详细信息
$ kubectl describe nodes

#显示所有Pod的详细信息
$ kubectl describe pod webapp-77d76fbbfb-mj6nq -n test-nginx

#显示一个node的详细信息
$ kubectl describe nodes k8s-minion

#显示所有包含label name=myLabel的pod
$ kubectl describe po -l name=myLabel

#显示pod.json中的资源类型和名称指定的pod
$ kubectl describe -f pod.json

1.4 kubectl delete

  • 按文件名、stdin、资源和名称或按资源和标签选择器删除资源
#通过yaml文件删除
$ kubectl delete -f rc-nginx.yaml 

#使用 pod.json中指定的资源类型和名称删除pod
$ kubectl delete -f ./pod.json

#删除 Label name = myLabel的pod和Service
$ kubectl delete pods,services -l name=myLabel

#强制删除dead node上的pod
$ kubectl delete pod foo --grace-period=0 --force

1.5 kubectl exec

  • exec命令dockerexec命令差不多,为在一个已经运行的容器中执行一条shell命令,如果一个pod容器中,有多个容器,需要使用-c选项指定容器
  • 常用格式
$ kubectl exec -it podName  -c  containerName -n namespace -- shell comand
#shell命令前,要加-- 号,否则shell命令中的参数,不能识别
  • 示例
#通过kubectl exec在容器中创建目录
$ kubectl exec -it nginx-master-asjl -c nginx-master -n nginx  -- mkdir -p /usr/local/nginx 

#在 pod 外执行容器中echo 命令
$ kubectl exec -n my-namespace my-pod -- echo hello 

#在 pod 外查看容器中的进程信息
$ kubectl exec my-pod --bash -c 'ps -ef| grep hello'

#获取命名空间下的POD,进行批量执行
kubectl get pods -o name -n your-namespace |grep -v "demo\|hello" | xargs -I{} kubectl -n your-namespace exec {} -- bash -c  'ps ux|grep ng'

#进入交互式终端界面
$  kubectl exec my-pod -- /bin/bash

1.6 kubectl logs

  • 输出pod中一个容器的日志。如果pod只包含一个容器则可以省略容器名。容器内程序输出到标准输出的内容。与docker的logs命令类似。如要获得tail -f的方式,也可以使用-f选项。
#返回仅包含一个容器的pod nginx的日志快照
$ kubectl logs nginx

#持续输出pod java中的容器web-m的日志
$ kubectl logs -f -c java web-m

#查看指定pod的日志
$ kubectl logs <pod_name>
$ kubectl logs -f <pod_name> #类似tail -f的方式查看(tail -f 实时查看日志文件 tail -f 日志文件log)

#查看指定pod中指定容器的日志
$ kubectl logs <pod_name> -c <container_name>

#一次性查看
$ kubectl logs pod_name -c container_name -n namespace

#tail -f方式实时查看
$ kubectl logs -f <pod_name> -n namespace

1.7 在线编辑运行中的资源对象

  • 使用默认编辑器 编辑服务器上定义的资源。使用命令行工具获取的任何资源都可以使用edit命令编辑。edit命令会打开使用KUBE_EDITORGIT_EDITOR 或者EDITOR环境变量定义的编辑器,可以同时编辑多个资源,但所编辑过的资源只会一次性提交。edit除命令参数外还接受文件名形式
  • 文件默认输出格式为YAML。要以JSON格式编辑,请指定“-o json”选项
#编辑deployment
$ kubectl edit deployment nginx

#以YAML格式输出编辑deployment“mydeployment”,并将修改的配置保存在annotation中
$ kubectl edit deployment/mydeployment -o yaml --save-config

1.8 将Pod端口映射到宿主机

#将Pod 80端口映射到宿主机8888端口
$ kubectl port-forward --address 0.0.0.0 pod/nginx-xxxx-xxxx 8888:80

1.9 在容器和node质检复制文件

$ kubectl cp nginx-xxxx-xxxx:/etc/passwd /tmp/123

1.10 设置资源对象标签

#将名为“default”的命名空间设置 “testing=true” 标签
$ kubectl label namespace default testing=true

1.11 创建和使用命令行插件

  • 用户自定义插件的可执行文件名需要以 “kubectl-” 开头,复制到$PATH 中的某个目录下,然后就可以通过kubectl<plugin-name> 运行自定义插件了
  • 示例
#通过shell实现输出hello,创建名为 kubectl-hello的shell脚本

#!/bin/bash
echo "hello"

# 未脚本添加权限
$ chmod a+x ./kubectl-hello

#复制到/bin/执行
$kubectl-hello
hello