zoukankan      html  css  js  c++  java
  • 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 下载,在国内速度感人。。只推荐给有翻墙工具的同学。

    其他插件列表: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. 其实也可用于切换集群内的用户身份,以后再研究下。

    参考

  • 相关阅读:
    [BTS] The adapter "SQL" raised an error message. Details "新事务不能登记到指定的事务处理器中。 ".
    [BTS] 新事务不能登记到指定的事务处理器中
    [BTS] RFCTYPE RFCTYPE_DATE with length 8 and decimals 0
    [BTS]Could not find stored procedure.
    [BTS] SAP Adapter Retrieving the COM class factory for component
    [BTS]Unable to display adapter user interface.
    [BTS]BizTalk Performance Counters
    [BTS] Error in Check Transaction: 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
    [BTS] 可能会经常用来参考的一段XSLT
    [BTS] Unable to communicate with MessageBox BizTalkMsgBoxDb on SQL Instance
  • 原文地址:https://www.cnblogs.com/kirito-c/p/11625709.html
Copyright © 2011-2022 走看看