【问题标题】:How to access kubernetes keys in etcd如何在 etcd 中访问 Kubernetes 密钥
【发布时间】:2018-05-28 05:17:37
【问题描述】:

问题

如何从 etcd 中获取 Kubernetes 相关的密钥?试图列出 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
    }
}

背景

在 CentOS 7 上按照 Using kubeadm to Create a Cluster 安装了 Kubernetes 1.8.5。当我查看 Getting started with etcd 时,v2/keys 看起来是终点。

【问题讨论】:

    标签: kubernetes etcd


    【解决方案1】:

    通常您需要自己获取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
    

    【讨论】:

    • 如果涉及证书,这里有一个示例命令:ETCDCTL_API=3 etcdctl --endpoints &lt;etd_ip&gt;:2379 --cacert /etc/kubernetes/ssl/kube-ca.pem --cert /etc/kubernetes/ssl/kube-node.pem --key /etc/kubernetes/ssl/kube-node-key.pem get / --prefix --keys-only。这个命令可以从 etcd 容器内部运行,如果它是这样部署的。
    • 代替 Minikube 看下面.. stackoverflow.com/a/65958307/3673430
    【解决方案2】:

    访问 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

    【讨论】:

      【解决方案3】:

      我需要将 etcdctl 与安装在 CoreOS(Container 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作为权限问题“错误:打开/etc/ssl/etcd/etcd/peer.crt:权限被拒绝”的快速解决方案。

      【讨论】:

        【解决方案4】:

        对于 Minikube

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

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

        alias etcdctl_mini="MY_IP=$(hostname -I |awk '{print $1}'|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

        【讨论】:

        【解决方案5】:

        您也可以尝试以下操作(假设 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
        

        【讨论】:

          猜你喜欢
          • 2020-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-11
          相关资源
          最近更新 更多