Kubernetes 学习笔记(三):kubectl 常用命令及插件

个人笔记

二、推荐的插件

必须把插件推荐放在前面,尤其是 k9s,绝对是当前最好用的 kubernetes 管理工具!

  1. K8s 终端管理工具 - k9s: 墙裂推荐!比 kubernetes-dashboard/kubectl 好用多了!
  2. k8s 集群与名字空间切换工具 - kubectx: 强烈推荐!
  3. kube-shell: 提供类似 ipython 的交互式 kubectl 体验
  4. ksniff: Pod 网络抓包工具,强烈推荐!
  5. K8s Pod Debug 工具: Pod 问题诊断工具,墙裂推荐!
  6. Kubernetes 插件中心 - Krew: 用于管理所有插件,不过因为是直接从 github 下载,在国内速度感人。。只推荐给有FQ工具的同学。

其他插件列表:kubectl plugins

一、Kubectl 基础命令

1. 查询

# 指定 kubeconfig
kubectl --kubeconfig <config-path> get pods

# 指定名字空间的 pods
kubectl --namespace <namespace> get pods
kubectl -n <namespace> get pods

# 显示更多的信息(pod 所在节点,clusterip 等)
kubectl get pods -o wide

# 查询所有名字空间的 pods
kubectl get pods --all-namespace
kubectl get pods -A  # 缩写

# 列出所有的名字空间
kubectl get ns  # ns 是 namespace 的缩写

# 查看 default 空间的所有服务
kubectl get svc

# 查看 ingress
kubectl get ingress

# 查看当前命名空间下的所有资源(不包含CRD)
kubectl  get  all
# 列出所有资源及资源实例(不包含CRD)
kubectl  get  all --all

# 列出所有的自定义资源
kubectl get crds

# 列出某自定义资源的所有实例
kubectl get <crd-name>
# 举例,列出所有的 istio virtualservice
kubectl get virtualservices.networking.istio.io
kubectl get virtualservices  # 缩写方式

# 查询 k8s 的资源使用情况 (CPU/Memory/Storage)
kubectl top node
kubectl top deployment

2. 添加/修改

kubectl create 只允许创建原来不存在的资源,而 kubectl apply 可以创建/修改资源(有一部分信息不支持通过 apply 修改)。虽然说官方不推荐使用 apply 进行资源的创建。。

# 临时运行一个 pod/deployment
# 1. 创建一个 nginx pod,并同时为其创建一个 service(ClusterIp)暴露出 80 端口,targetPort 默认和 port 一致
kubectl run nginx --image=nginx --expose=true  --port=80  --generator=run-pod/v1
# 这一句的效果等同上面 run 命令的 --expose=true  --port=80,只是这边的 targetPort 和 port 可以不一致
kubectl expose pod nginx --port=80 --target-port=80

# 为节点添加标签
kubectl label node "disk=ssd"

#删除标签
kubectl  label node disk-

# 修改已经存在的标签
kubectl label node "disk=hdd" --override

# 递归便利整个文件夹的 yaml 文件
kubectl create --recursive -f .  # 递归遍历当前文件夹中的 yaml,依次 create


# 直接修改资源
kubectl edit pod <pod-name>  # 会直接弹出 vim 界面供修改,内容为 yaml 格式。

3. 调试 Pod:在 pod 内执行命令

kubectl exec <pod-name> -- <command>  # -- 用于分隔 kubectl 命令和要在容器内部执行的命令
# 常用调试命令
kubectl exec <pod-name> -- ping xxx
kubectl exec <pod-name> -- nslookup xxx
kubectl exec <pod-name> -- cat xxx

kubectl exec -it <pod-name> bash  # 使用容器的 shell,如果没有 bash,可以试试使用 sh。如果连 sh 都没有,那就只有上面的方法可用了。

另外 kubectl 1.18 提供了一个 Pod 调试命令 kubectl alpha debug,可启动一个专用的调试容器,对某 Pod 进行调试。不过该项功能目前还处于 Alpha 状态,只建议试用。命令如下:

# Create an interactive debugging session in pod mypod and immediately attach to it.
# (requires the EphemeralContainers feature to be enabled in the cluster)
kubectl alpha debug mypod -i --image=busybox

上面提到的 EphemeralContainers 特性需要 kubernetes 1.16+

4. 删除

# 删除整个名字空间
kubectl delete ns <space-name>  # ns 是 namespace 的缩写

# 删除所有的 pods
kubectl delete pod --all

# 删除 default 名字空间中(几乎)所有的资源(不包括 CRD 自定义资源,比如 istio 的 virtualservice/gateway/destinationrule)
kubectl delete all --all  # 第一个 all 表示所有的资源类型(pod/service/ingress,但不包括 secret),第二个 all 表示资源的所有实例。

# 删除默认名字空间中的所有 istio 配置
kubectl delete destinationrules --all
kubectl delete virtualservices --all
kubectl delete gateway --all
# 或者一次清除三个
kubectl delete destinationrules,virtualservices,gateway --all

5. 污点、驱逐维护、滚动更新/回滚

# 添加、删除污点
kubectl taint -h

# 封锁/取消封锁某个节点(将该节点的状态设为 Unschedulable)
kubectl cordon -h
kubectl uncordon -h

# 驱逐该节点上的所有 Pod,仅 Daemonset 除外
kubectl drain -h

# deployment 的回滚
## deployment 默认使用滚动更新,历史版本上限由 `spec.revisionHistoryLimit` 控制
kubectl rollout history deploy  # 查看(当前名字空间)所有 deployments 的历史版本
kubectl rollout history deploy <deployment-name>  # 查看指定 deployment 的所有历史版本
kubectl rollout undo deploy  # 回退(当前名字空间)所有的 deployments
kubectl rollout undo deploy <deployment-name> --to-revision=3 # 回退指定 deployment 到版本 3

6. 常用命令举例

  1. 列出未完全 Ready 的 pods: kubectl get pods -A | grep -Ev '([0-9]+)/\1'-A--all-namespaces
    • 强烈推荐使用 k9s,通过快捷键 Ctrl-z 只查看所有有问题的资源。
    • 错误示范kubectl get pods -A --field-selector=status.phase!=Running,不会列出状态为 CrashBackoffLoop 的 pods!以及已 Running 但未 Ready 的 pods!
  2. 查看崩溃容器的日志:kubectl logs <pod-name> --previous,即上一个 pod 的日志

7. 使用 kube-ctx 方便地管理多个集群

通常创建完集群后,我们能得到一个 kubeconfig 文件,我们可以使用改文件与集群通信。
可是如果有多个集群需要管理,那每次都得指定 --kubeconfig xxx,就显得很麻烦,该如何简化操作呢?

首先观察 kubeconfig 文件的内容,它是一个 yaml 格式的文件,包含了管理集群需要的所有信息:

  1. cluster 部分:apiserver 地址及集群授权数据
  2. context 部分:集群管理员用户的账号名及 TLS 证书(公钥)+私钥,用于验证身份
  3. current-context: 当前 context 的名称

观察 kubeconfig 的结构可以发现,它是支持多个 clusters/context 的。那多个集群的 kubeconfig 是不是能合并成一个,然后使用 current-context 切换集群呢?答案是可以!

首先我们将多个集群的 kubeconfig 合并成一个,方法如下:

# 1. 合并前先确定两个 kubeconfig 的 cluster-name 和 context-name 不能一样!一定要改成不一样的!否则会相互覆盖!
# 2. KUBECONFIG 以 PATH 类似的语法设定多个 config 的位置
KUBECONFIG=<config1>:<config2> kubectl config view --flatten > $HOME/.kube/config

然后就可以通过 kubectx 方便地切换集群了。

kubectl ctx  # 查看所有集群
kubectl ctx <context-name>  # 切换集群

P.S. 其实也可用于切换集群内的用户身份,以后再研究下。

参考

posted @ 2019-10-19 13:21  於清樂  阅读(2691)  评论(0编辑  收藏  举报