概述
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> //重启指定服务