Loading...
墨滴

我的小碗汤

2022/01/04  阅读:55  主题:山吹

kubectl配置自动补全,以及不能自动补全原因排查

配置自动补全

配置自动补全,参考官方文档[1]

kubectl自动补全:

yum install bash-completion
source /usr/share/bash-completion/bash_completion

echo 'source <(kubectl completion bash)' >>~/.bashrc
source ~/.bashrc
# 或者
kubectl completion bash >/etc/bash_completion.d/kubectl

kubectl设置别名k自动补全:

echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
source ~/.bashrc

问题

按照官方文档操作之后,在有些环境是可自动补全的。有些环境只能补全namespace、资源名称,资源类型还是不可自动补全。

按Tab键可以补全ns:

# k get pod -n z
zookeeper zqh

按Tab键可以补全资源名称:

# k get pod zookeeper-operator-59cb776cb6-plkg8 

按Tab键不能补全资源类型,例如servicemonitor:

# k get servicemo

定位

在不可自动补全的服务器上查看以下包是否安装:

# rpm -qa | grep bash-completion
bash-completion-2.1-8.el7.noarch

正常情况下是安装的,这里是正常的。

思路一

  • 尝试在可以自动补全资源类型的环境上,修改~/.kube/config为不可补全环境的config内容。发现也不可补全。
  • 尝试在不可以自动补全资源类型的环境上,修改~/.kube/config为可自动补全环境的config内容。发现可以补全。

说明和主机配置没有关系,应该是k8s集群的问题。

自动补全的原理是:在按下TAB键时,会给APIServer发请求,做相应的查询操作。

思路二

在其他主机上(这里假设用172.0.1.2)上,指定kubeconfig为异常主机(172.0.4.2)的,键入kubectl get dep后按下Tab键,在异常主机上抓来自源主机的包,记录到文件中:

# tcpdump -i any host 172.0.1.2 -nn -w xxx.cap 

wireshark分析xxx.cap

image.png 发现有503的请求,URI中包含:metrics.k8s.io

# curl http://localhost:8080/apis/metrics.k8s.io/v1beta1?timeout=5s -s
503 Service Unavailable

可以定位到是有一个v1beta1.metrics.k8s.ioAPIService状态异常。

# kubectl get apiservice | grep metrics.k8s.io
v1beta1.metrics.k8s.io                    monitoring/prometheus-adapter   False (MissingEndpoints)   411d

# kubectl get apiservice v1beta1.metrics.k8s.io -o yaml
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: prometheus-adapter
    namespace: monitoring
    port: 443
  version: v1beta1
  versionPriority: 100
status:
  conditions:
  - lastTransitionTime: "2021-09-12T08:31:24Z"
    message: endpoints for service/prometheus-adapter in "monitoring" have no addresses
      with port name "https"
    reason: MissingEndpoints
    status: "False"
    type: Available

prometheus-adaptermetrics-server的功能类似,只不过前者可以自定义指标。

二者只需要装一个就行。这里的问题是因为APIService中写的后端Serviceprometheus-adapter,但相应的Pod是不正常的。

解决

修改v1beta1.metrics.k8s.io这个APIService的spec.service为:

spec:
  service:
    name: metrics-server
    namespace: kube-system

此时APIService状态正常了:

# kubectl get apiservice | grep metrics.k8s.io
v1beta1.metrics.k8s.io                    kube-system/metrics-server   True        412d

此时也可以自动补全了:

# kubectl get deployments.apps

原文

本文首发于微信公众号【我的小碗汤】,转载请注明出处:来自微信公众号【我的小碗汤】。扫码关注,了解更多咨询,更有免费资源供您学习

扫码关注,加群学习
扫码关注,加群学习

参考资料

[1]

配置自动补全,参考官方文档: https://kubernetes.io/docs/tasks/tools/included/optional-kubectl-configs-bash-linux/

我的小碗汤

2022/01/04  阅读:55  主题:山吹

作者介绍

我的小碗汤

公众号:我的小碗汤