Kubernetes运维必备:让kubectl效率提升10倍的实用技巧
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
}
# 更多函数...
团队协作建议
如果你在团队中工作,建议:
- 统一别名 - 团队使用相同的别名,便于协作和问题排查
- 文档化 - 把常用的别名和函数写成文档分享
- 渐进式引入 - 不要一次性引入太多,先从最常用的开始
- 定期回顾 - 定期检查哪些别名真正有用,移除不常用的
注意事项
- 环境适配 - 这些函数中的标签名、命名空间等要根据你的实际环境调整
- 权限考虑 - 确保你有足够的权限执行这些操作
- 测试验证 - 在生产环境使用前,先在测试环境验证
- 备份配置 - 定期备份你的配置文件
进阶扩展
当你熟悉了基础操作后,可以考虑:
- 使用kubectx和kubens快速切换context和namespace
- 集成k9s或lens等可视化工具
- 使用Helm的类似别名优化
- 编写自定义的kubectl插件
这些kubectl优化技巧是我在实际工作中总结出来的,每一个都能在日常运维中节省大量时间。特别是当你管理多个集群、频繁操作节点时,这些快捷方式的价值就更明显了。
你在kubectl使用中还有什么痛点?或者有其他好用的技巧?欢迎在评论区分享,让更多运维同学受益。
觉得这些技巧有用的话,记得点赞收藏,说不定哪天就用上了。我会持续分享更多Kubernetes实战经验。
更多推荐



所有评论(0)