需求

目前运维的k8s集群,有topolvm-prepare-vg-之类的容器持续处于处理中,删除不掉。故障原因是之前加过本地存储,但是后来节点删除,按照之前的手册,编辑crds,TopolvmCluster,中的字段,删除对应节点后,以然存在。即通过kubectl edit命令编辑crds(自定义资源),无法修改更新相关字段。

此时需要部署kubectl-edit-status,用于编辑子资源的的kubectl 插件,edit-status能够简化k8s状态编辑,它主要作用九四解决当前资源启用状态子资源(即crds,自定义资源),直接通过标准的kubectl edit或者kubectl apply命令无法更新状态字段的问题,通过增加一个新的命令edit-status到kubectl中,赋予用户在编辑资源状态状态的能力。这在操作crds尤其有用

但是由于集群的控制节点不能访问外网,所以不能直接部署该插件。所以参照以下思路进行

  • 一台能够访问外网的客户端安装kubectl工具
  • 导出集群的kubeconfig文件到kubectl中,使得客户端能够通过kubectl操作集群
  • 客户端安装kubectl-edit-status
  • 安装这些插件,必须要保证能够正常访问外网和github

kubectl-edit-status 准备

kubctl安装

参考https://kubernetes.io/zh-cn/docs/reference/kubectl/

使用原生包管理工具安装

#添加 Kubernetes 的 yum 仓库

# 这会覆盖 /etc/yum.repos.d/kubernetes.repo 中现存的所有配置
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/rpm/repodata/repomd.xml.key
EOF


#使用yum安装kubectl
sudo yum install -y kubectl

导出并导入kubeconfig文件

关于 kubeconfig的详细操作,可以参考官网

https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/configure-access-multiple-clusters/

在集群中导出kubeconfig文件,导出的内容如下

使用edit-status插件处理k8s资源_字段

使用edit-status插件处理k8s资源_github_02

将导出的kubectl文件复制到kubectl的目录下,并改名为config

cp kubeconfig-prod1.yaml /root/.kube/
mv /root/.kube/kubeconfig-prod1.yaml /root/.kube/config

配置完成后检查kubeconfig是否生效

#查看config
kubectl config view

#测试
kubectl get pods -A

使用edit-status插件处理k8s资源_github_03

使用edit-status插件处理k8s资源_字段_04

此时确认配置kubectl以及能够通过kubeconfig连接集群。

krew安装

参考https://github.com/ulucinar/kubectl-edit-status,kubectl-edit-status是个插件,必须通过krew安装

krew的网站

https://krew.sigs.k8s.io/

Krew 是一个由 Kubernetes SIG CLI 社区维护的 kubectl 命令行工具的插件管理器。类似 红帽的YUM, 开发角度理解,类似 Nodejs 的 npm。

Krew 可以用于管理 kubelet 插件,发现 kubectl 插件,并在机器上安装它们。保持安装的插件是最新的。

#确保安装了额git
yum install git

#安装下载krew
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/\(arm\)\(64\)\?.*/\1\2/' -e 's/aarch64$/arm64/')" &&
  KREW="krew-${OS}_${ARCH}" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/${KREW}.tar.gz" &&
  tar zxvf "${KREW}.tar.gz" &&
  ./"${KREW}" install krew

#将以下文件添加到path环境变脸中,编辑vim ~/.bashrc
export PATH="${KREW_ROOT:-$HOME/.krew}/bin:$PATH"

#配置完毕后,检查krew安装
kubectl krew

使用edit-status插件处理k8s资源_字段_05

使用edit-status插件处理k8s资源_ci_06

安装edit-status插件

参考官网

https://github.com/ulucinar/kubectl-edit-status

#将此仓库添加为自定义插件索引
kubectl krew index add edit-status https://github.com/ulucinar/kubectl-edit-status

#更新插件索引
kubectl krew update

#安装edit-status插件
kubectl krew install edit-status/edit-status

#确认效果
kubectl edit-status --help

使用edit-status插件处理k8s资源_字段_07

通过edit-status编辑k8s集群的crds

首先,通过kubeclt api-resources查找需要的crds,例如本次要查找crds是topolvm

然后,通过edit-status编辑crds

使用edit-status插件处理k8s资源_ci_08

使用edit-status插件处理k8s资源_github_09

按需修改crds内容中的字段,达到修改目的

总结

1、 krew其实是个挺鸡肋的工具,目的主要是安装kubectl插件。

2、edit-status能够简化k8s状态编辑,它主要作用九四解决当前资源启用状态子资源(即crds,自定义资源),直接通过标准的kubectl edit或者kubectl apply命令无法更新状态字段的问题,通过增加一个新的命令edit-status到kubectl中,赋予用户在编辑资源状态状态的能力。这在操作crds尤其有用