Kubernetes运维必备:让kubectl效率提升10倍的实用技巧

你每天要敲几百次kubectl命令吗?还在为记忆复杂的参数而烦恼吗?作为一个天天和Kubernetes打交道的运维工程师,我深知kubectl命令的繁琐。今天分享一些让kubectl使用效率提升10倍的实用技巧,这些都是我在生产环境中总结出来的经验。

告别重复输入:一个字母搞定kubectl

最简单但最有效的优化就是给kubectl设置别名。如果你用Zsh,oh-my-zsh的kubectl插件是个不错的选择:

~/.zshrc中加入kubectl插件:

plugins=(... kubectl)

这个插件最有用的功能就是alias k=kubectl。从此你只需要输入一个字母k就能使用kubectl命令。

# 原来要这样
kubectl get pods

# 现在只需要
k get pods

还有一个很实用的是kca,会把命令应用到所有命名空间:

# 查看所有命名空间的服务
kca get svc
NAMESPACE     NAME    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
analytics     pod0    ClusterIP   172.20.xxx.xx    <none>        80/TCP              262d
analytics     pod1    ClusterIP   172.20.xxx.xx    <none>        80/TCP              4y190d
cache         pod2    ClusterIP   172.20.xxx.xx    <none>        6379/TCP            2y333d

精选别名:平衡效率和灵活性

很多人喜欢设置像kgp=kubectl get pods这样的别名,但我觉得太具体反而失去了灵活性。你需要记住太多别名,而且无法灵活组合。

我推荐这几个精选别名:

alias kg="k get"
alias kd="k describe" 
alias kgy="k get -o yaml"
alias kgw="k get -o wide"

这样设计的好处是只需要记住少数几个别名,但可以和其他参数灵活组合:

# 获取pods的详细信息
kgw -n kube-system pod

# 查看pod的yaml配置
kgy -n glow pod/my-pod-aaaaaaa-66666

# 描述某个资源
kd node worker-node-1

对于高频使用的特定命令,可以加几个专门的别名:

alias kt="k taint node"     # 节点污点管理
alias ktop="k top"          # 资源使用情况
alias kl="k logs"           # 日志查看

实用函数:解决实际工作中的痛点

根据部分pod名字查找

有时候你记得pod名字的一部分,但忘了具体的命名空间,这个函数可以帮你快速找到:

function kfindpod {
    name=$1
    shift
    kg --all-namespaces pod $@ | grep $name
}

使用场景:

# 忘了load balancer controller在哪个命名空间
kfindpod lb
ingress  aws-lb-controller-xxx-yyy  1/1  Running     0  34d
ingress  aws-lb-controller-xxx-yyy  1/1  Running     0  34d

批量节点污点管理

在做集群升级时,经常需要给多个节点添加或移除污点。手动一个一个处理太麻烦,这两个函数可以批量处理:

function ktnos {
    for n in $*
    do
        k taint node $n eks-node-rolling:NoSchedule
    done
}

function ktnos- {
    for n in $*
    do
        k taint node $n eks-node-rolling:NoSchedule-
    done
}

使用示例:

# 给多个节点添加污点
ktnos node-1 node-2 node-3

# 批量移除污点
ktnos- node-1 node-2 node-3

注意:污点的键值对名称要根据你的实际集群调整。

查看pods和对应节点

在做节点维护时,经常需要知道某个命名空间的pods运行在哪些节点上:

function kpodnode {
    ns=$1
    shift
    if [[ $ns =~ "allns" || $ns =~ "all"  ]]; then
      kg --all-namespaces pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,NS:.metadata.namespace,STATUS:.status.phase $@
    else
      kg -n $ns pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,STATUS:.status.phase $@
    fi
}
alias knodepod="kpodnode"

使用效果:

kpodnode analytics -w
NAME                NODE                          STATUS
metabase2023-xxxx   ip-10-0-xx-oo.ec2.internal    Running
superset-yyy        ip-10-0-xx-oo.ec2.internal    Running

配合-w选项可以实时监控pod的迁移情况,在做节点维护时特别有用。

节点组管理:大规模集群的必备技能

如果你的集群使用节点组标签来组织节点,这些函数会很有用:

# 列出节点的节点组信息
function kgnode {
    kubectl get node -o=custom-columns=NAME:.metadata.name,NODEGROUP:.metadata.labels.node-group,VERSION:.status.nodeInfo.kubeletVersion $@
}

# 查找特定节点组的节点
function knodegroup {
    kubectl get node -l node-group=$@
}

这样可以快速了解集群的节点分布情况:

kgnode
NAME                          NODEGROUP    VERSION
ip-10-0-1-100.ec2.internal   worker-1     v1.24.7
ip-10-0-1-101.ec2.internal   worker-1     v1.24.7
ip-10-0-2-100.ec2.internal   worker-2     v1.25.3

注意:标签名node-group可能因集群而异,请根据实际情况调整。

简化加密操作:sops快捷方式

如果你使用sops来加解密Helm配置,可以设置这样的快捷函数:

function sopsd {
  if [[ $KUBECONFIG =~ "prod-eks$" ]]; then
    sops -d -i helm_vars/prod/secrets.yaml
  elif [[ $KUBECONFIG =~ "sandbox-eks$" ]]; then
    sops -d -i helm_vars/sandbox/secrets.yaml
  fi
}

function sopse {
  if [[ $KUBECONFIG =~ "prod-eks$" ]]; then
    sops -e -k arn:aws:kms:us-east-1:xxxx:key/ooo -i helm_vars/prod/secrets.yaml
  elif [[ $KUBECONFIG =~ "sandbox-eks$" ]]; then
    sops -e -k arn:aws:kms:us-east-1:yyyy:key/iii -i helm_vars/sandbox/secrets.yaml
  fi
}

这样可以根据当前的kubeconfig自动选择对应的密钥和文件,避免手动指定参数。

高级技巧:输出格式化和着色

如果你安装了jq、fx、yh等工具,可以使用这些快捷命令:

alias kj="kubectl ... | jq"    # JSON格式化
alias ky="kubectl ... | yh"    # YAML高亮

这样可以让kubectl的输出更易读,特别是在查看复杂配置时。

实际工作场景应用

集群升级场景

在做集群升级时,这套组合拳特别有用:

# 1. 查看当前节点状态
kgnode

# 2. 给要升级的节点添加污点
ktnos node-1 node-2

# 3. 监控pod迁移情况
kpodnode allns -w

# 4. 升级完成后移除污点
ktnos- node-1 node-2

故障排查场景

当出现问题时,这些命令可以快速定位:

# 1. 找到问题pod
kfindpod error

# 2. 查看详细信息
kd pod/problem-pod-xxx

# 3. 查看日志
kl -f pod/problem-pod-xxx

# 4. 查看资源使用
ktop pod problem-pod-xxx

日常巡检场景

# 查看所有服务状态
kca get svc

# 查看节点资源使用
ktop node

# 查看关键应用状态
kgw -n production pod

配置文件管理

把这些别名和函数都放到你的shell配置文件中:

# ~/.bashrc 或 ~/.zshrc
source ~/.kubectl_aliases

创建一个专门的~/.kubectl_aliases文件:

# kubectl基础别名
alias k="kubectl"
alias kg="k get"
alias kd="k describe"
alias kgy="k get -o yaml"
alias kgw="k get -o wide"
alias kt="k taint node"
alias ktop="k top"
alias kl="k logs"

# 实用函数
function kfindpod {
    name=$1
    shift
    kg --all-namespaces pod $@ | grep $name
}

function kpodnode {
    ns=$1
    shift
    if [[ $ns =~ "allns" || $ns =~ "all"  ]]; then
      kg --all-namespaces pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,NS:.metadata.namespace,STATUS:.status.phase $@
    else
      kg -n $ns pod -o=custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,STATUS:.status.phase $@
    fi
}

# 更多函数...

团队协作建议

如果你在团队中工作,建议:

  1. 统一别名 - 团队使用相同的别名,便于协作和问题排查
  2. 文档化 - 把常用的别名和函数写成文档分享
  3. 渐进式引入 - 不要一次性引入太多,先从最常用的开始
  4. 定期回顾 - 定期检查哪些别名真正有用,移除不常用的

注意事项

  1. 环境适配 - 这些函数中的标签名、命名空间等要根据你的实际环境调整
  2. 权限考虑 - 确保你有足够的权限执行这些操作
  3. 测试验证 - 在生产环境使用前,先在测试环境验证
  4. 备份配置 - 定期备份你的配置文件

进阶扩展

当你熟悉了基础操作后,可以考虑:

  • 使用kubectx和kubens快速切换context和namespace
  • 集成k9s或lens等可视化工具
  • 使用Helm的类似别名优化
  • 编写自定义的kubectl插件

这些kubectl优化技巧是我在实际工作中总结出来的,每一个都能在日常运维中节省大量时间。特别是当你管理多个集群、频繁操作节点时,这些快捷方式的价值就更明显了。

你在kubectl使用中还有什么痛点?或者有其他好用的技巧?欢迎在评论区分享,让更多运维同学受益。

觉得这些技巧有用的话,记得点赞收藏,说不定哪天就用上了。我会持续分享更多Kubernetes实战经验。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐