首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在尝试创建新的etcdv3客户端时获取"rpc错误:代码=不可用desc =从服务器读取错误: EOF“

在尝试创建新的etcdv3客户端时获取"rpc错误:代码=不可用desc =从服务器读取错误: EOF“
EN

Stack Overflow用户
提问于 2022-03-17 08:45:08
回答 1查看 6.1K关注 0票数 3

我正在尝试从K8s控制器访问我的ETCD数据库,但是在尝试打开ETCD客户端时获得rpc错误/EOF。

我的设置:

  • ETCD服务部署在 K8s集群中,并包含在Istio服务网格中(其DNS记录:有一个自定义K8s控制器,该控制器使用Kubebuilder框架开发,并部署在同一个集群中,不同的命名空间中,但配置为从控制器连接到ETCD数据库的Istio服务网格
    • 的一部分,使用用于ETCD

    的Go库)。

这是我受影响的Go代码:

代码语言:javascript
运行
复制
cli, err := clientv3.New(clientv3.Config{
    Endpoints:   []string{"http://my-etcd-cluster.my-etcd-namespace.svc.cluster.local:2379"},
    DialTimeout: 5 * time.Second,
    Username:    username,
    Password:    password,
})

if err != nil {
    return nil, fmt.Errorf("opening ETCD client failed: %v", err)
}

在执行clientv3.New(...)时,我遇到了一个错误:

代码语言:javascript
运行
复制
{"level":"warn","ts":"2022-03-16T23:37:42.174Z","logger":"etcd-client","caller":"v3@v3.5.0/retry_interceptor.go:62","msg":"retrying of unary invoker failed",
"target":"etcd-endpoints://0xc00057f500/#initially=[http://my-etcd-cluster.my-etcd-namespace.svc.cluster.local:2379]","attempt":0,
"error":"rpc error: code = Unavailable desc = error reading from server: EOF"}
...
1.647473862175209e+09   INFO    controller.etcdclient   Finish reconcile loop for some-service/test-svc-client  {"reconciler group": "my-controller.something.io", "reconciler kind": "ETCDClient", "name": "test-svc-client", "namespace": "some-service", "reconcile-etcd-client": "some-service/test-svc-client"}
1.6474738621752858e+09  ERROR   controller.etcdclient   Reconciler error        {"reconciler group": "my-controller.something.io", "reconciler kind": "ETCDClient", "name": "test-svc-client", "namespace": "some-service", "error": "opening ETCD client failed: rpc error: code = Unavailable desc = error reading from server: EOF"}
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
        /go/pkg/mod/sigs.k8s.io/controller-runtime@v0.11.0/pkg/internal/controller/controller.go:266
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).Start.func2.2
        /go/pkg/mod/sigs.k8s.io/controller-runtime@v0.11.0/pkg/internal/controller/controller.go:227

当我传递一些假的无效凭据时,也会发生同样的错误。

但是,当我试图以HTTP方式访问数据库时:

代码语言:javascript
运行
复制
postBody, _ := json.Marshal(map[string]string{
    "name":     username,
    "password": password,
})
responseBody := bytes.NewBuffer(postBody)

resp, err := http.Post("http://my-etcd-cluster.my-etcd-namespace.svc.cluster.local:2379/v3/auth/authenticate", "application/json", responseBody)
if err != nil {
    return ctrl.Result{}, fmt.Errorf("an error occured %w", err)
}
l.Info(fmt.Sprintf("code: %d", resp.StatusCode))
defer resp.Body.Close()

...I获得了200个OK和一个适当的令牌(这是预期的),所以我相信我的Istio配置是可以的,我的控制器应该能够看到ETCD db服务。我不知道为什么在遵循client方法时这不起作用。

当我使用ETCD服务的端口转发并在本地访问它时,clientv3.New()和其他客户端SDK方法就像一种魅力。我遗漏了什么?如果有任何建议我会很感激的。

编辑:我还添加了一个简单的pod来尝试通过etcdctl访问我的etcd db:

代码语言:javascript
运行
复制
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: my-controller-namespace
spec:
  containers:
  - name: etcdctl
    image: bitnami/etcd
    command:
    - sleep
    - infinity

当通过kubectl exec登录到容器时,我能够访问我的db:

代码语言:javascript
运行
复制
$ etcdctl --endpoints=my-etcd-cluster.my-etcd-namespace.svc.cluster.local:2379 --user="user" --password="password" put foo bob
OK

我想问题就在SDK的某个地方?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-21 08:25:12

结果是版本不匹配--我的ETCD db是v3.5.2,我使用的clientv3库是v3.5.0。如ETCD changelog (https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.5.md)所示:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71509351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档