etcd docker deploy on my server. In my computer, curl is work. However, golang failed for DeadlineExceeded. Firewall-cmd strategy was set so that curl could work.
docker compose fire as below:
version: "3.5"
services:
etcd:
hostname: etcd
image: bitnami/etcd:3
deploy:
replicas: 1
restart_policy:
condition: on-failure
privileged: true
volumes:
- "/home/xxx/etcd/data:/opt/bitnami/etcd/data"
environment:
- "ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379"
- "ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379"
- "ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380"
- "ETCD_INITIAL_ADVERTISE_PEER_URLS=http://0.0.0.0:2380"
- "ALLOW_NONE_AUTHENTICATION=yes"
- "ETCD_INITIAL_CLUSTER=node1=http://0.0.0.0:2380"
- "ETCD_NAME=node1"
- "ETCD_DATA_DIR=/opt/bitnami/etcd/data"
ports:
- 2379:2379
- 2380:2380
networks:
- etcdnet
networks:
etcdnet:
name: etcdnet
I use curl command as below:
curl http://my-server-ip:2379/v3/kv/put -X POST -d '{"key": "Zm9v", "value": "YmFy"}'
and golang code as below:
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"my-server-ip:2379"},
DialTimeout: 5 * time.Second,
})
if err != nil {
log.Fatal(err)
} else {
log.Println("successfully connect etcd")
}
defer cli.Close()
ctx, cancel := context.WithTimeout(context.Background(), time.Second*20)
_, err = cli.Put(ctx, "sample_key", "sample_value")
statusRes, err := cli.Status(context.Background(), "my-server-ip:2379") // Waits here indefinitely
if err != nil {
log.Fatal(err)
log.Fatal(statusRes)
}
defer cancel()
if err != nil {
log.Fatal(err)
}
This code return error:
rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = "error reading server preface: EOF"
I've set up firewall policies and even turned off the firewall, but it all works for curl, not golang.