kubectl 最新常用命令 –V1.24版本

  • kubectl 最新常用命令 –V1.24版本已关闭评论
  • 184 次浏览
  • A+
所属分类:linux技术
摘要

还可以为 kubectl 使用一个速记别名,该别名也可以与 completion 一起使用:


Kubectl 自动补全

BASH

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

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  # 使用特定的用户名和名字空间设置上下文 kubectl config set-context gce --user=cluster-admin --namespace=foo    && kubectl config use-context gce  kubectl config unset users.foo                       # 删除用户 foo  # 设置或显示 context / namespace 的短别名 # (仅适用于 bash 和 bash 兼容的 shell,在使用 kn 设置命名空间之前要先设置 current-context) alias kx='f() { [ "$1" ] && kubectl config use-context $1 || kubectl config current-context ; } ; f' alias kn='f() { [ "$1" ] && kubectl config set-context --current --namespace $1 || kubectl config view --minify | grep namespace | cut -d" " -f6 ; } ; f'

Kubectl apply

apply 通过定义 Kubernetes 资源的文件来管理应用。 它通过运行 kubectl apply 在集群中创建和更新资源。 这是在生产中管理 Kubernetes 应用的推荐方法

# -f 指定路径 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 中创建资源  # 从标准输入创建多个 YAML 对象 cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata:   name: busybox-sleep spec:   containers:   - name: busybox     image: busybox:1.28     args:     - sleep     - "1000000" --- apiVersion: v1 kind: Pod metadata:   name: busybox-sleep-less spec:   containers:   - name: busybox     image: busybox:1.28     args:     - sleep     - "1000" EOF

Kubectl get

get 查看pod和查找service controller资源

# 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 # 列出当前名字空间下所有 Services,按名称排序 kubectl get services --sort-by=.metadata.name # 列举所有 PV 持久卷,按容量排序 kubectl get pv --sort-by=.spec.capacity.storage
# 列举所有 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 'paths|join(".")'  # 生成一个句点分隔的树,其中包含为pod等返回的所有键 kubectl get pods -o json | jq -c 'paths|join(".")'

 kubectl rollout

rollout更新资源,版本 回退

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

 kubectl patch

更新部分资源

# 部分更新某节点 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"}]}}'  # 使用带位置数组的 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" } }]'

 kubectl edit

编辑资源

kubectl edit svc/docker-registry                      # 编辑名为 docker-registry 的服务 KUBE_EDITOR="nano" kubectl edit svc/docker-registry   # 使用其他编辑器

 kubectl scale

对资源进行扩缩容

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

删除资源

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

kubectl log

日志查看

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 cp

从容器中复制文件和目录

kubectl cp /tmp/foo_dir my-pod:/tmp/bar_dir            # 将 /tmp/foo_dir 本地目录复制到远程当前命名空间中 Pod 中的 /tmp/bar_dir kubectl cp /tmp/foo my-pod:/tmp/bar -c my-container    # 将 /tmp/foo 本地文件复制到远程 Pod 中特定容器的 /tmp/bar 下 kubectl cp /tmp/foo my-namespace/my-pod:/tmp/bar       # 将 /tmp/foo 本地文件复制到远程 “my-namespace” 命名空间内指定 Pod 中的 /tmp/bar kubectl cp my-namespace/my-pod:/tmp/foo /tmp/bar       # 将 /tmp/foo 从远程 Pod 复制到本地 /tmp/bar

Note: kubectl cp 要求容器镜像中存在 “tar” 二进制文件。如果 “tar” 不存在,kubectl cp 将失败。 对于进阶用例,例如符号链接、通配符扩展或保留文件权限,请考虑使用 kubectl exec
tar cf - /tmp/foo | kubectl exec -i -n my-namespace my-pod -- tar xf - -C /tmp/bar  # 将 /tmp/foo 本地文件复制到远程 “my-namespace” 命名空间中 pod 中的 /tmp/bar kubectl exec -n my-namespace my-pod -- tar cf - /tmp/foo | tar xf - -C /tmp/bar    # 将 /tmp/foo 从远程 pod 复制到本地 /tmp/bar <!-- ## Interacting with Deployments and Services --> ## 与 Deployments 和 Services 进行交互  <!--

 

与节点和集群进行交互

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

资源类型

列出所支持的全部资源类型和它们的简称、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 组中的所有资源

格式化输出

要以特定格式将详细信息输出到终端窗口,将 -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> 打印在 <filename> 文件中定义的 jsonpath 表达式所指定的字段。
-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.*'