简化命令行交互, 简化应用程序部署语法
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强制删除提示 Terminating
的namespace
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