文章目录
- 简介
- 一.命令帮助翻译
- 1.1.基本命令(初学者):
- 1.2.基本命令(中级):
- 1.3.部署命令:
- 1.4.群集管理命令:
- 1.5.疑难解答和调试命令:
- 1.6.高级命令:
- 1.7.设置命令:
- 1.8.插件提供的子命令:
- 1.9.其他命令:
- 1.10.用法
- 二.资源列表
- 2.1.资源列表及简称
- 2.2.配置kubectl自动补全
- 三.命令操作实践
- 3.1.创建资源
- 3.2.查看资源
- 3.3.编辑资源配置文件
- 3.4.删除资源
- 3.5.标签操作
- 3.6.回滚操作
- 3.7.set修改资源
- 3.8.扩缩容
- 3.9.debug日志分析
- 3.10.查看内存及cpu使用率
- 3.11.集群及节点操作
简介
该文章详细对kubect命令行的参数进行讲解,并将api-resource的信息整理成列表,方便查看,同时通过一系列的实践操作的命令来进行举例,便于更深刻的了解和掌握该命令的用法。
一.命令帮助翻译
kubectl -h
查看帮助信息:kubectl控制Kubernetes集群管理器。更多信息,请访问:https://kubernetes.io/docs/reference/kubectl/
1.1.基本命令(初学者):
- create: 从文件或stdin创建资源
- expose: 获取复制控制器、服务、部署或pod,并将其作为新的Kubernetes服务公开
- run: 在群集上运行特定映像
- set: 设置对象的特定功能
1.2.基本命令(中级):
- explain: 获取资源的文档
- get: 显示一个或多个资源
- edit: 编辑服务器上的资源
- delete: 按文件名、stdin、资源和名称或按资源和标签选择器删除资源
1.3.部署命令:
- rollout: 管理资源的滚动发布
- scale: 为部署、复制副本集或复制控制器设置新的大小
- autoscale: 自动缩放部署、副本集、有状态集或复制控制器
1.4.群集管理命令:
- certificate: 修改证书资源
- cluster-info: 显示集群信息
- top: 显示资源(CPU/内存)使用情况
- cordon: 将节点标记为不可调度
- uncordon: 将节点标记为可调度
- drain: 排水节点为维护做准备
- taint: 更新一个或多个节点上的污点
1.5.疑难解答和调试命令:
- description显示特定资源或资源组的详细信息
- logs打印pod中容器的日志
- attach: 附加到正在运行的容器
- exec: 在容器中执行命令
- port-forward: 将一个或多个本地端口转发到一个pod
- proxy: 运行到Kubernetes API服务器的代理
- cp: 将文件和目录复制到容器和从容器复制文件和目录
- auth: 检查授权
- debug: 创建调试会话以排除工作负载和节点的故障
- events: 列出事件
1.6.高级命令:
- diff: 将实时版本与潜在的应用版本进行区分
- apply: 按文件名或stdin将配置应用于资源
- patch: 更新资源的字段
- replace: 用文件名或stdin替换资源
- wait: 实验:在一个或多个资源上等待特定条件
- kustomize: 从目录或URL构建kustomization目标
1.7.设置命令:
- label: 更新资源上的标签
- annotate: 更新资源上的注释
- completion: 为指定的shell(bash、zsh、fish或powershell)输出shell完成代码
1.8.插件提供的子命令:
- 1.28.5 命令1.28.5是用户安装的插件
1.9.其他命令:
- api-resources: 在服务器上打印支持的api资源
- api-versions: 以“组/版本”的形式打印服务器上支持的api版本
- config: 修改kubeconfig文件
- plugin: 提供与插件交互的实用程序
- version: 打印客户端和服务器的版本信息
1.10.用法
kubectl [flags] [options]
有关给定命令的详细信息,请使用“kubectl<command>–help”。
使用“kubectl选项”作为全局命令行选项列表(适用于所有命令)。
二.资源列表
2.1.资源列表及简称
2.2.配置kubectl自动补全
echo "source <(kubectl completion bash)" >> /root/.bashrc
三.命令操作实践
3.1.创建资源
dd
-
创建命名空间:
kubectl create ns test-ns
-
创建deployment:
kubectl create deployment nginx --image=nginx:1.14 --port=80 --replicas=3
-
创建service:
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort
-
创建pod:
kubectl run nginx --image=nginx --image-pull-policy=IfNotPresent
-
创建cronjob: 创建一个cronjob,并且每分钟执行一次命令date:
kubectl create cronjob my-job --image=busybox --schedule="*/1 * * * *" -- date
-
创建serviceAccount:
kubectl create serviceaccount my-service-account
-
创建configmap: 将某个目录创建configmap,
kubectl create configmap my-conf --from-file=path/dir
,按照key=value的形式创建configmap:kubectl create configmap my-conf --from-literal=key1=value1 --from-literal=key2=value2
-
创建集群角色绑定:
kubectl create clusterrolebinding cluster-admin --clusterrole=cluster-admin --user=user1 --user=user2 --group=group1
-
创建集群角色:
创建一个名为 “pod-reader” 的 ClusterRole,允许用户在 Pod 上执行 “get”、“watch” 和 “list” 操作:
kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods
创建一个名为 “pod-reader” 的 ClusterRole,并指定 ResourceName:
kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods --resource-name=readablepod --resource-name=anotherpod
在指定的 API Group 中创建一个名为 “foo” 的 ClusterRole
kubectl create clusterrole foo --verb=get,list,watch --resource=rs.extensions
创建一个名为 “foo” 的 ClusterRole,并指定 SubResource
kubectl create clusterrole foo --verb=get,list,watch --resource=pods,pods/status
使用指定的 NonResourceURL 创建一个名为 “foo” 的 ClusterRole
kubectl create clusterrole "foo" --verb=get --non-resource-url=/logs/*
- 创建角色:
创建一个名为 “pod-reader” 的 Role,允许用户在 Pod 上执行 “get”、“watch” 和 “list” 操作:
kubectl create role pod-reader --verb=get,list,watch --resource=pods
创建一个名为 “pod-reader” 的 Role,并指定 ResourceName:
kubectl create role pod-reader --verb=get,list,watch --resource=pods --resource-name=readablepod --resource-name=anotherpod
- 创建角色绑定:
为名为 admin 的 Role 创建一个名为 “admin” 的 RoleBinding,并将其绑定到用户 user1、user2 和 group1:
kubectl create rolebinding admin --clusterrole=admin --user=user1 --user=user2 --group=group1
- 创建ingress:
创建一个simple的ingres,指定规则foo.com/bar 的后端是svc1:8080,并绑定证书my-cert
kubectl create ingress simple --rule="foo.com/bar=svc1:8080,tls=my-cert"
创建一个ingress并配置注解: ingress.annotation1 和 ingress.annotations2
kubectl create ingress annotated --class=default --rule="foo.com/bar=svc:port" \
--annotation ingress.annotation1=foo \
--annotation ingress.annotation2=bla
创建一个ingress,指定同一个域名,多个路径
kubectl create ingress multipath --class=default \
--rule="foo.com/=svc:port" \
--rule="foo.com/admin/=svcadmin:portadmin"
创建一个ingress,指定多个域名和多个路径
kubectl create ingress ingress1 --class=default \
--rule="foo.com/path*=svc:8080" \
--rule="bar.com/admin*=svc2:http"
创建ingress,启用证书,并指定跟路径访问svc:8080
kubectl create ingress ingsecret --class=default \
--rule="foo.com/*=svc:8080,tls=secret1"
创建一个ingress,用默认的后端
kubectl create ingress ingdefault --class=default \
--default-backend=defaultsvc:http \
--rule="foo.com/*=svc:8080,tls=secret1"
- 通过yaml文件创建:
kubectl apply -f xxx.yaml
为deployment的nginx创建service,并通过Service的80端口转发至容器的80端口上,Service的名称为nginx-service,类型为NodePort
kubectl expose deployment nginx --port=80 --target-port=80 --name=nginx-service --type=NodePort
3.2.查看资源
获取列表用法:
- 获取节点列表:
kubectl get node
,详细列表:kubectl get node -o wide
,显示标签可以加上:kubectl get node -o wide --show-labels
- 获取namespace列表:
kubectl get ns
- 获取所有deploy列表:
kubectl get deploy -A
,详细列表:kubectl get deploy -A -o wide
,指定命名空间获取:get deploy -n test-ns
- 获取所有statefulset列表:
kubectl get sts -A
,详细列表:kubectl get sts -A -o wide
,指定命名空间获取:get sts -n test-ns
- 获取所有daemonset列表:
kubectl get ds -A
,详细列表:kubectl get ds -A -o wide
- 获取所有service列表:
kubectl get svc -A
,详细列表:kubectl get svc -A -o wide
,指定命名空间获取:get svc -n test-ns
- 获取所有configmap列表:
kubectl get cm -A
,详细列表:kubectl get cm -A -o wide
,指定命名空间获取:get cm -n test-ns
- 获取所有pod列表:
kubectl get pod -A
,详细列表:kubectl get pod -A -o wide
,指定命名空间获取:get pod -n test-ns
- 获取所有secret列表:
kubectl get secret -A
,详细列表:kubectl get secret -A -o wide
,指定命名空间获取:get secret -n test-ns
获取某个资源用法:
- 获取命名为test-app的deployment的:
kubectl get deploy test-app -n test-ns -o yaml
,如果不指定命名空间-n test-ns,则默认读取default命名空间下的资源。-o yaml则是将资源的信息以yaml文件格式显示。 - 获取命名为test-pod的pod的:
kubectl get pod test-pod -n test-ns -o yaml
,如果不指定命名空间-n test-ns,则默认读取default命名空间下的资源。-o yaml则是将资源的信息以yaml文件格式显示。 - svc,pod,configmap,statefulset,secret等资源均可以通过以上命令以yaml文件格式查看,只需要变更过资源类型和名称。
高级用法:
-
通过标签过滤
kubectl get deploy -n test-ns -l app=test-app
,操作符: = 或者 != -
只查看特定的某项值
kubectl get -o template pod/ops-tools --template={{.status.phase}} -n zx-app
-
自定义列出资源信息
kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image
-
同时列出所有命名空间中的多个资源信息
kubectl get deploy,svc,pod,cm -A
-
通过类型或名称列出一个或者多个资源
kubectl get rc/web service/frontend pods/web-pod-13je7
-
List the ‘status’ subresource for a single pod
kubectl get pod web-pod-13je7 --subresource status
3.3.编辑资源配置文件
edit 可以编辑多种资源,其他资源的yaml配置编辑,可以参考下边的命令,只需要修改资源类型和资源的名称,以及命名空间。
- 编辑 deployment 的yaml配置:
kubectl edit deploy test-app -n test-ns
- 编辑 cronjob 的yaml配置:
kubectl edit cronjob test-job -n test-ns
- 编辑 configmap 的yaml配置:
kubectl edit cm test-cm -n test-ns
3.4.删除资源
删除名为"test-app"的pod 和名为"test-svc"的 service
kubectl delete pod,service test-app test-svc
删除具有 name=myLabel 标签的 pod 和 serivce
kubectl delete pods,services -l name=myLabel
删除具有 name=myLabel 标签的 pod 和 service,包括尚未初始化的
kubectl delete pods,services -l name=myLabel --include-uninitialized
删除 test-ns 命名空间下的所有 pod 和 deployment
kubectl -n test-ns delete pod,deploy --all
3.5.标签操作
节点、资源deployment、service、pod等资源均可以按照如下命令进行标签操作
- 增加标签:
kubectl label nodes node-1 name=value
,给节点增加一个标签name=value - 查询标签:
kubectl get node -l name=value
,通过指定标签name=value来查询对应的节点 - 删除标签:
kubectl label nodes node-1 name-
,在标签名称后边加一个减号即可删除标签 - 修改标签:
kubectl label nodes node-1 name=value2 --overwrite
,加上–overwrite 即可修改标签的值
3.6.回滚操作
执行回滚deployment nginx到上一个版本
kubectl rollout undo deploy/nginx -n test-ns
执行回滚deployment nginx到指定版本
kubectl rollout undo deploy/nginx --to-revision=1 -n test-ns
查看回滚状态
kubectl rollout status deploy/nginx -n test-ns
查看指定资源的历史
kubectl rollout history deploy/nginx -n test-ns
暂停滚动更新
kubectl rollout pause deploy nginx -n test-ns
恢复滚动更新
kubectl rollout resume deploy nginx -n test-ns
3.7.set修改资源
参数解释
- env: 更新pod模板上的环境变量
- image: 更新pod的镜像
- resources: 更新pod对象的cpu和内存资源请求/限制
- selector: 在资源上设置选择器
- serviceaccount: 更新资源的服务帐户
- subject: 更新角色绑定或群集角色绑定中的用户、组或服务帐户
限制内存和cpu
-
将deployment的nginx的pod容器 nginx 的 cpu限制为200毫核,将内存设置为512M
kubectl set resources deployment nginx -c=nginx --limits=cpu=200m,memory=512Mi
-
设置所deployment nginx的 Requests和Limits
kubectl set resources deployment nginx --limits=cpu=200m,memory=512Mi --requests=cpu=100m,memory=256Mi
-
删除所deployment nginx中容器的资源限制
kubectl set resources deployment nginx --limits=cpu=0,memory=0 --requests=cpu=0,memory=0
修改镜像:
- 将deployment nginx更新为1.15版本
kubectl set image deployment/nginx nginx=nginx:1.15
更新集群绑定:
- 更新RoleBinding的user1,user2和group1
kubectl set subject rolebinding admin --user=user1 --user=user2 --group=group1
-更新一个ClusterRoleBinding 的 serviceaccount1
kubectl set subject clusterrolebinding admin --serviceaccount=namespace:serviceaccount1
3.8.扩缩容
将deployment nginx的副本数更改成3个
kubectl scale --replicas=3 deploy/nginx -n test-ns
执行sacle的前提条件是必须–current-replicas=2时才会生效
kubectl scale --current-replicas=2 --replicas=3 deployment/nginx
不指定cpu使用率,采用默认的扩缩容策略,自动扩缩容deployment nginx 的pod在2-10之间。
kubectl autoscale deployment nginx --min=2 --max=10
当cpu使用率80%时,replicationcontrollers foo 的pod数量在1-5之间调整。
kubectl autoscale rc foo --max=5 --cpu-percent=80
将命名空间test-ns下的deployment test-app1,test-app2的副本数更改成5个
kubectl scale --replicas=5 deploy/test-app1 deploy/test-app2 -n test-ns
3.9.debug日志分析
describe,logs,explain,exec,cp
- 在容器内执行命令"cat /etc/os-release":
kubectl exec test-pod -n test-ns -- cat /etc/os-release
- 查看特定资源的描述信息:
kubectl describe pods/test-pod -n test-ns
,kubectl describe deploy/test-pod -n test-ns
,其他资源类型也可以参照此命令 - 查看pod的日志:
kubectl logs test-pod -n test-ns
,查看最近20行:kubectl logs test-pod -n test-ns --tail=20
,滚动查看:kubectl logs test-pod -n test-ns -f
- 拷贝文件到容器的root目录下:
kubectl cp test.txt test-pod:/root/ -n test-ns
,从容器拷贝文件到本地:kubectl cp test-pod:/root/test.txt . -n test-ns
,.表示当前目录,如果是要重命名文件则将点改成test1.txt - 描述各种资源的结构,例如:
kubectl explain pod
,相当于对各种资源进行讲解的帮助文档
3.10.查看内存及cpu使用率
查看pod和节点的内存和cpu资源,需要k8s集群安装metric-server才能查看。
- 查看节点cpu和内存:
kubectl top node
- 查看pod的cpu和内存:
kubectl top pod -n test-ns
,需要制定命名空间查看,否则默认查看default空间
3.11.集群及节点操作
- 查看集群信息:
kubectl cluster-info
- 查看master状态:
kubectl get cs
- 将节点标记为不可调度:
kubectl cordon node-1
- 将节点标记为可调度:
kubectl uncordon node-1
- 排水节点为维护做准备:
kubectl drain node-1
- 搭建k8s集群时添加worker节点:
kubectl certificate approve node-csr-xxx_xxxx
,节点的证书名称可以通过:kubectl get csr
获取 - 为gpu资源的节点创建一个gpu污点:
kubectl taint nodes k8s-work1 hardware-type=GPU:NoSchedule
然后创建一个需要gpu资源的pod,这样这个pod就会被调度到gpu的节点上,其他的pod不会调度到此节点
apiVersion: v1
kind: Pod
metadata:
name: gpu-pod
spec:
containers:
- name: nginx
image: nginx
tolerations:
- key: hardware-type
operator: Equal
value: GPU
effect: NoSchedule