Kubernetes: Kuberctl
- TAGS: Kubernetes
摘要:本文介绍k8s核心组件-kubectl
核心组件-kubectl
简述
你可以使用 Kubectl 命令行工具管理 Kubernetes 集群。 kubectl
在
$HOME/.kube
目录中查找一个名为 config
的配置文件。 你可以通过设置
KUBECONFIG 环境变量或设置
--kubeconfig
参数来指定其它
kubeconfig
文件。
本文概述了 kubectl
语法和命令操作描述,并提供了常见的示例。
有关每个命令的详细信息,包括所有受支持的参数和子命令, 请参阅
kubectl
参考文档。
有关安装说明,请参见安装
kubectl 。
kubectl 提供了大量的子命令,方便管理 Kubernetes 集群中的各种功能。这里不再罗列各种子命令的格式,而是介绍下如何查询命令的帮助
kubectl -h 查看子命令列表 kubectl options 查看全局选项 kubectl <command> --help 查看子命令的帮助 kubectl [command] [PARAMS] -o=<format> 设置输出格式(如 json、yaml、jsonpath 等) kubectl explain <type>.<fieldName>[.<fieldName>] 查看资源的定义
常用命令
参考:https://kubernetes.io/docs/reference/kubectl/
命令集 | 命令 | 用途 |
---|---|---|
基础命令1 | explain(推荐) | 命令说明 |
增删改查:create/run/delete/edit/get | ||
set | 设置对象状态 | |
expose | 为deployment,pod创建Service | |
Deploy命令 | rollout | Deployment,Daemonset的升级过程管理(查看状态、操作历史、暂停升级、恢复升级、回滚等) |
rolling-update | 客户端滚动升级,仅跟RelicationController | |
scale | 修改Deployment, ReplicaSet, RelicationController, Job的实例数 | |
autoscale | 为Deploy, RS, RC配置自动伸缩规则(依赖HPA) | |
集群管理命令 | 集群状态:cluster-info/top | 集群信息/资源占用率 |
node节点管理: cordon | 警戒线,标记node不被调度 | |
node节点管理:uncordon | 取消警戒标记为cordon的node | |
node节点管理:drain | 驱逐node上的pod,用户node下线等场景 | |
node节点管理:taint | 给node标记污点,实现反亲pod与node反亲和性 | |
certificate | 证书管理 | |
api-resources/api-versions | api资源 | |
config | 客户端kube-config配置 | |
问题排查 | describe | 查看资源详情 |
logs | 查看pod内容的日志 | |
attach | Attach到pod内的一个容器 | |
exec | 在指定容器内执行命令 | |
port-forward | 为pod创建本地端口映射 | |
proxy | 为k8s API server创建代理 | |
cp | 容器内外/容器间文件拷贝 | |
高级命令 | apply(推荐) | 从文件或stdin创建/更新资源。支持文件修改和动态生效,支持回滚,可替代create |
patch | 使用strategic merge patch语法更新对象的某些字段 | |
replace | 从文件或stdin更新资源 | |
convert | 在不同API版本之间转换对象定义 | |
配置命令 | 标签管理:Label | 给node标记label,实现亲pod与node亲和性 |
annotate | 给资源设置annotation | |
completion(推荐) | 获取shell自动补全脚本(支持bash和zsh) | |
其它命令 | help | 帮助 |
version | 查看客户端和Server端k8s版本 |
实用技巧
kubectl命令太多太长记不住?
#查看资源缩写 kubectl api-resources #配置kubectl自动补全 source <(kubectl completion bash)
kubectl 写yaml太累,找样例麻烦?
# 用run命令生产+ kubectl run --image=nginx my-deploy -o yaml --dry-run > my-deploy.yaml # 用get命令导出 kubectl get statefulset/foo -o=yaml --export > new.yaml # pod亲和性下面字段的拼写忘记了 kubectl explain pod.spec.affinity.podAffinity
Kubectl 自动补全
BASH
yum install -y bash-completion source <(kubectl completion bash) # 在 bash 中设置当前 shell 的自动补全,要先安装 bash-completion 包。 echo "source <(kubectl completion bash)" >> ~/.bashrc # 在您的 bash shell 中永久的添加自动补全
您还可以为 kubectl
使用一个速记别名,该别名也可以与 completion
一起使用:
alias k=kubectl complete -F __start_kubectl k
ZSH
source <(kubectl completion zsh) # 在 zsh 中设置当前 shell 的自动补全 echo "[[ $commands[kubectl] ]] && source <(kubectl completion zsh)" >> ~/.zshrc # 在您的 zsh shell 中永久的添加自动补全
Kubectl 上下文和配置
设置 kubectl
与哪个 Kubernetes 集群进行通信并修改配置信息。
查看使用
kubeconfig 跨集群授权访问 文档获取配置文件详细信息。
kubectl config view # 显示合并的 kubeconfig 配置。 # 同时使用多个 kubeconfig 文件并查看合并的配置 KUBECONFIG=~/.kube/config:~/.kube/kubconfig2 kubectl config view # 获取 e2e 用户的密码 kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}' kubectl config view -o jsonpath='{.users[].name}' # 显示第一个用户 kubectl config view -o jsonpath='{.users[*].name}' # 获取用户列表 kubectl config get-contexts # 显示上下文列表 kubectl config current-context # 展示当前所处的上下文 kubectl config use-context my-cluster-name # 设置默认的上下文为 my-cluster-name # 添加新的用户配置到 kubeconf 中,使用 basic auth 进行身份认证 kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword # 在指定上下文中持久性地保存名字空间,供所有后续 kubectl 命令使用 kubectl config set-context --current --namespace=ggckad-s2 alias kcn='kubectl config set-context $(kubectl config current-context) --namespace' # 使用特定的用户名和名字空间设置上下文 kubectl config set-context gce --user=cluster-admin --namespace=foo \ && kubectl config use-context gce kubectl config unset users.foo # 删除用户 foo
Kubectl apply
apply
通过定义 Kubernetes 资源的文件来管理应用。 它通过运行
kubectl apply
在集群中创建和更新资源。 这是在生产中管理 Kubernetes
应用的推荐方法。 参见 Kubectl
文档。
创建对象
Kubernetes 配置可以用 YAML 或 JSON 定义。可以使用的文件扩展名有
.yaml=、
.yml= 和 =.json=。
kubectl apply -f ./my-manifest.yaml # 创建资源 kubectl apply -f ./my1.yaml -f ./my2.yaml # 使用多个文件创建 kubectl apply -f ./dir # 基于目录下的所有清单文件创建资源 kubectl apply -f https://git.io/vPieo # 从 URL 中创建资源 kubectl create deployment nginx --image=nginx # 启动单实例 nginx # 创建一个打印 “Hello World” 的 Job kubectl create job hello --image=busybox -- echo "Hello World" # 创建一个打印 “Hello World” 间隔1分钟的 CronJob kubectl create cronjob hello --image=busybox --schedule="*/1 * * * *" -- echo "Hello World" kubectl explain pods # 获取 pod 清单的文档说明 # 从标准输入创建多个 YAML 对象 cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: busybox-sleep spec: containers: - name: busybox image: busybox args: - sleep - "1000000" --- apiVersion: v1 kind: Pod metadata: name: busybox-sleep-less spec: containers: - name: busybox image: busybox args: - sleep - "1000" EOF # 创建有多个 key 的 Secret cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: password: $(echo -n "s33msi4" | base64 -w0) username: $(echo -n "jane" | base64 -w0) EOF
其它
# 用已生成的资源 kubectl get deploy nginx -oyaml > test.yaml # 不真的创建的 pod kubectl run --image=nginx my-deploy -o yaml --dry-run > my-deploy.yaml kubectl create -f rs.yml --save-config=true # 保存配置,下次再创建RS用apply就可以 kubectl create -f rs.yml --record # --record 可以实现版本管理,下次再创建RS用apply就可以
查看和查找资源
# get 命令的基本输出 kubectl get services # 列出当前命名空间下的所有 services kubectl get pods --all-namespaces # 列出所有命名空间下的全部的 Pods kubectl get pods -o wide # 列出当前命名空间下的全部 Pods,并显示更详细的信息 kubectl get deployment my-dep # 列出某个特定的 Deployment kubectl get pods # 列出当前命名空间下的全部 Pods kubectl get pod my-pod -o yaml # 获取一个 pod 的 YAML # describe 命令的详细输出 kubectl describe nodes my-node kubectl describe pods my-pod # 列出当前名字空间下所有 Services,按名称排序 kubectl get services --sort-by=.metadata.name # 列出 Pods,按重启次数排序 kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' # 列举所有 PV 持久卷,按容量排序 kubectl get pv --sort-by=.spec.capacity.storage # 获取包含 app=cassandra 标签的所有 Pods 的 version 标签 kubectl get pods --selector=app=cassandra -o \ jsonpath='{.items[*].metadata.labels.version}' # 检索带有 “.” 键值,例: 'ca.crt' kubectl get configmap myconfig \ -o jsonpath='{.data.ca\.crt}' # 获取所有工作节点(使用选择器以排除标签名称为 'node-role.kubernetes.io/master' 的结果) kubectl get node --selector='!node-role.kubernetes.io/master' # 获取当前命名空间中正在运行的 Pods kubectl get pods --field-selector=status.phase=Running # 获取全部节点的 ExternalIP 地址 kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' # 列出属于某个特定 RC 的 Pods 的名称 # 在转换对于 jsonpath 过于复杂的场合,"jq" 命令很有用;可以在 https://stedolan.github.io/jq/ 找到它。 sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?} echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name}) # 显示所有 Pods 的标签(或任何其他支持标签的 Kubernetes 对象) kubectl get pods --show-labels # 检查哪些节点处于就绪状态 JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \ && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True" # 不使用外部工具来输出解码后的 Secret kubectl get secret my-secret -o go-template='{{range $k,$v := .data}}{{"### "}}{{$k}}{{"\n"}}{{$v|base64decode}}{{"\n\n"}}{{end}}' # 列出被一个 Pod 使用的全部 Secret kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq # 列举所有 Pods 中初始化容器的容器 ID(containerID) # 可用于在清理已停止的容器时避免删除初始化容器 kubectl get pods --all-namespaces -o jsonpath='{range .items[*].status.initContainerStatuses[*]}{.containerID}{"\n"}{end}' | cut -d/ -f3 # 列出事件(Events),按时间戳排序 kubectl get events --sort-by=.metadata.creationTimestamp # 比较当前的集群状态和假定某清单被应用之后的集群状态 kubectl diff -f ./my-manifest.yaml # 生成一个句点分隔的树,其中包含为节点返回的所有键 # 在复杂的嵌套JSON结构中定位键时非常有用 kubectl get nodes -o json | jq -c 'path(..)|[.[]|tostring]|join(".")' # 生成一个句点分隔的树,其中包含为pod等返回的所有键 kubectl get pods -o json | jq -c 'path(..)|[.[]|tostring]|join(".")' # 假设你的 Pods 有默认的容器和默认的名字空间,并且支持 'env' 命令,可以使用以下脚本为所有 Pods 生成 ENV 变量。 # 该脚本也可用于在所有的 Pods 里运行任何受支持的命令,而不仅仅是 'env'。 for pod in $(kubectl get po --output=jsonpath={.items..metadata.name}); do echo $pod && kubectl exec -it $pod -- env; done
其它
kubectl get <resource> -A # -A 所有名称空间 #查询 Pod IP kubectl get pod <pod-name> -o jsonpath='{.status.podIP}'
有些资源是没有命名空间的,可以使用以下命令查看
kubectl api-resources --namespaced=false # 所有非命名空间作用域的资源
更新资源
kubectl set image deployment/frontend www=image:v2 # 滚动更新 "frontend" Deployment 的 "www" 容器镜像 kubectl rollout history deployment/frontend # 检查 Deployment 的历史记录,包括版本 kubectl rollout undo deployment/frontend # 回滚到上次部署版本 kubectl rollout undo deployment/frontend --to-revision=2 # 回滚到特定部署版本 kubectl rollout status -w deployment/frontend # 监视 "frontend" Deployment 的滚动升级状态直到完成 kubectl rollout restart deployment/frontend # 轮替重启 "frontend" Deployment cat pod.json | kubectl replace -f - # 通过传入到标准输入的 JSON 来替换 Pod # 强制替换,删除后重建资源。会导致服务不可用。 kubectl replace --force -f ./pod.json # 为多副本的 nginx 创建服务,使用 80 端口提供服务,连接到容器的 8000 端口。 kubectl expose rc nginx --port=80 --target-port=8000 # 将某单容器 Pod 的镜像版本(标签)更新到 v4 kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f - kubectl label pods my-pod new-label=awesome # 添加标签 kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq # 添加注解 kubectl autoscale deployment foo --min=2 --max=10 # 对 "foo" Deployment 自动伸缩容
其它
kubernetes修改node的role标签
# 执行kubectl get node命令,可以看到如下结 NAME STATUS ROLES AGE VERSION node1 Ready master,node 57d v1.13.3 node2 Ready master,node 57d v1.13.3 node3 Ready master,node 57d v1.13.3 再执行:kubectl describe node node1 去掉node标签 kubectl label node node1 node-role.kubernetes.io/node- 给node加标签: kubectl label nodes node1 node-role.kubernetes.io/node=
部分更新资源
# 部分更新某节点 kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}' # 更新容器的镜像;spec.containers[*].name 是必须的。因为它是一个合并性质的主键。 kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}' # 更新 hpa kubectl -n taskcenter patch hpa task-center-job -p '{"spec":{"maxReplicas":2,"minReplicas":1}}' # 使用带位置数组的 JSON patch 更新容器的镜像 kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]' # 使用带位置数组的 JSON patch 禁用某 Deployment 的 livenessProbe kubectl patch deployment valid-deployment --type json -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]' # 在带位置数组中添加元素 kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]' # 更新 deployment 绑定节点 # https://kubernetes.io/zh-cn/docs/tasks/manage-kubernetes-objects/update-api-object-kubectl-patch/ spec: template: spec: nodeSelector: type: pfgc-rummy-staging-app-spot kubectl patch deployment rummy-game --type merge --patch-file /tmp/r.yaml
编辑资源
使用你偏爱的编辑器编辑 API 资源
kubectl edit svc/docker-registry # 编辑名为 docker-registry 的服务 KUBE_EDITOR="nano" kubectl edit svc/docker-registry # 使用其他编辑器
对资源进行伸缩
kubectl scale --replicas=3 rs/foo # 将名为 'foo' 的副本集伸缩到 3 副本 kubectl scale --replicas=3 -f foo.yaml # 将在 "foo.yaml" 中的特定资源伸缩到 3 个副本 kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # 如果名为 mysql 的 Deployment 的副本当前是 2,那么将它伸缩到 3 kubectl scale --replicas=5 rc/foo rc/bar rc/baz # 伸缩多个副本控制器
删除资源
kubectl delete -f ./pod.json # 删除在 pod.json 中指定的类型和名称的 Pod kubectl delete pod,service baz foo # 删除名称为 "baz" 和 "foo" 的 Pod 和服务 kubectl delete pods,services -l name=myLabel # 删除包含 name=myLabel 标签的 pods 和服务 kubectl -n my-ns delete pod,svc --all # 删除在 my-ns 名字空间中全部的 Pods 和服务 # 删除所有与 pattern1 或 pattern2 awk 模式匹配的 Pods kubectl get pods -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n mynamespace pod
与运行中的 Pods 进行交互
kubectl logs my-pod # 获取 pod 日志(标准输出) kubectl logs -l name=myLabel # 获取含 name=myLabel 标签的 Pods 的日志(标准输出) kubectl logs my-pod --previous # 获取上个容器实例的 pod 日志(标准输出) kubectl logs my-pod -c my-container # 获取 Pod 容器的日志(标准输出, 多容器场景) kubectl logs -l name=myLabel -c my-container # 获取含 name=myLabel 标签的 Pod 容器日志(标准输出, 多容器场景) kubectl logs my-pod -c my-container --previous # 获取 Pod 中某容器的上个实例的日志(标准输出, 多容器场景) kubectl logs -f my-pod # 流式输出 Pod 的日志(标准输出) kubectl logs -f my-pod -c my-container # 流式输出 Pod 容器的日志(标准输出, 多容器场景) kubectl logs -f -l name=myLabel --all-containers # 流式输出含 name=myLabel 标签的 Pod 的所有日志(标准输出) kubectl run -i --tty busybox --image=busybox -- sh # 以交互式 Shell 运行 Pod kubectl run nginx --image=nginx -n mynamespace # 在指定名字空间中运行 nginx Pod kubectl run nginx --image=nginx # 运行 ngins Pod 并将其规约写入到名为 pod.yaml 的文件 --dry-run=client -o yaml > pod.yaml kubectl attach my-pod -i # 挂接到一个运行的容器中 kubectl port-forward my-pod 5000:6000 # 在本地计算机上侦听端口 5000 并转发到 my-pod 上的端口 6000 kubectl exec my-pod -- ls / # 在已有的 Pod 中运行命令(单容器场景) kubectl exec --stdin --tty my-pod -- /bin/sh # 使用交互 shell 访问正在运行的 Pod (一个容器场景) kubectl exec my-pod -c my-container -- ls / # 在已有的 Pod 中运行命令(多容器场景) kubectl top pod POD_NAME --containers # 显示给定 Pod 和其中容器的监控数据 kubectl top pod POD_NAME --sort-by=cpu # 显示给定 Pod 的指标并且按照 'cpu' 或者 'memory' 排序
logs
kubectl logs [pod_name] kubectl logs --since=1h [pod_name] kubectl logs --tail =20 [pod_name] kubectl logs -f -c [container_name] [pod_name] # 跟踪查看容器的日志,相当于tail -f命令的结果 kubectl logs [pod_name] > pod.log
与 Deployments 和 Services 进行交互
kubectl logs deploy/my-deployment # 获取一个 Deployment 的 Pod 的日志(单容器例子) kubectl logs deploy/my-deployment -c my-container # 获取一个 Deployment 的 Pod 的日志(多容器例子) kubectl port-forward svc/my-service 5000 # 侦听本地端口 5000 并转发到 Service 后端端口 5000 kubectl port-forward svc/my-service 5000:my-service-port # 侦听本地端口 5000 并转发到名字为 <my-service-port> 的 Service 目标端口 kubectl port-forward deploy/my-deployment 5000:6000 # 侦听本地端口 5000 并转发到 <my-deployment> 创建的 Pod 里的端口 6000 kubectl exec deploy/my-deployment -- ls # 在 Deployment 里的第一个 Pod 的第一个容器里运行命令(单容器和多容器例子)
与节点和集群进行交互
kubectl cordon my-node # 标记 my-node 节点为不可调度 kubectl drain my-node # 对 my-node 节点进行清空操作,为节点维护做准备 kubectl uncordon my-node # 标记 my-node 节点为可以调度 kubectl top node my-node # 显示给定节点的度量值 kubectl cluster-info # 显示主控节点和服务的地址 kubectl cluster-info dump # 将当前集群状态转储到标准输出 kubectl cluster-info dump --output-directory=/path/to/cluster-state # 将当前集群状态输出到 /path/to/cluster-state # 如果已存在具有指定键和效果的污点,则替换其值为指定值。 kubectl taint nodes foo dedicated=special-user:NoSchedule
其它
范例:kubernetes修改node不可调度与删除
在master 执行
#1, 不可调度 kubectl cordon k8s-node-1 kubectl uncordon k8s-node-1 #取消 #2,驱逐已经运行的业务容器 kubectl drain --ignore-daemonsets --delete-local-data k8s-node-1 #3,如果想删除node 节点,则进行这个步骤 kubectl delete node k8s-node-1
资源类型
列出所支持的全部资源类型和它们的简称、API 组, 是否是名字空间作用域 和 Kind。
kubectl api-resources
用于探索 API 资源的其他操作
kubectl api-resources --namespaced=true # 所有命名空间作用域的资源 kubectl api-resources --namespaced=false # 所有非命名空间作用域的资源 kubectl api-resources -o name # 用简单格式列举所有资源(仅显示资源名称) kubectl api-resources -o wide # 用扩展格式列举所有资源(又称 "wide" 格式) kubectl api-resources --verbs=list,get # 支持 "list" 和 "get" 请求动词的所有资源 kubectl api-resources --api-group=extensions # "extensions" API 组中的所有资源
api-versions
# kubectl api-versions
格式化输出
要以特定格式将详细信息输出到终端窗口,将 -o=(或者
=--output=)参数添加到支持的 =kubectl
命令中
-o=custom-columns=<spec> 使用逗号分隔的自定义列列表打印表
-o=custom-columns-file=<filename> 使用<filename>文件中的自定义列模板打印表
-o=json 输出JSON格式的API对象
-o=jsonpath=<template> 打印jsonpath表达式中定义的字段
-o=jsonpath-file=<filename> 打印文件中jsonpath表达式定义的字段<filename>
-o=name 仅打印资源名称而不打印任何其他内容
-o=wide 使用任何其他信息以纯文本格式输出,对于pod,包括节点名称
-o=yaml 输出YAML格式的API对象
使用 -o=custom-columns
的示例:
# 集群中运行着的所有镜像 kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image' # 列举 default 名字空间中运行的所有镜像,按 Pod 分组 kubectl get pods --namespace default --output=custom-columns="NAME:.metadata.name,IMAGE:.spec.containers[*].image" # 除 "k8s.gcr.io/coredns:1.6.2" 之外的所有镜像 kubectl get pods -A -o=custom-columns='DATA:spec.containers[?(@.image!="k8s.gcr.io/coredns:1.6.2")].image' # 输出 metadata 下面的所有字段,无论 Pod 名字为何 kubectl get pods -A -o=custom-columns='DATA:metadata.*'
有关更多示例,请参看 kubectl 参考文档。
其它
json 输出JSON格式的API对象
# 列出属于某个 PC 的 Pod 的名字 sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?} echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name}) # 列出当前 Pod 中使用的 Secret kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
(3)以自定义列名显示Pod的信息:
kubectl get pod <pod-name> -o=custom-columns=NAME:.metadata.name,RSRC:.metadata.resourceVersion
(4)基于文件的自定义列名输出:
kubectl get pods <pod-name> -o=custom-columns-file=template.txt template.txt文件的内容为: NAME RSRC metadata.name metadata.resourceVersion 输出结果 $ kubectl get pods chaosfomoney-deployment-64ccd59bdc-h72gh -o=custom-columns-file=template.txt NAME RSRC chaosfomoney-deployment-64ccd59bdc-h72gh 101119
(5)jsonpath= 打印jsonpath表达式中定义的字段
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' #获取所有节点的 ExternalIP kubectl get pods --selector=app=cassandra rc -o jsonpath='{.items[*].metadata.labels.version}' # 获取所有具有 app=cassandra 的 pod 中的 version 标签 # 查看哪些节点已就绪 JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \ && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True"
另外,还可以将输出结果按某个字段排序,通过–sort-by参数以jsonpath表达式进行指定:
$ kubectl [command] [TYPE] [NAME] --sort-by=<jsonpath_exp>
例如,按照名字进行排序:
$ kubectl get pods NAME READY STATUS RESTARTS AGE chaosfomoney-deployment-64ccd59bdc-h72gh 1/1 Running 0 1d chaosfomoney-deployment-64ccd59bdc-spnpj 1/1 Running 0 1d chaosfomoney-deployment-64ccd59bdc-xhnjr 1/1 Running 0 1d $ kubectl get pods --sort-by=.metadata.name NAME READY STATUS RESTARTS AGE chaosfomoney-deployment-64ccd59bdc-h72gh 1/1 Running 0 1d chaosfomoney-deployment-64ccd59bdc-spnpj 1/1 Running 0 1d chaosfomoney-deployment-64ccd59bdc-xhnjr 1/1 Running 0 1d
kubectl get services --sort-by=.metadata.name # List Services Sorted by Name
根据重启次数排序列出 pod
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
Kubectl 日志输出详细程度和调试
Kubectl 日志输出详细程度是通过 -v
或者 --v
来控制的,参数后跟一个数字表示日志的级别。 Kubernetes
通用的日志习惯和相关的日志级别在
这里
有相应的描述。
详细等级 描述 --v=0 总是对操作人员可见。 --v=1 合理的默认日志级别,如果您不需要详细输出。 --v=2 可能与系统的重大变化相关的,有关稳定状态的信息和重要的日志信息。这是对大多数系统推荐的日志级别。 --v=3 有关更改的扩展信息。 --v=4 调试级别详细输出。 --v=6 显示请求的资源。 --v=7 显示HTTP请求的header。 --v=8 显示HTTP请求的内容。
kubectl安装
# OS X curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl # Linux curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config # Windows curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/windows/amd64/kubectl.exe
命令详解
常用命令详解 get命令用于获取集群的一个或一些resource信息 describe类似于get,同样用于获取resource的相关信息。不同的是,get获得的是更详细的resource个性的详细信息,describe获得的是resource集群相关的信息。describe命令同get类似,但是describe不支持-o选项 resource包括集群节点、运行的pod,ReplicationController,service等。
参考: https://blog.csdn.net/u012429005/article/details/98069681
查看
Cluster Info
[root@master ~]# kubectl config [root@master ~]# kubectl cluster-info [root@master ~]# kubectl get componentstatuses
查看上下文
# 展示kubernet集群的配置设置信息 kubectl config view # use multiple kubeconfig files at the same time and view merged config KUBECONFIG=~/.kube/config:~/.kube/kubconfig2 # 获取e2e用户的密码 kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}' #获取用户列表 kubectl config view -o jsonpath='{.users[].name}' #展示上下文列表 kubectl config get-contexts #展示当前上下文 kubectl config current-context #设置默认上下文为my-cluster-name kubectl config use-context my-cluster-name # 通过验证添加一个新的分支进集群 kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword # 将后续kubectl 的命令永久保存到该上下文所有的命名空间 kubectl config set-context --current --namespace=ggckad-s2 # 使用特定的用户名和命名空间设置上下文 kubectl config set-context gce --user=cluster-admin --namespace=foo \ && kubectl config use-context gce #删除用户foo kubectl config unset users.foo # delete user foo
Nodes
关于节点的常见命令
no 是 node的简写
[root@master ~]# kubectl get no #查看node节点 NAME STATUS ROLES AGE VERSION master Ready master 4h22m v1.14.0 node1 Ready <none> 3h52m v1.14.0 node2 Ready <none> 3h52m v1.14.0 ----------------------------------------------------- NAME 节点的名字 STATUS 节点的状态 ROLES 节点在集群中扮演的角色 AGE 运行时长 VERSION 版本号 [root@master ~]# kubectl get no -o wide #查看node节点 NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master Ready master 4h25m v1.14.0 192.168.13.141 <none> CentOS Linux 7 (Core) 3.10.0-693.el7.x86_64 docker://18.6.1 node1 Ready <none> 3h56m v1.14.0 192.168.13.142 <none> CentOS Linux 7 (Core) 3.10.0-693.el7.x86_64 docker://18.6.1 node2 Ready <none> 3h56m v1.14.0 192.168.13.143 <none> CentOS Linux 7 (Core) 3.10.0-693.el7.x86_64 docker://18.6.1 ----------------------------------------------------- INTERNAL-IP 节点所在的IP地址 EXTERNAL-IP IP的外部网络或互联网 OS-IMAGE 操作系统的镜像版本 KERNEL-VERSION 内核版本号 CONTAINER-RUNTIME 容器运行时的版本 [root@master ~]# kubectl describe no [root@master ~]# kubectl get no -o yaml #以yaml的格式输出node的详细信息 [root@master ~]# kubectl get no -o json #以json的格式输出node的详细信息 [root@master ~]# kubectl get node --selector=[label_name] #selector 标签选择器(yaml文件中有) kubectl get node --selector='!node-role.kubernetes.io/master' [root@master ~]# kubectl top node [node_name] #查看node节点各资源的使用情况 如: [root@master ~]# kubectl top node node1 NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% node1 96m 9% 587Mi 67% # 获取所有node的ExtenalIP地址 kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' # 检查哪些节点已准备就绪 JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \ && kubectl get nodes -o jsonpath="$JSONPATH" | grep "Ready=True" # 获取status中多个字段, 再组合成json [root@ip-10-0-129-226 bin]# kubectl ip-1 -ojsonpath='{.status.capacity}{"\n"}{.status.allocatable}'|jq { "cpu": "4", "ephemeral-storage": "83864556Ki", "hugepages-1Gi": "0", "hugepages-2Mi": "0", "hugepages-32Mi": "0", "hugepages-64Ki": "0", "memory": "32447172Ki", "pods": "58" } { "cpu": "3920m", "ephemeral-storage": "76215832858", "hugepages-1Gi": "0", "hugepages-2Mi": "0", "hugepages-32Mi": "0", "hugepages-64Ki": "0", "memory": "31430340Ki", "pods": "58" } [root@ip-10-0-129-226 bin]# kubectl get node ip-1 -ojsonpath='{.status.capacity}{"\n"}{.status.allocatable}'|jq -s '.[0] as $capacity | .[1] as $allocatable | {capacity: $capacity, allocatable: $allocatable}' { "capacity": { "cpu": "4", "ephemeral-storage": "83864556Ki", "hugepages-1Gi": "0", "hugepages-2Mi": "0", "hugepages-32Mi": "0", "hugepages-64Ki": "0", "memory": "32447172Ki", "pods": "58" }, "allocatable": { "cpu": "3920m", "ephemeral-storage": "76215832858", "hugepages-1Gi": "0", "hugepages-2Mi": "0", "hugepages-32Mi": "0", "hugepages-64Ki": "0", "memory": "31430340Ki", "pods": "58" } }
Pods
po 是pod的简写
kubectl get po #pod的信息 kubectl get pods --all-namespaces # 展示所有namespace下所有的pod kubectl get pods -o wide # 展示所有namespace下所有的pod的更多信息 kubectl get pods --include-uninitialized # 展示当前namespace下所有pod,包括未初始化的 kubectl get pod my-pod -o yaml # 获取pod的配置文件 kubectl get pod my-pod -o yaml --export # 获取pod的配置文件,排除特定的属性 kubectl describe po [root@master ~]# kubectl get po --show-labels #查看pod对应的标签 NAME READY STATUS RESTARTS AGE LABELS mysql-ft58r 1/1 Running 0 64m app=mysql myweb-2j67r 1/1 Running 0 56m app=myweb myweb-7nzdc 1/1 Running 0 56m app=myweb nginx-5f965696dd-w4thr 1/1 Running 1 3h8m app=nginx,pod-template-hash=5f965696dd [root@master ~]# kubectl get po -l app=nginx #查看标签为app: nginx 的pod [root@master ~]# kubectl get po -o yaml #yaml格式 [root@master ~]# kubectl get po -o json #json格式 [root@master ~]# kubectl get pods -- field-selector status.phase=Running #查看状态为Running的pod NAME READY STATUS RESTARTS AGE mysql-ft58r 1/1 Running 0 78m myweb-2j67r 1/1 Running 0 70m myweb-7nzdc 1/1 Running 0 70m nginx-5f965696dd-w4thr 1/1 Running 1 3h22m # pod上次状态 $kube_CMD -n $namespace get pods $rname -o go-template="{{range .status.containerStatuses}}{{.lastState.terminated.finishedAt}}@{{.lastState.terminated.reason}}{{end}}@{{.status.podIP}}@{{.status.hostIP}}" # 展示依据重启次数排序的pod kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' # 获取标签为app=cassandra的pod的metadata.labels.version kubectl get pods --selector=app=cassandra -o \ jsonpath='{.items[*].metadata.labels.version}' # 列出属于特定RC的Pod名称 #jq命令对于复杂的json路径转换很有用, 更多详情https://stedolan.github.io/jq/ sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?} echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name}) # 显示所有pod(或任何其他支持标签的Kubernetes对象)的标签 # Also uses "jq" for item in $( kubectl get pod --output=name); do printf "Labels for %s\n" "$item" | grep --color -E '[^/]+$' && kubectl get "$item" --output=json | jq -r -S '.metadata.labels | to_entries | .[] | " \(.key)=\(.value)"' 2>/dev/null; printf "\n"; done # 列出当前pod正在使用的所有secert kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq # 列出镜像 kubectl get deploy -o jsonpath='{range .items[*]}{@.metadata.namespace},{@.metadata.name},{range @.spec.template.spec.containers[*]}{@.name},{@.image}{"\n"}{end}{end}'|sort -t ',' -k 2 | awk -F',' '{printf"%20-s %30-s %40-s %40-s\n",$1,$2,$3,$4}' #过滤出集群中所有标签不符合k8s-app为calico-node和ratel的Pod,并按照pod名字进行排序 kubectl get po -l k8s-app notin (calico-node,ratel) --all-namespaces --sort-by=.metadata.name
# 列出pod资源配置 kubectl get deploy -n general-components -o jsonpath='{range .items[*]}{@.spec.replicas},{range @.spec.template.spec.containers[*]}{@.name},{@.resources.requests.cpu}C/{@.resources.requests.memory},{@.readinessProbe.httpGet.path},{@.readinessProbe.httpGet.port}{"\n"}{end}{end}'|sort -t ',' -k 2 |sed '1i副本数,项目,单节点资源,健康地址,端口' >general-components.csv
kubectl get deploy -n english-prod -o jsonpath='{range .items[*]}{@.spec.replicas},{range @.spec.template.spec.containers[*]}{@.name},{@.resources.requests.cpu}C/{@.resources.requests.memory},{@.readinessProbe.httpGet.path},{@.readinessProbe.httpGet.port}{"\n"}{end}{end}'|sort -t ',' -k 2 |sed '1i副本数,项目,单节点资源,健康地址,端口' |awk -F',' '{printf"%s %40-s %20-s %10-s\n",$1,$2,$3,$4}'
kubectl get deploy -o jsonpath='{range .items[*]}{@.spec.replicas},{range @.spec.template.spec.containers[*]}{@.name},{@.resources.requests.cpu}C/{@.resources.requests.memory},{@.resources.limits.cpu}C/{@.resources.limits.memory},{@.readinessProbe.httpGet.path},{@.readinessProbe.httpGet.port}{"\n"}{end}{end}'|sort -t ',' -k 2 |sed '1i副本数,项目,单副本request,单副本limit,健康地址,端口' |awk -F',' '{printf"%s %40-s %20-s %20-s %10-s\n",$1,$2,$3,$4,$5}' kubectl get deploy -o jsonpath='{range .items[*]}{@.spec.replicas}%{range @.spec.template.spec.containers[*]}{@.name}%{@.resources.requests.cpu}C/{@.resources.requests.memory}%{@.resources.limits.cpu}C/{@.resources.limits.memory}%{@.readinessProbe.httpGet.path}%{@.readinessProbe.httpGet.port}%{@.ports}%{@.command}/{@.args}{"\n"}{end}{end}'|sort -t ',' -k 2 |sed '1i副本数,项目,单副本request,单副本limit,健康地址,端口,服务端口,启动参数' |awk -F'%' '{printf"%s %40-s %20-s %20-s %10-s %10-s %20-s %20-s\n",$1,$2,$3,$4,$5,$6,$7,$8}'
匹配env字段内容
"env": [ { "name": "POD_IP", "valueFrom": { "fieldRef": { "apiVersion": "v1", "fieldPath": "status.podIP" } } } ], [root@proxy ~]# kubectl -n dev1 get po canal-server-69b5f49894-2tzhd -ojson |grep -C20 env [root@proxy ~]# kubectl -n dev1 get po canal-server-69b5f49894-2tzhd -ojsonpath='{.spec.containers[?(@.name == "canal-server")].env}' [{"name":"POD_IP","valueFrom":{"fieldRef":{"apiVersion":"v1","fieldPath":"status.podIP"}}}] [root@proxy ~]# kubectl -n dev1 get po canal-server-69b5f49894-2tzhd -ojsonpath='{.spec.containers[?(@.name == "canal-server")].env[?(@.name == "POD_IP")].valueFrom}' {"fieldRef":{"apiVersion":"v1","fieldPath":"status.podIP"}}
Namespaces(命名空间)
[root@master ~]# kubectl get ns #查看命名空间 NAME STATUS AGE default Active 5h22m kube-node-lease Active 5h22m kube-public Active 5h22m kube-system Active 5h22m [root@master ~]# kubectl get ns - o yaml [root@master ~]# kubectl describe ns
Deployments
[root@master ~]# kubectl get deploy [root@master ~]# kubectl describe deploy [root@master ~]# kubectl get deploy - o wide [root@master ~]# kubectl get deploy - o yaml
Services
kubectl get svc kubectl describe svc kubectl get svc - o wide kubectl get svc - o yaml kubectl get svc --show-labels # 展示依据metadata.name 排序过的service kubectl get services --sort-by=.metadata.name
####DaemonSets
[root@master ~]# kubectl get ds [root@master ~]# kubectl get ds --all-namespaces [root@master ~]# kubectl describe ds [daemonset_name] - n [namespce_name] [root@master ~]# kubectl get ds [ds_name] -n [ns_name] -o yaml
Events
[root@master ~]# kubectl get events [root@master ~]# kubectl get events -n kube-system [root@master ~]# kubectl get events -w # 展示根据时间标签排序的事件 kubectl --kubeconfig=/etc/kubernetes/admin.conf -n english-prod get event --sort-by=.metadata.creationTimestamp # 查看所有事件 kubectl get events --all-namespaces # 查看名为nginx对象的事件 kubectl get events --field-selector involvedObject.name=nginx,involvedObject.namespace=default # 查看名为nginx的服务事件 kubectl get events --field-selector involvedObject.name=nginx,involvedObject.namespace=default,involvedObject.kind=Service # 查看Pod的事件 kubectl get events --field-selector involvedObject.name=nginx-85cb5867f-bs7pn,involvedObject.kind=Pod # 按时间对events排序 kubectl get events --sort-by=.metadata.creationTimestamp # 自定义events输出格式 kubectl get events --sort-by='.metadata.creationTimestamp' -o 'go-template={{range .items}}{{.involvedObject.name}}{{"\t"}}{{.involvedObject.kind}}{{"\t"}}{{.message}}{{"\t"}}{{.reason}}{{"\t"}}{{.type}}{{"\t"}}{{.firstTimestamp}}{{"\n"}}{{end}}'
LAST SEEN TYPE REASON OBJECT MESSAGE <unknown> Warning FailedScheduling pod/english-etp-race-mqtt-658ffc45bd-8jqnp 0/109 nodes are available: 27 Insufficient cpu, 32 node(s) didn't match node selector, 77 Insufficient memory. 4m3s Normal NotTriggerScaleUp pod/english-etp-race-mqtt-658ffc45bd-mth47 pod didn't trigger scale-up (no group fit even if a new node is added) 3m20s Normal TriggeredScaleUp pod/english-etp-race-mqtt-658ffc45bd-xrhkf pod triggered scale-up: [{asg-2ze1hr7i95b770owi42z 0->2 (max: 30)}] 38m Warning Unhealthy pod/english-etp-race-mqtt-658ffc45bd-w68gq Readiness probe failed: Get http://172.20.14.93:8090/health: dial tcp 172.20.14.93:8090: connect: connection refused 37m Normal Killing pod/english-etp-race-match-8454d88655-kvjmq Stopping container english-etp-race-match 37m Warning FailedPreStopHook pod/english-etp-race-match-8454d88655-tcbjg Exec lifecycle hook ([/bin/sh -c /data/down_nacos.sh]) for Container "english-etp-race-match" in Pod "english-etp-race-match-8454d88655-tcbjg_english-prod(0368b640-1bee-4770-a4ab-ba606fc2a8fa)" failed - error: command '/bin/sh -c /data/down_nacos.sh' exited with 127: /bin/sh: /data/down_nacos.sh: No such file or directory
kubectl -n english-prod get events -o json { "apiVersion": "v1", "items": [ { "apiVersion": "v1", "count": 39, "eventTime": null, "firstTimestamp": "2020-11-10T07:21:30Z", "involvedObject": { "apiVersion": "autoscaling.alibabacloud.com/v1beta1", "kind": "CronHorizontalPodAutoscaler", "name": "cronhpa-sample", "namespace": "english-prod", "resourceVersion": "1410145805", "uid": "cccc07ce-da3a-4574-b365-3b07eaaea255" }, "kind": "Event", "lastTimestamp": "2020-11-15T14:21:30Z", "message": "cron hpa job scale-down executed successfully. current replicas:8, desired replicas:2.", "metadata": { "creationTimestamp": "2020-11-15T14:21:30Z", "name": "cronhpa-sample.16461487ce3c408d", "namespace": "english-prod", "resourceVersion": "8926911", "selfLink": "/api/v1/namespaces/english-prod/events/cronhpa-sample.16461487ce3c408d", "uid": "b5bedee8-5a1f-4d17-bf7e-c2aa2fcbe0ca" }, "reason": "Succeed", "reportingComponent": "", "reportingInstance": "", "source": { "component": "cron-horizontal-pod-autoscaler" }, "type": "Normal" },
kubectl -n english-prod get events --field-selector type=Warning,reason=FailedScheduling kubectl -n english-prod get events --field-selector type=Warning,reason=FailedScheduling --sort-by='.metadata.creationTimestamp' -o 'go-template={{range .items}}{{.involvedObject.name}}{{"\t"}}{{.involvedObject.kind}}{{"\t"}}{{.message}}{{"\t"}}{{.reason}}{{"\t"}}{{.type}}{{"\t"}}{{.firstTimestamp}}{{"\n"}}{{end}}'
logs
[root@master ~]# kubectl logs [pod_name] [root@master ~]# kubectl logs --since=1h [pod_name] [root@master ~]# kubectl logs --tail =20 [pod_name] [root@master ~]# kubectl logs -f -c [container_name] [pod_name] # 跟踪查看容器的日志,相当于tail -f命令的结果 [root@master ~]# kubectl logs [pod_name] > pod.log
Service Accounts
[root@master ~]# kubectl get sa [root@master ~]# kubectl get sa -o yaml [root@master ~]# kubectl get serviceaccounts default -o yaml >./sa.yaml [root@master ~]# kubectl replace serviceaccount default -f ./sa.yaml
ReplicaSets
[root@master ~]# kubectl get rs [root@master ~]# kubectl describe rs [root@master ~]# kubectl get rs -o wide [root@master ~]# kubectl get rs -o yaml
Roles
[root@master ~]# kubectl get roles --all -namespaces [root@master ~]# kubectl get roles --all -namespaces -o yaml
Secrets
[root@master ~]# kubectl get secrets [root@master ~]# kubectl get secrets --all-namespaces [root@master ~]# kubectl get secrets -o yaml
ConfigMaps
[root@master ~]# kubectl get cm [root@master ~]# kubectl get cm --all-namespaces [root@master ~]# kubectl get cm --all-namespaces -o yaml kubectl -n kube-system edit cm coredns
Ingress
[root@master ~]# kubectl get ing [root@master ~]# kubectl get ing --all-namespaces
PersistentVolume
[root@master ~]# kubectl get pv [root@master ~]# kubectl describe pv
PersistentVolumeClaim
[root@master ~]# kubectl get pvc [root@master ~]# kubectl describe pvc
StorageClass
[root@master ~]# kubectl get sc [root@master ~]# kubectl get sc -o yaml
Multiple Resources
[root@master ~]# kubectl get svc,po [root@master ~]# kubectl get deploy,no [root@master ~]# kubectl get all [root@master ~]# kubectl get all --all -namespaces
Adding Resources 添加资源
Creating a Pod
kubectl create -f [name_of_file] kubectl apply -f [name_of_file] # 通过文件创建资源 kubectl apply -f ./my1.yaml -f ./my2.yaml # 通过多个文件创建资源 kubectl apply -f ./dir # 通过文件夹里面的资源文件创建资源 kubectl apply -f https://git.io/vPieo # 通过URL创建资源 kubectl create deployment nginx --image=nginx # 开启一个Nginx实例 kubectl explain pods,svc # get the documentation for pod and svc manifest kubectl run [pod_name] --image=nginx --resart=Never kubectl run [pod_name] --geneator=run-pod/v1 --image=nginx kubectl run [pod_name] --image=nginx --restart=Never
Creating a Service
[root@master ~]# kubectl create svc nodeport [svc_name] --tcp=8080: 80
Creating a Deployment
[root@master ~]# kubectl create -f [name_of_file] [root@master ~]# kubectl apply -f [name_of_file] [root@master ~]# kubectl create deploy [deploy_name] --image=nginx --replicas=3
Interactive Pod
[root@master ~]# kubectl run [pod_name] --image=busybox --rm -it --restart=Never -- sh
Output YAML to a File
[root@master ~]# kubectl create deploy [deploy_name] --image=nginx --dry-run -o yaml > depl oy. yaml [root@master ~]# kubectl get po [pod_name] -o yaml --export > pod. yaml
Getting Help
[root@master ~]# kubectl -h [root@master ~]# kubectl create -h [root@master ~]# kubectl run -h [root@master ~]# kubectl explain deploy.spec
Changing Resource Attributes 改变资源属性
Taint
[root@master ~]# kubectl taint [node_name] [taint_name]
Labels
[root@master ~]# kubectl label [node_name] disktype=ssd [root@master ~]# kubectl label [pod_name] env=prod # 添加标签
Cordon/Uncordon
[root@master ~]# kubectl cordon [node_name] [root@master ~]# kunectl uncordon [node_name]
Drain
[root@master ~]# kubectl drain [node_name]
Nodes/Pods
[root@master ~]# kubectl delet enode [node_name] [root@master ~]# kubectl delet epod [pod_name] [root@master ~]# kubectl edit node [node_name] [root@master ~]# kubectl edit pod [pod_name] # 为rc管理的Nginx创建一个端口号为80,链接到容器端口为8000的服务 kubectl expose rc nginx --port=80 --target-port=8000 # 将单容器的Pod版本更改到v4 kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f - 修改资源 kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}' # 更新部分节点 # 更新容器镜像:容器名是必须的,通过名字来进行合并 kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}' # 使用json数组来更新容器的镜像 kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]' kubectl rolling-update frontend-v1 -f frontend-v2.json # 滚动更新 pod frontend-v1 kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 # 更新资源名称并更新镜像 kubectl rolling-update frontend --image=image:v2 # 更新 frontend pod 中的镜像 kubectl rolling-update frontend-v1 frontend-v2 --rollback # 退出已存在的进行中的滚动更新 cat pod.json | kubectl replace -f - # 基于 stdin 输入的 JSON 替换 pod
Deployments/Namespaces
[root@master ~]# kubectl edit deploy [deploy_name] [root@master ~]# kubectl delete deploy [deploy_name] [root@master ~]# kubectl expse deploy [deploy_name] --por=80 -type=NodePort [root@master ~]# kubectl scale deploy [deploy_name] --repicas=5 kubectl set image deployment/frontend www=image:v2 # 滚动更新容器"www"的"frontend"deployment,并且更新镜像 kubectl rollout undo deployment/frontend # 回退到上一个版本的deploymeny kubectl rollout status -w deployment/frontend # 滚动观察frontend 部署情况,直到完成 kubectl scale deployment/nginx-deploy --relicas=2 -n default # 临时生效,重建yaml后pod数修复 # 通过json数组来禁用deployment的livenessProbe 属性 kubectl patch deployment valid-deployment --type json -p='[{"op": "remove", "path": "/spec/template/spec/containers/0/livenessProbe"}]' kubectl autoscale deployment foo --min=2 --max=10 # 自动扩展部署 foo kubectl autoscale deployment/nginx-deploymen --min=2 --max=5 --cpu-percent=50 -n default #自动扩容指定deployment的pod数量,当pod的cpu资源利用率达到50%,最大pod数量扩容到5个,最小2个pod数量 [root@master ~]# kubectl delete ns [root@master ~]# kubectl edit ns [ns_name]
Services
[root@master ~]# kubectl edit svc [svc_name] [root@master ~]# kubectl delete svc [svc_name] kubectl edit svc/docker-registry # 编辑一个docker-registry的服务 KUBE_EDITOR="nano" kubectl edit svc/docker-registry # 使用替代编辑器
DaemonSets
[root@master ~]# kubectl edit ds [ds_name] -n kube-system [root@master ~]# kubectl delete ds [ds_name]
Service Accounts
[root@master ~]# kubectl edit sa [sa_name] [root@master ~]# kubectl delete sa [sa_name] # 将新元素添加到指定位置 kubectl patch sa default --type='json' -p='[{"op": "add", "path": "/secrets/1", "value": {"name": "whatever" } }]'
Annotate
kubectl annotate po [pod_name] [annotation] kubectl autoscale deployment foo --min=2 --max=10 # 自动扩展部署 foo kubectl annotate no [node_name]
# 强制替换,删除然后重建资源,这个操作会导致服务中断 kubectl replace --force -f ./pod.json
hpa
kubectl --kubeconfig=/root/xuchangwei/config_qa -n english-qa patch hpa english-etp-race-mqtt -p '{"spec":{"minReplicas":'"$a"'}}'
扩展资源
kubectl scale --replicas=3 rs/foo # 将一个名为foo的资源副本变为3 kubectl scale --replicas=3 -f foo.yaml # 将foo.yml中指定的资源变为3 kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # 如果名为mysql的deployment当前副本为2,则扩展为3 kubectl scale --replicas=5 rc/foo rc/bar rc/baz # 控制多个rc 变为5个
删除资源
kubectl delete -f ./pod.json # 通过特定的pod.json 删除pod kubectl delete pod,service baz foo # 删除名字为baz和foo的pods和services kubectl delete pods,services -l name=myLabel # 删除label为myLabel的pods和services kubectl delete pods,services -l name=myLabel --include-uninitialized # 删除label为myLabel并且没有初始化的pods和services kubectl -n my-ns delete po,svc --all # 删除my-ns命名空间下的所有未初始化的pods和services # 删除与pattern1和pattern2匹配的pods kubectl get pods -n mynamespace --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n mynamespace pod
与正在运行的pod交互
kubectl logs my-pod # dump pod的日志(控制台输出) kubectl logs -l name=myLabel # dump label为myLabel的pod的日志(控制台输出) kubectl logs my-pod --previous # dump pod 前一个版本容器实例化的日志(控制台输出) kubectl logs my-pod -c my-container # dump pod的容器日志 kubectl logs -l name=myLabel -c my-container # dump label为myLabel的pod的日志(控制台输出) kubectl logs my-pod -c my-container --previous # dump pod 前一个版本容器实例化的日志(控制台输出) kubectl logs -f my-pod # dump pod的日志(控制台输出) kubectl logs -f my-pod -c my-container # dump pod的容器日志 kubectl logs -f -l name=myLabel --all-containers # dump 所有标签为myLabel的pod所有日志 kubectl run -i --tty busybox --image=busybox -- sh # 将pod作为交互式shell运行 kubectl attach my-pod -i # 附加到运行容器 kubectl port-forward my-pod 5000:6000 # 在本地计算机上侦听端口5000并转发到my-pod上的端口6000 kubectl exec my-pod -- ls / # 在现有pod中运行命名(一个容器的情况) kubectl exec my-pod -c my-container -- ls / # 在现有pod中某个容器运行命名(多个容器的情况) kubectl exec -ti <pod-name> -c <container-name> /bin/bash # 通过bash获得Pod中某个容器的TTY,相当于登陆容器: kubectl top pod POD_NAME --containers # 显示给定pod及其容器的metrics
与节点集群交互
kubectl cordon my-node # 将my-node标记为不可调度 kubectl drain my-node # 清空my-node以准备维护 #驱逐已经运行的业务容器 kubectl drain --ignore-daemonsets --delete-local-data k8s-node-1 kubectl uncordon my-node # 将my-node标记为可调度 kubectl top node my-node # 展示指定my-node的metrics kubectl cluster-info # 展示master节点以及services的地址 kubectl cluster-info dump # dump 当前集群分支的状态 kubectl cluster-info dump --output-directory=/path/to/cluster-state # dump 当前集群分支的状态到/path/to/cluster-state # 如果已存在具有该key和效果的属性,则其值将按指定替换。 kubectl taint nodes foo dedicated=special-user:NoSchedule 如果想删除node 节点,则进行这个步骤 kubectl delete node k8s-node-1
资源类型
kubectl api-resources 列出所有支持的资源类型及其短名称,API组,是否为命名空间,以及Kind kubectl api-resources --namespaced=true # 所有的命名空间资源 kubectl api-resources --namespaced=false # 所有非命名空间资源 kubectl api-resources -o name # 输出简单的所有资源(只是资源名称) kubectl api-resources -o wide # 扩展资源展示的内容 kubectl api-resources --verbs=list,get # 支持“list”和“get”请求动词的所有资源 kubectl api-resources --api-group=extensions # “extensions”API组中的所有资源
# kubectl api-resources -o wide NAME SHORTNAMES APIGROUP NAMESPACED KIND VERBS bindings true Binding [create] componentstatuses cs false ComponentStatus [get list] configmaps cm true ConfigMap [create delete deletecollection get list patch update watch] endpoints ep true Endpoints [create delete deletecollection get list patch update watch] events ev true Event [create delete deletecollection get list patch update watch] limitranges limits true LimitRange [create delete deletecollection get list patch update watch] namespaces ns false Namespace [create delete get list patch update watch]
Requests //请求
API Call
[root@master ~]# kubectl get --raw /apis/metrics.k8s.io/
别名
常用
alias kcn='kubectl config set-context $(kubectl config current-context) --namespace' alias kgp='kubectl get pods' alias ka='kubectl apply -f' alias ke='kubectl exec -ti' alias kgpa='kubectl get pods --all-namespaces'
alias cdg='cd /data/pfg-prod-k8s/' alias cp='cp -i' alias egrep='egrep --color=auto' alias fgrep='fgrep --color=auto' alias grep='grep --color=auto' alias k='kubectl' alias kaf='kubectl apply -f' alias kca='f(){ kubectl "$@" --all-namespaces; unset -f f; }; f' alias kccc='kubectl config current-context' alias kcd='kubectl config set-context $(kubectl config current-context) --namespace' alias kcdc='kubectl config delete-context' alias kcg='k config get-contexts' alias kcgc='kubectl config get-contexts' alias kcn='kubectl config set-context $(kubectl config current-context) --namespace' alias dev_ns='export K8S_NAMESPACE=dev-wallet' alias kcp='kubectl cp' alias kcsc='kubectl config set-context' alias kcu='k config use-context' alias kcuc='kubectl config use-context' alias kd='kubectl describe' alias kdcm='kubectl describe configmap' alias kdd='kubectl describe deployment' alias kdel='kubectl delete' alias kdelcm='kubectl delete configmap' alias kdeld='kubectl delete deployment' alias kdelf='kubectl delete -f' alias kdeli='kubectl delete ingress' alias kdelno='kubectl delete node' alias kdelns='kubectl delete namespace' alias kdelp='kubectl delete pods' alias kdelpvc='kubectl delete pvc' alias kdels='kubectl delete svc' alias kdelsec='kubectl delete secret' alias kdelss='kubectl delete statefulset' alias kdi='kubectl describe ingress' alias kdno='kubectl describe node' alias kdns='kubectl describe namespace' alias kdp='kubectl describe pods' alias kdpvc='kubectl describe pvc' alias kds='kubectl describe svc' alias kdsec='kubectl describe secret' alias kdss='kubectl describe statefulset' alias ke='kubectl edit' alias kecm='kubectl edit configmap' alias ked='kubectl edit deployment' alias kei='kubectl edit ingress' alias keno='kubectl edit node' alias kens='kubectl edit namespace' alias kep='kubectl edit pods' alias kepvc='kubectl edit pvc' alias kes='kubectl edit svc' alias kess='kubectl edit statefulset' alias keti='kubectl exec -ti' alias kg='kubectl get' alias kga='kubectl get all' alias kgaa='kubectl get all --all-namespaces' alias kgap='kubectl get pods --all-namespaces' alias kgc='kubectl get configmap' alias kgcm='kubectl get configmaps' alias kgd='kubectl get deployment' alias kgdw='kgd --watch' alias kgdwide='kgd -o wide' alias kgi='kubectl get ingress' alias kgm='kubectl get servicemonitor' alias kgn='kubectl get namespace' alias kgno='kubectl get nodes' alias kgns='kubectl get namespaces' alias kgp='kubectl get pods' alias kgpa='kubectl get pods --all-namespaces' alias kgpl='kgp -l' alias kgpvc='kubectl get pvc' alias kgpvcw='kgpvc --watch' alias kgpw='kgp --watch' alias kgpwide='kgp -o wide' alias kgrs='kubectl get rs' alias kgs='kubectl get service' alias kgsec='kubectl get secret' alias kgss='kubectl get statefulset' alias kgssw='kgss --watch' alias kgsswide='kgss -o wide' alias kgsw='kgs --watch' alias kgswide='kgs -o wide' alias kl='kubectl logs' alias klf='kubectl logs -f' alias kp='kubectl port-forward' alias krh='kubectl rollout history' alias krsd='kubectl rollout status deployment' alias krsss='kubectl rollout status statefulset' alias kru='kubectl rollout undo' alias ksd='kubectl scale deployment' alias ksss='kubectl scale statefulset' alias kx='kubectl exec' alias l.='ls -d .* --color=auto' alias ll='ls -l --color=auto' alias ls='ls --color=auto' alias mv='mv -i' alias pfg='cd /data/arvin/pfg-prod-k8s' alias pull_prod_k8s='git pull origin master' alias rm='rm -i' alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
集群升级
参考:https://www.xujun.org/note-136772.html
安装 kubectl convert 插件 地址:https://kubernetes.io/releases/download/
使用: 例如,将旧的 Ingress 定义转换为 networking.k8s.io/v1,可以运行:
kubectl convert -f ./legacy-ingress.yaml --output-version networking.k8s.io/v1
自动转换使用了一种类似于 Kubernetes 控制平面更新对象的技术,这些对象最初是使用旧 API 版本创建的。因为这是一个机械转换,你可能需要进去改变清单来调整默认值等等。