我无法使用kubectl,所以用etcdctl删除资源的经历

首先

这个完全是个失败的故事。

前提條件

    kubernetes 1.23 (masterはシングルノード)

搞砸的事情 (Yā de

我错误地部署了一个与kube-apiserver具有相同IP和端口的服务。
* 在单节点结构中,”10.0.0.1″是主节点(Kubernetes API服务器)的IP地址。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
  - protocol: TCP
    port: 6443
    targetPort: 443
  externalIPs:
  - 10.0.0.1

策划并执行回复策略

这样一来,kube-apiserver的Pod会陷入重新启动的循环,导致无法使用kubectl。一开始我非常紧张,但由于应用程序的Pod仍然能够持续运行,所以我没有草率地操作,而是考虑了恢复方案。

由于重新启动循环,无法与API进行通信。另外,即使使用crictl尝试进入容器,容器ID也会改变,无法长时间进入。暂时放弃对kube-apiserver的访问,稍后再考虑。

由于我在Kubernetes上有一定程度的了解,所以我知道kube-apiserver的数据都存储在etcd中。因此,我尝试直接连接etcd来删除出现问题的Service资源。

 

连接到etcd需要使用一个名为etcdctl的命令。
由于kubernetes的etcd需要证书和密钥,因此需要提前查看静态Pod的清单。

# grep pki /etc/kubernetes/manifests/etcd.yaml
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - mountPath: /etc/kubernetes/pki/etcd
      path: /etc/kubernetes/pki/etcd

据我所知,其中的”–cert-file”、”–key-file”和”-trusted-ca-file”是必需的。
你可以通过清单文件来确认目标端口号。

# grep advertise-client-urls /etc/kubernetes/manifests/etcd.yaml 
    kubeadm.kubernetes.io/etcd.advertise-client-urls: https://10.0.0.1:2379
    - --advertise-client-urls=https://10.0.0.1:2379

我将尝试连接到指定的连接目标和端口号。

# ETCDCTL_API=3 etcdctl endpoint status \
--endpoints=https://[127.0.0.1]:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key

https://[127.0.0.1]:2379, 63044e73c12f33cd, 3.5.1, 20 MB, true, 86, 270366839

看起来能够成功连接了,真是太好了。
我们来搜索一下出现问题的服务资源的键。以前好像有一个“list”的命令,但现在似乎改成了“get /”。

# ETCDCTL_API=3 etcdctl get / --prefix --keys-only \
--endpoints=https://[127.0.0.1]:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
 | grep my-service

毅然决然地删除键。

# ETCDCTL_API=3 etcdctl del '/registry/services/specs/default/my-service' \
--endpoints=https://[127.0.0.1]:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key

删除后,需要重新启动主节点。

# reboot

我认为单一的主节点只需简单地重新启动即可。这次我们通过这种方式成功地恢复了。

最后

我成功地只使用Service资源将Kubernetes操作变得无法进行!!即使在家里,也要小心管理员权限。
由于无法使用kubectl,对于管理车辆来说有相当大的影响,所以我认为这是一个很好的故障排除问题,适用于Kubernetes初学者。

在亚马逊 EKS 中,可以通过以下配置进行限制。

 

OpenShift的配置如下。