Kubernetes集群管理工具kubectl

概述

kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装和部署

命令格式

命令格式如下

kubectl [command] [type] [name] [flags]

参数

  • command:指定要对资源执行的操作,例如create、get、describe、delete
  • type:指定资源类型,资源类型是大小写敏感的,开发者能够以单数 、复数 和 缩略的形式

常见命令

kubectl help 获取更多信息

通过 help命令,能够获取帮助信息

# 获取kubectl的命令
kubectl --help

# 获取某个命令的介绍和使用
kubectl get --help

一、命令分类

基础命令

常见的基础命令

命令介绍
create通过文件名或标准输入创建资源
expose将一个资源公开为一个新的Service
run在集群中运行一个特定的镜像
set在对象上设置特定的功能
get显示一个或多个资源
explain文档参考资料
edit使用默认的编辑器编辑一个资源
delete通过文件名,标准输入,资源名称或标签来删除资源

部署命令

命令介绍
rollout管理资源的发布
rolling-update对给定的复制控制器滚动更新
scale扩容或缩容Pod数量,Deployment、ReplicaSet、RC或Job
autoscale创建一个自动选择扩容或缩容并设置Pod数量

集群管理命令

命令介绍
certificate修改证书资源
cluster-info显示集群信息
top显示资源(CPU/M)
cordon标记节点不可调度
uncordon标记节点可被调度
drain驱逐节点上的应用,准备下线维护
taint修改节点taint标记

故障和调试命令

命令介绍
describe显示特定资源或资源组的详细信息
logs在一个Pod中打印一个容器日志,如果Pod只有一个容器,容器名称是可选的
attach附加到一个运行的容器
exec执行命令到容器
port-forward转发一个或多个
proxy运行一个proxy到Kubernetes API Server
cp拷贝文件或目录到容器中
auth检查授权

其它命令

命令介绍
apply通过文件名或标准输入对资源应用配置
patch使用补丁修改、更新资源的字段
replace通过文件名或标准输入替换一个资源
convert不同的API版本之间转换配置文件
label更新资源上的标签
annotate更新资源上的注释
completion用于实现kubectl工具自动补全
api-versions打印受支持的API版本
config修改kubeconfig文件(用于访问API,比如配置认证信息)
help所有命令帮助
plugin运行一个命令行插件
version打印客户端和服务版本信息

目前使用的命令

1.1 kubectl get 列出资源

k8s 中最最最常用的命令kubectl get,要记住,k8s 把所有的东西都抽象成了资源,而kubectl get就是用来查看这些资源的。最常见的资源就是 pod 。

什么是 pod?
pod 的概念其实和docker中的容器非常相似。他是 k8s 中的最小工作单位。你可以把 pod 理解成一个一个的小机器人,而 k8s 抽象出来的大资源池就是他们的工厂。

pod 和 docker 容器的关系?
pod 将一个或多个docker容器封装成一个统一的整体进行管理并对外提供服务。

不仅我们自己的服务是要包装成 pod 的,就连 k8s 自己也是运行在一堆 pod 上。接下来就让我们查看一下 k8s 的 pod :

kubectl get pod -n kube-system

-n参数指定了要查看哪个命名空间下的 pod 。 k8s 所有的 pod 都被放置在kube-system命名空间下。
在这里插入图片描述

其中每一行就是一个资源,这里我们看到的资源是 pod 。你看到的 pod 数量可能和我的不一致,因为这个列表里包含了 k8s 在所有节点上运行的 pod ,你加入的节点越多,那么显示的 pod 也就越多。我们来一列一列的看:

  • NAME:第一列是 pod 的名字,k8s 可以为 pod 随机分配一个五位数的后缀。
  • READY:第二列是 pod 中已经就绪的 docker 容器的数量,上文中我们提到了,pod 封装了一个或多个 docker 容器。在这里,1/1的含义为就绪1个容器/共计1个容器。
  • STATUS:第三列是 pod 的当前状态,下面是一些常见的状态:
状态名含义
Running运行中
Error异常,无法提供服务
Pending准备中,暂时无法提供服务
Terminaling结束中,即将被移除
Unknown未知状态,多发生于节点宕机
PullImageBackOff镜像拉取失败
  • RESTART:k8s 可以自动重启 pod,这一行就是标记了 pod 一共重启了多少次。
  • AGE:pod 一共存在了多长时间。

kubectl get可以列出 k8s 中所有资源
这里只介绍了如何用kubectl获取 pod 的列表。但是不要把get和pod绑定在一起,pod 只是 k8s 中的一种服务,你不仅可以get pod,还可以get svc(查看服务)、get rs(查看副本控制器)、get deploy(查看部署)等等等等,如果想查看某个资源而又不知道命令是什么,kbuectl get <资源名>就对了。
如果你想看更多的信息,就可以指定-o wide参数,如下:

kubectl get pod -n kube-system -o wide

在这里插入图片描述

1.2 kubectl describe 查看详情

kubectl describe命令可以用来查看某一资源的具体信息,他同样可以查看所有资源的详情,不过最常用的还是查看 pod 的详情。他也同样可以使用-n参数指定资源所在的命名空间。

kubectl describe pod kube-apiserver-iz2zeb4qsoj3p5ymi6ksehz -n kube-system

输出结果:
在这里插入图片描述

1.3 kubectl logs 查看日志

如果你想查看一个 pod 的具体日志,就可以通过kubectl logs <pod名>来查看。注意,这个只能查看 pod 的日志。通过添加-f参数可以持续查看日志。例如,查看kube-system命名空间中某个flannel pod 的日志,注意修改 pod 名称:

kubectl logs -f -n kube-system kube-apiserver-iz2zeb4qsoj3p5ymi6ksehz

如果你发现某个 pod 的服务有问题,但是状态还是显示Running,就可以使用kubectl logs来查看其详细日志。

1.4 kubectl create 创建资源

k8s 中的所有东西都可以通过kubectl create命令创建,无论你是想创建一个 pod 还是一个大型的滚动升级服务deployment,create命令都可以做到。使用create生成一个资源主要有两种常用方法,从yaml配置文件创建简易创建
从yaml配置文件创建
如果你想让 k8s 生成一个和你想象中一模一样的资源,那你就要充分而详细的描述这个资源,k8s 就提供了这么一个方法,你可以使用yaml格式创建一个文件,按照 k8s 指定好的结构定义一个对象,然后使用如下方法将该文件传递给 k8s。它就可以按照你的描述进行生成了:

kubectl create -f <配置文件名.yaml>

例如,使用下面的配置文件就可以创建一个最简单的 pod:
kubia-manual.yaml

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

然后使用kubectl create -f kubia-manual.yaml即可创建
简易创建
k8s 为一些常用的资源提供了简易创建的方法,比如说service、namespace、deployment等,这些方法可以使用kubectl create <资源类型> <资源名>的方式创建。例如我想创建一个名叫hello-world的命名空间,直接使用下面命令即可:

kubectl create namespace hello-world

1.5 kubectl explain 解释配置

k8s 可以通过配置文件来生成资源,而为了尽可能详细的描述资源的模样,k8s 提供了数量庞大的配置项,explain(解释)命令就可以帮助我们快速的了解到某个配置项的作用。
例如我想要了解创建 pod 的哪些基本属性都是干什么的,输入kubectl explain pod即可:

[root@iZ2zeb4qsoj3p5ymi6ksehZ k8s]# kubectl explain pod
KIND:     Pod
VERSION:  v1

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion	<string>
     APIVersion defines the versioned schema of this representation of an
     object. Servers should convert recognized schemas to the latest internal
     value, and may reject unrecognized values. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources

   kind	<string>
     Kind is a string value representing the REST resource this object
     represents. Servers may infer this from the endpoint the client submits
     requests to. Cannot be updated. In CamelCase. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds

   metadata	<Object>
     Standard object's metadata. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata

   spec	<Object>
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

   status	<Object>
     Most recently observed status of the pod. This data may not be up to date.
     Populated by the system. Read-only. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

如果想要了解matedata(元数据)字段都有哪些配置项怎么办呢?

kubectl explain pod.matedata

1.8 kubectl delete 删除

delete命令的使用非常简单

kubectl delete <资源类型> <资源名>

如果你想删除所有的 pod,就可以这么写:

kubectl delete pod --all 

如果你想删除一切!那就这么写:

kubectl delete all --all

1.9 kubectl edit 修改配置

如果在日常维护过程中,因为某些原因我们需要变更一些服务的设置该怎么办呢?每个资源都是通过一个yaml配置文件生成的,哪怕是简易创建的资源,也是 k8s 从一个默认的配置文件创建而来的。
我们可以在get命令后附加-o yaml文件查看某个现有资源的配置项。例如,查看 pod kubia-manual的配置项:

kubectl get pod kubia-manual -o yaml

之后就会弹出系统设置的默认编辑器。这时我们就可以做任意修改,例如将名称改为kubia-manual-v2。首先定位到metadata.name字段,然后修改他的值:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: "2019-07-07T07:31:11Z"
  name: kubia-manual # > kubia-manual-v2
  namespace: default
  resourceVersion: "790349"
  selfLink: /api/v1/namespaces/default/pods/kubia-manual
  uid: 51eaa1e6-5749-4e79-aec9-12cf2a3e485d
spec:
  ...

修改完成后输入:wq保存,随后你会发现, k8s 居然报错了

A copy of your changes has been stored to "/tmp/kubectl-edit-vj0ts.yaml"
error: At least one of apiVersion, kind and name was changed

这个是 k8s 做出的限制,你无法修改一个运行中资源的名称或类型。那我们就来修改一下他的其他属性好了。例如将拉取镜像的标签指定为latest。重新edit配置文件,找到spec。containers.image字段,然后在最后添加:latest后保存。随后 k8s 会弹出保存成功,如下:

pod/kubia-manual edited

这时我们再kubectl describe pod kubia-manual查看该 pod 的详情,就可以发现对应的字段已经更新了:

Name:         kubia-manual
Namespace:    default
Priority:     0
Node:         worker1/192.168.56.21
Start Time:   Sun, 07 Jul 2019 07:31:11 +0000
Labels:       <none>
Annotations:  <none>
Status:       Running
IP:           10.244.1.14
Containers:
  kubia:
    Container ID:   docker://89617ffcc9b1455c514e5129a9b2694c43a2aff9b4c0449d5efc4aea1fe41db6
    # 已经显式的应用了 latest 标签
    Image:          luksa/kubia:latest
    Image ID:       docker-pullable://luksa/kubia@sha256:3f28e304dc0f63dc30f273a4202096f0fa0d08510bd2ee7e1032ce600616de24
    Port:           8080/TCP

kubectl edit <资源类型> <资源名> 可以编辑一个资源的具体配置项。edit命令在实际使用中更偏向于人工修改某个配置项来解决问题,例如修改镜像地址解决拉取不到镜像的问题。

1.10 kubectl apply 应用配置

使用kubectl edit可以简单快捷的编辑配置,但是如果我们想对资源进行大范围的修改呢?总不能打开配置项一个一个手动修改吧。这时候就可以用到我们的kubectl apply命令了。基本用法如下:

kubectl apply -f <新配置文件名.yaml>

kubeclt apply可以说是edit命令的升级版,它和edit最大的区别就是,apply接受一个yaml配置文件,而不是打开一个编辑器去修改。k8s 在接受到这个配置文件后,会根据metadata中的元数据来查找目标资源,如果没有的话则直接新建,如果找到的话就依次比对配置文件之间有什么不同点,然后应用不同的配置
这么做的好处有很多,例如你通过kubectl apply -f https://some-network-site/resourse.yaml命令从一个网站上部署了你的资源,这样当它的管理者更新了这个配置文件后,你只需要再次执行这个命令就可以应用更新后的内容了,而且完全不用关心修改了哪些配置项。

重启k8s服务

直接删除 pod

服务会中断

kubectl -n <namespace> get pod
kubectl -n <namespace> delete pod <pod name>
kubectl -n <namespace> delete pod --all

rollout

服务不中断

kubectl -n <namespace> rollout status deployments  //查看所有状态
kubectl -n <namespace> rollout restart deployments  //重启所有服务
kubectl -n <namespace> rollout status deployments/<service-name>  //重启指定服务

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值