如何访问 etcd 中的 kubernetes 密钥

How to access kubernetes keys in etcd

问题

如何从etcd获取Kubernetes相关key?尝试列出 etcd 中的键但看不到相关键。另外 etcdctl 安装在哪里?

$ etcdctl
bash: etcdctl: command not found..

$ sudo netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:2379          0.0.0.0:*               LISTEN      386/etcd            
tcp        0      0 127.0.0.1:2380          0.0.0.0:*               LISTEN      386/etcd            

$ curl -s http://localhost:2379/v2/keys | python -m json.tool
{
    "action": "get",
    "node": {
        "dir": true
    }
}

背景

按照Using kubeadm to Create a Cluster on CentOS 7. When I looked at Getting started with etcd安装了Kubernetes 1.8.5,v2/keys看起来是终点。

通常需要etcdctl自己获取。只需从 etcd releases page 下载最新的 etcdctl 存档。

此外,从 Kubernetes 版本 1.6 开始,它使用 etcd 版本 3,因此要获取所有键的列表是:

ETCDCTL_API=3 etcdctl --endpoints=<etcd_ip>:2379 get / --prefix --keys-only

您可以使用以下方法找到所有 etcdctl v3 个操作:

ETCDCTL_API=3 etcdctl --endpoints=<etcd_ip>:2379 --help

编辑(感谢@leodotcloud):

如果 ETCD 配置了 TLS 证书支持:

ETCDCTL_API=3 etcdctl --endpoints <etcd_ip>:2379 --cacert <ca_cert_path> --cert <cert_path> --key <cert_key_path> get / --prefix --keys-only

访问docker容器,运行以下命令:

ETCDCTL_API=3 etcdctl --endpoints 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 get / --prefix --keys-only

我需要将 etcdctl 与安装在 CoreOS(容器 Linux)上的 etcd 一起使用。 在我的例子中,以下工作(从 CoreOS shell 提示符执行):

$ sudo ETCDCTL_API=3 etcdctl --cacert /etc/ssl/etcd/etcd/peer-ca.crt --cert /etc/ssl/etcd/etcd/peer.crt --key /etc/ssl/etcd/etcd/peer.key get --prefix / --keys-only

我使用 sudo 作为权限问题的快速解决方案 "Error: open /etc/ssl/etcd/etcd/peer.crt: permission denied"。

对于 Minikube

(v1.17.0)
您可以看到探索 pod 的参数:kubectl describe pod -n kube-system etcd-PODNAME |less 在这里您可以看到证书路径等等。

要快速查询您的 etcd 字典,您可以使用这个别名:

alias etcdctl_mini="MY_IP=$(hostname -I |awk '{print }'|tr -d ' '); \
    ETCDCTL_API=3; \
    sudo -E etcdctl --endpoints ${MY_IP}:2379 \
    --cacert='/var/lib/minikube/certs/etcd/ca.crt' \
    --cert='/var/lib/minikube/certs/etcd/peer.crt' \
    --key='/var/lib/minikube/certs/etcd/peer.key'"

$ etcdctl_mini put foo bar

您也可以尝试以下(假设 etcd pod 名称是 etcd-minikube)。 上面已经解释了使用 etcdctl 访问 Minikube。

$kubectl -it exec etcd-minikube -n kube-system -- etcdctl --cacert='/var/lib/minikube/certs/etcd/ca.crt' --cert='/var/lib/minikube/certs/etcd/peer.crt' --key='/var/lib/minikube/certs/etcd/peer.key' put foo bar

好的

$kubectl -it exec etcd-minikube -n kube-system -- etcdctl --cacert='/var/lib/minikube/certs/etcd/ca.crt' --cert='/var/lib/minikube/certs/etcd/peer.crt' --key='/var/lib/minikube/certs/etcd/peer.key' get foo

foo
bar