文章目录
一、命令格式:
语法:kubectl 【command】 【type】 【name】 【flags】
1、command:指定在一个或多个资源上要执行的操作。
例如:create、get、describe、delete、apply等
2、TYPE:指定资源类型(如:pod、node、services、deployments等)。
资源类型大小写敏感,可以指定单数、复数或缩写形式。例如,以下命令生成相同的输出:
$ kubectl get pod
$ kubectl get pods
$ kubectl get po
3、NAME:指定资源的名称。
名称大小写敏感。如果省略名称空间,则显示默认名称空间的资源的详细信息或者提示:No resources found in default namespace.。
4、flags:指定可选的命令参数。
例如,可以使用 -s 或 --server标识来指定Kubernetes API服务器的地址和端口;-n指定名称空间等。
默认名称空间:default
官方服务名称空间:kube-system
1、command-flags
2、资源类型
资源类型 | 资源简称 | |
---|---|---|
nodes | no | |
events | ev | |
pod | po | |
node | no | |
service | svc | |
ingress | ing | |
namespaces | ns | |
deployment | deploy | |
ReplicaSet | rs | |
DaemonSets | ds | |
StatefulSets | sts | |
ConfigMap | cm | |
PersistentVolume | pv | |
PersistentVolumeClaim | pvc | |
storageclasses | sc | |
poddisruptionbudgets | pdb | |
HorizontalPodAutoscaler | hpa | |
ComponentStatus | cs | |
opaque | secret的一种类型,用于pod中密码的存储 | |
dockerconfigjson | secret的一种类型,用来存储私有 docker 仓库的认证信息 | |
serviceaccount | sa | secret的一种类型,用于pod认证 |
Role | 角色。用于鉴权 | |
clusterrole | 集群角色,用于鉴权 | |
Rolebinding | 角色绑定,用于鉴权 | |
clusterrolebinding | 集群角色绑定,用于鉴权 | |
resourcequota | quota | 用与资源限制 |
limitrange | limits | 用于设置默认资源限制区间 |
certificatesigningrequests | csr | |
componentstatuses | cs | |
customresourcedefinition | crd | |
endpoints | ep | |
ingresses | ing | |
networkpolicies | netpol | |
podsecuritypolicies | psp | |
3、K8S常用操作命令
[root@k8s-master opt]# kubectl --help
kubectl controls the Kubernetes cluster manager.
Find more information at: https://kubernetes.io/docs/reference/kubectl/overview/
# 基本命令初级
Basic Commands (Beginner):
create Create a resource from a file or from stdin.
expose 使用 replication controller, service, deployment 或者 pod 并暴露它作为一个 新的 Kubernetes
Service
run 在集群中运行一个指定的镜像
set 为 objects 设置一个指定的特征
# 基本命令中级
Basic Commands (Intermediate):
explain 查看资源的文档
get 显示一个或更多 resources
edit 在服务器上编辑一个资源
delete Delete resources by filenames, stdin, resources and names, or by resources and label selector
# 控制器部署命令
Deploy Commands:
rollout Manage the rollout of a resource
scale Set a new size for a Deployment, ReplicaSet or Replication Controller
autoscale Auto-scale a Deployment, ReplicaSet, StatefulSet, or ReplicationController
# 集群管理
Cluster Management Commands:
certificate 修改 certificate 资源.
cluster-info 显示集群信息
top 显示 Resource (CPU/Memory) 使用.
cordon 标记 node 为 unschedulable
uncordon 标记 node 为 schedulable
drain Drain node in preparation for maintenance
taint 更新一个或者多个 node 上的 taints
# 故障排除和调试命令
Troubleshooting and Debugging Commands:
describe 显示一个指定 resource 或者 group 的 resources 详情
logs 输出容器在 pod 中的日志
attach Attach 到一个运行中的 container
exec 在一个 container 中执行一个命令
port-forward Forward one or more local ports to a pod
proxy 运行一个 proxy 到 Kubernetes API server
cp 复制 files 和 directories 到 containers 和从容器中复制 files 和 directories.
auth Inspect authorization
debug Create debugging sessions for troubleshooting workloads and nodes
#高级命令
Advanced Commands:
diff Diff live version against would-be applied version
apply 通过文件名或标准输入流(stdin)对资源进行配置
patch Update field(s) of a resource
replace 通过 filename 或者 stdin替换一个资源
wait Experimental: Wait for a specific condition on one or many resources.
kustomize Build a kustomization target from a directory or URL.
# 设置
Settings Commands:
label 更新在这个资源上的 labels
annotate 更新一个资源的注解
completion Output shell completion code for the specified shell (bash or zsh)
# 其他命令
Other Commands:
api-resources Print the supported API resources on the server
api-versions Print the supported API versions on the server, in the form of "group/version"
config 修改 kubeconfig 文件
plugin Provides utilities for interacting with plugins.
version 输出 client 和 server 的版本信息
Usage:
kubectl [flags] [options]
Use "kubectl <command> --help" for more information about a given command.
Use "kubectl options" for a list of global command-line options (applies to all commands).
4、常用操作命令示例
kubectl create deployment nginx111 --image=nginx:latest # 创建应用
kubectl create deployment nginx111 --image=nginx:latest --replicas=6 # 创建应用并指定副本数量,默认副本数量为1
kubectl expose deployment nginx111 --port=80 --type=NodePort # 暴露端口发布应用
kubectl get service # 获取服务状态
二、基础命令
1、create 资源创建
通过文件名或者标准输入创建资源
1)通过文件名创建资源
$ kubectl create -f 文件名
选项:
--record #记录命令至滚动信息,便于查看每次 revision 的变化
2)通过标准输入创建资源
$ kubectl create 资源类型 [资源名]
选项
--help #获取命令帮助
--tcp=集群端口:pod端口 #映射容器内端口至哪个端口
--dry-run #干跑测试
-o yaml/json #将当前资源对象输出至 yaml/json 格式文件中
--image=xxx #指定镜像创建
可创建的对象
对象 | 描述 |
---|---|
job | 使用指定名称创建一个job |
cronjob | 使用指定名称创建一个cronjog |
configmap | 从本地文件、目录或字面值创建一个conێ gmaple |
service | 使用指定的子命令创建一个service |
serviceaccount | 使用指定名称创建一个service account |
role | 使用单个Single role创建一个role |
clusterrole | 创建一个集群角色 |
rolebinding | 为particular Role 或 ClusterRole 创建一个存活角色绑定 |
clusterrolebinding | 为一个集群角色创建一个集群绑角色绑定ClusterRoleBindin |
secret | 使用指定的子命令创建一个secret |
quota | 使用指定名称创建一个quota |
namespace | 使用指定名称创建一个namespace |
deployment | 使用指定名称创建一个deployment |
poddisruptionbudget | 使用指定名称创建一个pod disruption budget |
priorityclass | 使用指定名称创建一个priorityclass |
2、apply 资源创建/更新
通过文件名或者标准输入对资源进行修改/创建
将配置应用于资源(如果资源不在那里,那么它将被创建,可做更新)
1)通过文件名修改/创建资源
$ kubectl apply -f 文件名
选项:
--record #记录命令至滚动信息,便于查看每次 revision 的变化
2)通过标准输入修改/创建资源
3、set 资源更新
在对象上设置特定的功能
格式:kubectl set 子命令 [options]
子命令:
env #更新一个Pod模板的环境变量
image #更新一个Pod模板的镜像
resources #使用容器模板更新对象的资源请求/限制
selector #设置选择器所选择的资源
serviceaccount #升级一个资源对象的ServiceAccount
subject #更新角色绑定/群集中的用户、组或服务帐户
例如:
#更新资源所使用镜像
$ set image 资源类型 资源名 容器名=容器所使用的新镜像
--record #记录命令,便于查看每次使用 revision 的变化。查看命令:rollout history
例子:kubectl set image deployment nginx-deployment nginx=nginx:1.9.1
kubectl set selector是用来设置资源的selector(选择器)。如果在调用"set selecto"命令之前已经存在选择器,则新创建的选择器将覆盖原来的选择器。
4、get 资源查看
显示一个或多个资源
格式:kubectl get 资源类型 【资源名】 【选项】
events #查看集群中的所有日志信息
-o wide # 显示资源详细信息,包括节点、地址...
-o yaml/json #将当前资源对象输出至 yaml/json 格式文件
--show-labels #查看当前资源对象的标签
-l key=value #基于标签进行筛选查找
-A #查看所有名称空间下的POD
-n 名字空间 #查看该名字下的资源集合
--show-labels #查看某一资源的标签
-all-namespaces #查看所有名字空间下的资源
$ kubectl get all # 查看所有的资源信息
kubectl get ns # 获取名称空间
kubectl get cs # 获取集群健康状态(组件的状态)
kubectl get pods --all-namespaces # 查看所有名称空间所有的pod
kubectl get pods -A # -A是--all-namespaces的简写哇
显示集群资源状态
kubectl get cs
5、explain 资源字段描述
文档参考资料
#查看对象推荐使用的api以及资源对象的描述
$ kubectl explain 字段
例如:
$ kubectl explain pod.spec #查看pod类别一级字段帮助文档
$ kubectl explain pod.spec.containers #查看pod类别二级字段帮助文档
6、edit 资源编辑
使用默认编辑器编辑一个资源
命令运行后,会通过YAML格式展示该队形的文本格式定义,用户可以对代码进行编辑和保存,从而完成对在线资源的直接修改。
格式:kubectl edit (RESOURCE/NAME | -f FILENAME) [options]
kubectl edit 资源类型 资源名 选项
例如:
# 编辑Deployment nginx的一些信息
$ kubectl edit deployment nginx
# 编辑service类型的nginx的一些信息
$ kubectl edit service/nginx
7、delete 资源删除
通过文件名、标准输入、源名称或标签选择器来删除资源。
格式:$ kubectl delete 选项
-f 文件名 # 根据yaml文件删除对应的资源,但是yaml文件并不会被删除,这样更加高效
kubectl delete 资源类型 【资源名】
【资源名】 #删除该资源
--all #删除该资源类型下所有资源
kubectl delete namespace ns_name # 删除一个名称空间
kubectl delete namespace/ns_name1 namespace/ns_name2 # 删除多个名称空间
kubectl delete ns/ns_name1 ns/ns_name2 # 删除多个名称空间
pod的强制删除
kubectl delete pod <pod-name> --grace-period=0 --force
#--grace-period=0 参数表示立即删除 Pod,而不是等待一段时间。
#--force 参数表示强制删除 Pod,即使 Pod 处于未知状态。
8、run
kubectl run – 在集群中使用指定镜像启动容器。
# 命令式对象管理:
kubectl run nginx111 --image=nginx:latest --port=80 # 运行一个pod
# 通过配置文件创建应用
# 命令式对象配置: 不能重复使用,该命令重复使用会报错
kubectl create -f nginx-pod.yml
# 声明式对象配置: 用于创建和更新资源,命令可以重复使用,支持目录操作--推荐
kubectl apply -f nginx111.yml
三、部署命令
1、rullout–滚动更新
可以进行滚动更新管理的资源包括:deployments、daemonsets、statefulsets
格式:kubectl rullout 子命令 资源类型 资源名 【选项】
子命令
history #查看滚动历史视图
pause #暂停滚动更新
restart #重新设置指定资源
resume #取消暂停的滚动更新
status #查看滚动更新的状态
undo # 回滚到上一个版本(撤销上一次滚动)
rollout undo #回滚至上一个版本,回滚成功会返回为0的返回码
rollout status #打印当前滚动的状态信息
rollout history #查看滚动更新的历史版本,只能查看加了--record的更新命令,不加就会拷贝上条记录
rollout pause #暂停滚动更新,用于实现金丝雀部署
rollout resume #恢复滚动更新,用于实现金丝雀部署
选项
--to-revision=2 可以使用 --revision参数指定某个历史版本
金丝雀部署:更新的同时暂停更新,应用场景:测试新的pod,没问题继续更新,有问题直接回滚
滚动更新注意事项
只要 Deployment 的 rollout 被触发就会创建一个 revision。也就是说当且仅当 Deployment 的 Pod template(如 .spec.template )被更改,例如更新template 中的 label和容器镜像时,就会创建出一个新的 revision
其他的更新,比如扩容 Deployment 不会创建 revision——因此我们可以很方便的手动或者自动扩容。这意味着当您回退到历史 revision 时,只有 Deployment 中的 Podtemplate 部分才会回退。
2、rolling-update
kubectl – 对指定的replication controller执行滚动升级。
3、scale
扩容、缩容pod的数量
格式:kubectl scale 资源类型 资源名 --replicas n #n为pod数量
# 如果名为 mysql 控制器 的部署的当前大小为 2,则将 mysql 缩放到 3。
$ kubectl scale --current-replicas=2 --replicas=3 deployment/mysql
#扩展多个RC控制器对象
$ kubectl scale --replicas=5 rc/foo rc/bar rc/ba
4、autoscale
自动扩容收缩。
前提:需要能够获得pod的资源使用情况
格式:kubectl autoscale 资源类型 资源名 --min=n --max=m --cpu-percent=80
--min=n #最少pod数量
--max=m #最多pod数量
--cpu-percent=80 #变化条件为pod的cpu占用率达到80.达到80扩容,最多不超过m,小于80时缩容,最少不低于n
四、集群管理命令
1、top
前提:可以获取资源情况(跟pod命令一致),需要安装资源监控组件
#查看资源情况
kubectl top pod
五、故障诊断和调试命令
1、describe
显示特定资源或资源组的详细信息
# 查看当前的资源对象详细描述 (查看events下内容,可排查资源创建过程中错误)
$ kubectl describe 资源类别 资源名
例子:kubectl describe pod pod-demo
2、logs与events
# 查看 pod 日志信息 (用来排查因镜像问题出现的错误)
$ kubectl logs podName -c cName
#查看集群中的所有日志信息
$ kubectl get events
3、attach
4、exec
# 容器执行命令
$ kubectl exec -it podName -c cName -- command
5、cp
用于pod和外部的文件交换,将文件和目录复制到容器或从容器复制到容器
kubectl cp <file-spec-src> <file-spec-dest> [options]
-c, --container='':容器名称。如果省略,将选择荚中的第一个容器
--no-preserve=false:复制的文件/目录的所有权和权限将不会保留在容器中
#将“/tmp/foo_dir”本地目录拷贝到默认命名空间的远端pod的“/tmp/bar_dir”目录下
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir
#从远程pod拷贝/tmp/foo到本地/tmp/bar
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar
#复制文件到pod的指定目录,也可从容器中复制文件到外部
kubectl cp fileName podName:/fileName
#将“/tmp/foo_dir”本地目录拷贝到默认命名空间的远端pod的“/tmp/bar_dir”目录下
kubectl cp /tmp/foo_dir <some-pod>:/tmp/bar_dir
#复制/tmp/foo本地文件到/tmp/bar在远程pod在一个特定的容器
kubectl cp /tmp/foo <some-pod>:/tmp/bar -c <specific-container>
#将/tmp/foo文件拷贝到远程pod中的/tmp/bar目录下
kubectl cp /tmp/foo <some-namespace>/<some-pod>:/tmp/bar
#从远程pod拷贝/tmp/foo到本地/tmp/bar
kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar
#复制文件到pod的指定目录,也可从容器中复制文件到外部
kubectl cp fileName podName:/fileName
6、auth
六、设置命令
1、label
1)标签的查看
格式:
$ kubectl get 资源类型 【选项】 【资源名】 --show-labels # 获取标签信息
-l key=value #查看指定标签的资源
-l key in (value1,value2) #根据集合关系筛选符合的资源
-l KEY not in (VALUE1,VALUE2...) #根据集合关系筛选以外的资源
# 另外一种绝对性查询,key=value
等值关系: =、==、!=
$ kubectl get pods -l app[=|==|!=]myapp --show-labels
例如:# 根据集合关系筛选
$ kubectl get pods -l "version in (1.8,2.0)" -n default --show-labels
NAME READY STATUS RESTARTS AGE LABELS
nginx111-5774488586-mv68r 1/1 Running 0 7h57m pod-template-hash=5774488586,version=2.0
nginx333
2)标签的设置
yanl文件中label的标签值必须加引号
格式:
$ kubectl label 资源类型 资源名 key=value 【选项】
--overwrite #更新已存在的标签值
# 设置标签,如果标签不存在则新增标签
$ kubectl label 资源类型 资源名 version=1.0
# 更新标签,需要要是用--overwrite关键字
$ kubectl label 资源类型 资源名 version=2.0 --overwrite
# 删除标签
$ kubectl label 资源类型 资源名 key-
2、taint-污点
只能应用于节点
污点格式:key=value:effect
key:不能为空
value:可以为空
effect:effect值有三个。Noschedule、prefernoschedule、noexecute
NoSchedule :表示 k8s 将不会将 Pod 调度到具有该污点 的 Node 上
PreferNoSchedule :表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上
NoExecute :表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去
相关命令
# 设置污点
$ kubectl taint node 节点名 key1=value:effect
# 节点说明中,查找 Taints 字段
$ kubectl describe node 节点名
# 去除污点
$ kubectl taint node 节点名 key=value:NoSchedule- #加个 - 号
七、高级命令
1、patch
在容器运行时,直接对容器进行修改的方式,就是patch命令。
使用补丁(JSON 合并补丁或 JSON 补丁) 更新资源字段。
格式: kubectl patch (-f 文件名 | TYPE NAME) -p PATCH [options]
kubectl patch (-f 文件名 | 资源类型 资源名 ) -p PATCH [options]
例如:
$ kubectl patch deployment my-nginx --patch '{"spec": {"template": {"metadata": {"annotations": {"version/config": "20190411"}}}}}'
2、watch
$ watch -n 1kubectl get pod #一秒更新一次pod命令
3、导出配置文件
#导出proxy
kubectl get ds -n kube-system -l k8s-app=kube-proxy -o yaml>kube-proxy-
ds.yaml
#导出kube-dns
kubectl get deployment -n kube-system -l k8s-app=kube-dns -o yaml >kube-dns-
dp.yaml
kubectl get services -n kube-system -l k8s-app=kube-dns -o yaml >kube-dns-
services.yaml
#导出所有 configmap
kubectl get configmap -n kube-system -o wide -o yaml > configmap.yaml
八、其他命令
1、help
$ kubectl 【子命令】--help #查看命令或子命令的帮助文档
2、apiversion
$ kubectl apiversion # 查看kubernetes系统中可用的apiVersion`
3、namespace
# Namespace
# 命令行操作namespace
kubectl get ns # 获取名称空间信息
kubectl get ns/default # 获取指定名称空间信息
kubectl describe ns/default # 描述名称空间信息
kubectl create ns devlop # 创建名称空间
kubectl delete ns devlop # 删除名称空间
# nsc.yml # 使用文件创建和删除名称空间
apiVersion: v1 # api版本
kind: Namespace # 资源类型是ns
metadata: # 元数据
name: devp2022 # 名称空间命名
# 创建名称空间
kubectl create -f nsc.yml / kubectl apply -f nsc.yml
# 删除名称空间
kubectl delete -f nsc.yml
九、etcd命令
1、检查网络集群健康状态
etcdctl cluster-health #检查网络集群健康状态
etcdctl --endpoints=https://192.168.71.221:2379 cluster-health
#带有安全认证检查网络集群健康状态
etcdctl member list
etcdctl set /k8s/network/config ‘{ “Network”: “10.1.0.0/16” }’
etcdctl get /k8s/network/config
2、etcd数据备份
#命令行备份(Backup)
- 通过etcdctl backup命令可以对etcd数据目录进行完整备份。
- 命令:
etcdctl backup --data-dir etcd数据目录 --backup-dir 备份目标目录
etcdctl backup --data-dir /var/lib/etcd --backup-dir /var/backups/etcd/
# 进行数据快照保存
etcdctl snapshot save snapshot.db # 进行数据快照保存
etcdctl snapshot restore snapshot-2020-01-01.db --data-dir /var/lib/etcd # 进行数据快照恢复
十、资源相关
1、service
# 命令行暴露创建service,ClusterIP只能集群内部访问
$ kubectl create svc 资源名 ClusterIP --port=80 --target-port=80
--port=80集群vip(用于外部访问)
-target-port:容器内部端口
#模拟创建service
kubectl create service clusterip ngx-dep --tcp 80:80 --dry-run -o yaml
2、pod
# 通过命令运行pod
# 命令格式: kubectl run (pod控制器名称)[参数]
# --image 指定pod的镜像
# --port 指定端口
# --namespace 指定名称空间
kubectl run nginx2023 --image=nginx:latest --port=80
3、configmap
#创建方式:
1、基于文件创建,将一个文件创建为一个configmap
$ kubectl create configmap 资源名 --from-file=文件路径
#--from-file 这个参数可以使用多次,你可以使用两次分别指定多个配置文件,效果就跟指定整个目录是一样的
2、基于目录创建
$ kubectl create configmap 资源名 --from-file=目录路径
#--from-file 指定在目录下的所有文件都会被用在 ConfigMap 里面创建一个键值对(etcd 是一个键值对数据库),键的名字就是文件名,值就是文件的内容
3、基于字面值创建
格式:$ kubectl create configmap 资源名 --from-literal=key=value
#利用 --from-literal 参数传递配置信息 --from-literal 该命令可以指定多次
$ kubectl create configmap literal-config --from-literal=name=dave --from-literal=password=pass
4、secret
使用 Kuberctl 命令创建 docker 仓库认证的 secret
格式:$ kubectl create secret docker-registry 资源名 --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
#例如
$ kubectl create secret docker-registry myregistrykey --docker-server=harbor.zcs.com --docker-username=admin --docker-password=Harbor12345 --docker-email=wangyanglinux@163.com
使用:在创建 Pod 的时候,通过 imagePullSecrets
来引用刚创建的 myregistrykey
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: hub.hongfu.com/wangyang/myapp:v1
imagePullSecrets: #认证方式是Secret
- name: myregistrykey #基于myregistrykey这个Secret
十一、调度配置
kubectl cordon k8s-node # 标记 my-node 不可调度 新的pod不会调度该节点上
kubectl drain k8s-node # 清空 my-node 以待维护 将运行在node1运行的pod平滑的赶到其他节点上;
kubectl uncordon k8s-node # 标记 my-node 可调度 恢复调度
十二、journalctl命令
#查看所有日志(默认情况下 ,只保存本次启动的日志)
journalctl
#查看内核日志(不显示应用日志)
journalctl -k
#立即跳到日志页面结尾处
journalctl -e
#查看系统本次启动的日志
journalctl -b
journalctl -b -0
#查看上一次启动的日志(需更改设置)
journalctl -b -1
#查看指定时间的日志
journalctl --since="2017-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl --since "2017-01-10" --until "2017-01-11 03:00"
journalctl --since 09:00 --until "1 hour ago"
#显示尾部的最新10行日志
journalctl -n
#显示尾部指定行数的日志
journalctl -n 20
#实时滚动显示最新日志
journalctl -f
#查看指定服务的日志
journalctl /usr/lib/systemd/systemd
#查看指定进程的日志
journalctl _PID=1
#查看某个路径的脚本的日志
journalctl /usr/bin/bash
#查看指定用户的日志
journalctl _UID=33 --since today
#查看某个 Unit 的日志
journalctl -u nginx.service
journalctl -u nginx.service --since today
#实时滚动显示某个 Unit 的最新日志
journalctl -u nginx.service -f
#合并显示多个 Unit 的日志
journalctl -u nginx.service -u php-fpm.service --since today
#查看指定优先级(及其以上级别)的日志,共有8级
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
journalctl -p err -b
#日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager
#以 JSON 格式(单行)输出
journalctl -b -u nginx.service -o json
#以 JSON 格式(多行)输出,可读性更好
journalctl -b -u nginx.serviceqq -o json-pretty
#显示日志占据的硬盘空间
journalctl --disk-usage
#指定日志文件占据的最大空间
journalctl --vacuum-size=1G
#指定日志文件保存多久
journalctl --vacuum-time=1years