Please enable Javascript to view the contents

k8s经验-客户端设置、强制删除

 ·  ☕ 2 分钟

简化命令行交互, 简化应用程序部署语法

1. Kubectl 自动补全

kubectl 工具本身支持自动补全,只需要简单设置一下即可

1
2
3
echo "source <(kubectl completion bash)" >> ~/.bashrc

source ~/.bashrc

如果没有安装bash-completion, 按如下命令安装

1
2
apt update
apt install bash-completion

2. 自定义 kubectl get 输出

kubectl get 相关资源,默认输出为 kubectl 内置,一般我们也可以使用-o json/-o jsonpath=''或者-o yaml查看其完整的资源信息。但是很多时候,我们需要关心的信息并不全面,因此我们需要自定义输出的列,那么可以使用 go-template 来进行实现。

go-template 是 golang 的一种模板,可以参考 template 的相关说明。

比如仅仅想要查看获取的 pods 中的各个 pod 的 uid,则可以使用以下命令:

1
kubectl get pods --all-namespaces -o go-template='{{range .items}}{{.metadata.uid}} {{end}}'

比如使用 jsonpath 获取数据

1
2
export ISTIO_PILOT_PORT=$(kubectl get -n istio-system service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp-pilot-grpc-tls")].nodePort}')
echo ${ISTIO_PILOT_PORT}

3. k8s强制删除提示 Terminatingnamespace

a. 首先尝试强制删除参数

1
kubectl delete namespace example-ns -force --grace-period=0

b. 如果不能删除,则采取以下方法

1
kubectl edit namespace example-ns

将其中spec.finalizers的值删除,也可以设置为[]。保存退出后,namespace就会被删除。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apiVersion: v1
kind: Namespace
metadata:
  finalizers:
  - controller.cattle.io/namespace-auth
  name: mars
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

思路:
命名空间无法删除通常是因为还有资源在使用这个命名空间,执行kubectl delete namespace xxx 时候,虽然显示deleted,但是命令夯死。我们可以查看资源使用情况:

1
kubectl api-resources --namespaced=true -o name | xargs -n 1 kubectl get --show-kind --ingore-not-found -n xxxx

Reference

Kubernetes 的奇技淫巧
删除一直处于terminating状态的namespace

分享

Hex
作者
Hex
CloudNative Developer

目录