Kubernetes cheat sheet

这里是极狐GitLab 支持团队在排障时用到的关于 Kubernetes 的信息列表。极狐GitLab 公开了这部分内容,让任何人都可以使用支持团队收集的内容。

caution 这些命令可能会修改或者损坏您的 Kubernetes组件,因此使用时需要自负风险。

如果你是一个付费用户并且不确定怎么使用这些命令,最好是联系支持,然后他们会帮助你处理你遇到的问题。

通用 Kubernetes 命令

  • 怎么授权给你的 GCP 项目(当你在不同的GCP账号下都有项目时尤其有用)

    gcloud auth login
    
  • 怎么访问 Kubernetes 面板

    # for minikube
    minikube dashboard -url
    
    # 对于非本地安装,如果配置了通过kubectl访问
    kubectl proxy
    
  • 怎么 SSH 到一个Kubernetes 节点并以 root 身份进入容器 https://github.com/kubernetes/kubernetes/issues/30656:
    • 对于 GCP,你可以找到节点名称并运行 gcloud compute ssh node-name.
    • 使用docker ps列出容器
    • 使用docker exec --user root -ti container-id bash进入容器
  • 怎么从本地机器复制文件到 pod

    kubectl cp file-name pod-name:./destination
    
  • 怎么处理 CrashLoopBackoff 状态的 pods:
    • 通过 Kubernetes 面板检查日志
    • 通过 Kubectl 检查日志

      kubectl logs <webservice pod> -c dependencies
      
  • 怎么实时跟踪所有 Kubenetes 集群事件:

    kubectl get events -w --all-namespace
    
  • 怎么获取前一个结束的 pod 实例日志

    kubectl logs <pod-name> --previous
    

    容器/pod 自身不会保留任何日志,所有内容都被写入stdout,这是 Kubernetes 的原则,更多细节查看Twelve-factor app

  • 怎么获取集群里配置的定时作业

    kubectl get cronjobs
    

    但配置了基于定时的备份,你可以看到新调度的作业。关于新调度的更多细节可以在使用 CronJob 运行自动化任务里找到.

GitLab 相关的 Kubernetes 信息

  • 追踪单独 pod 的日志,webservice pod 示例:

    kubectl logs gitlab-webservice-54fbf6698b-hpckq -c webservice
    
  • 查看和跟踪所有共享同一个标记的pod(这个例子里是 webservice

    # webservice pod 里的所有容器
    kubectl logs -f -l app=webserivce --all-containers=true --max-log-requests=50
    
    # 所有 webservice pod 里的 webservice 容器
    kubectl logs -f -l app=webservice -c webservice --max-log-requests=50
    
  • 同时从所有容器中流式传输日志,类似于 Linux 包安装中的命令gitlab-ctl tail

    kubectl logs -f -l release=gitlab --all-containers=true --max-log-requests=100
    
  • 检查 gitlab 命名空间(当你使用Helm Chart部署时如果你指定了不同的命名空间名称,这里的名称可以不一样)里的所有事件:

    kubectl get events -w --namespace=gitlab
    
  • 大部分有用的 极狐GitLab 工具(控制台、Rake 任务等)可以在 toolbox pod里找到,你可以进入 Pod 直接执行执行命令,或者在外部执行:

    # 找到pod
    kubectl --namespace gitlab get pods -lapp=toolbox
    
    # 打开 Rails 控制台
    kubectl --namespace gitlab exec -it -c toolbox <toolbox-pod-name> -- gitlab-rails console
    
    # 运行极狐GitLab 检查,因为通过helm chart安装的极狐GitLab 的特定结构,输出可能是混乱、不合法的。
    gitlab-rake gitlab:check
    
    # 打开控制台不需要进入 pod
    kubectl exec -it <toolbox-pod-name> -- gitlab-rails console
    
    # 检查数据库迁移状态
    kubectl exec -it <toolbox-pod-name> -- gitlab-rake db:migrate:status
    
  • 排查 架构 > Kubernetes 集群 集成
    • 检查 kubectl get events -w --all-namespace 的输出
    • 检查在 gitlab-managed-apps 名称空间里的 pods 的日志
  • 怎么获取初始管理员密码 https://gitlab.cn/docs/charts/installation/deployment.html#initial-login:

    # 找到包含密码的 secret 名称
    kubectl get secrets | grep initial-root
    
    # 解码
    kubectl get secret <secret-name> -ojsonpath={.data.password} | base64 --decode ; echo
    
  • 怎么连接到一个极狐GitLab PostgreSQL 数据库:

    kubectl exec -it <toolbox-pod-name> -- gitlab-rails dbconsole --include-password --database main
    
  • 怎么获取Helm安装状态的信息

    helm status <release name></release>
    
  • 怎么更新使用Helm Chart 安装的极狐GitLab

    helm repo update
    
    # 获取当前值并重定向到yaml文件(类似 gitlab.rb 的值)
    helm get values <release name> > gitlab.yaml
    
    # 运行升级
    helm upgrade <release name> <chart path> -f gitlab.yaml
    

    也可以查看使用Helm Chart更新极狐GitLab

  • 怎么应用变更到极狐GitLab 配置:
    • 修改 gitlab.yaml 文件
    • 运行下面的命令应用变更:

      helm upgrade <release name> <chart path> -f gitlab.yaml
      
  • 怎么获取发行版的清单信息,它很有用,因为它包含所有Kubernetes 资源和依赖 chart的信息:

    helm get manifest <release name>
    

KubeSOS 报告的快速统计

KubeSOS 是一个从极狐GitLab云原生部署里收集极狐GitLab 集群配置和日志的工具,你可以使用 fast-stats,这是一个低内存占用的小工具,用来从极狐GitLab 日志或在极狐GitLab 日志之间快速创建和对比性能分析数据。

  • 运行 fast-stats:

    cut -d ' ' -f2- <file-name> | grep ^{ | fast-stats
    
  • 列出报错:

    cut -d ' ' -f2- <file-name> | grep ^{ | fast-stats errors
    
  • 运行 fast-stats top:

    cut -d ' ' -f2- <file-name> | grep ^{ | fast-stats top
    
  • 修改打印的行数,默认打印10行:

    cut -d ' ' -f2- <file-name> | grep ^{ | fast-stats -l <number of rows>
    

在 macOS 上通过 minikube 最小化配置安装极狐GitLab

这部分的内容是基于使用minikube在Kubernetes上开发Helm,参考这些文档里的细节。

  • 通过 Homebrew 安装 Kubectl

    brew install kubernetes-cli
    
  • 通过 Homebrew 安装 minikube

    brew cask install minikube
    
  • 启动 minikube 并配置,如果 minikube 不能启动,尝试运行 minikube delete && minikube start 并重复下面的步骤:

    minikube start --cpu 3 --memory 8192  # GitLab工作所需的最低资源
    minikube addons enable ingress
    
  • 通过 Homebrew 安装 Helm 并初始化:

    brew install helm
    
  • 复制 minikube 最小值YAML文件到你的工作站:

    curl --output values.yaml "https://gitlab.com/gitlab-org/charts/gitlab/raw/master/examples/values-minikube-minimum.yaml"
    
  • 找到minikube ip命令输出里的IP地址,并使用这个IP地址更新YAML文件
  • 安装极狐GitLab Helm Chart

    helm repo add  gitlab https://charts.gitlab.io
    helm install gitlab -f <path-to-yaml-file> gitlab/gitlab
    

    如果你想修改一些极狐GitLab 设置,你可以使用上面提到的配置作为基础,然后创建你自己的YAML文件。

  • 通过helm status gitlabminikube dashboard 监控安装过程。安装可能需要花费20-30分钟的时间,具体取决于你的工作站的资源配置。
  • 当所有的pod 显示 RunningCompleted 状态,根据上面初始登录里描述的方式获取极狐GitLab 密码,然后通过 UI 登录极狐GitLab。可以通过 https://gitlab.domain来访问,domain的是 YAML 文件里的值。

toolbox pod里的 Rails 代码打补丁

caution 这个不是可以频繁执行的任务,风险自负。

给正在工作的极狐GitLab 服务pod打补丁需要构建新的镜像,其中包含修改后的源码。因此无法直接打补丁。toolbox / task-runner pod拥有基于Raisl运行的Pod所需的所有东西,不会干扰其他正常的服务操作。你可以使用它来运行独立的任务,以及临时修改源码来执行一些任务。

note 如果你使用toolbox pod来做一些修改,如果Pod重启了,那么这些修改不会被保留。他们只在容器的正常工作生命周期里可用。

要给toolbox pod 里的源码打补丁: 1. 获取要应用的.path 文件: - 直接下载合并请求的 diff 作为补丁文件 - 或者使用curl 获取 diff 文件,使用合并请求的IID替换下面的<mr_iid>,或者修改 URL 指向原始代码片段:

 ```shell
 curl --output ~/<mr_iid>.patch "https://gitlab.com/gitlab-org/gitlab/-/merge_requests/<mr_iid>.patch"
 ```
  1. toolbox pod 里的本地文件打补丁:

    cd /src/gitlab
    busybox patch -p1 -f < ~/<mr_iid>.patch