尝试coreos/jetcd用于etcd从Java代码更新haproxy设置.
我想要实现的是:
我想通过前缀删除所有键,并将实际数据作为原子操作放入etcd中.
这就是我尝试使用etcd交易的原因.我的代码是:
Op.DeleteOp deleteOp = Op.delete(
fromString(prefix),
DeleteOption.newBuilder().withPrefix(fromString(prefix)).build()
);
Txn tx = kvClient.txn().Else(deleteOp);
newKvs.forEach((k,v) -> {
tx.Else(Op.put(fromString(k), fromString(v), DEFAULT));
});
try {
tx.commit().get();
} catch (InterruptedException | ExecutionException e) {
log.error("ETCD transaction failed", e);
throw new RuntimeException(e);
}
Run Code Online (Sandbox Code Playgroud)
使用ETCD v3 API(etcd v3.2.9).KVstore最初是空的,我想添加3条记录.
prefix价值是:
/proxy-service/hosts/example.com
Run Code Online (Sandbox Code Playgroud)
并且kvs是一张地图:
"/proxy-service/hosts/example.com/FTP/0" -> "localhost:10021"
"/proxy-service/hosts/example.com/HTTPS/0" -> "localhost:10443"
"/proxy-service/hosts/example.com/HTTP/0" -> "localhost:10080"
Run Code Online (Sandbox Code Playgroud)
异常发生在commit().get()以下根本原因:
Caused by: io.grpc.StatusRuntimeException: INVALID_ARGUMENT: etcdserver: duplicate key given in txn request
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用coreos cloud-config在AWS上创建一个单节点etcd集群。我创建了一个Route53记录集,其值etcd.uday.com具有指向ELB的别名,该别名指向ec2实例。Etcd运行成功,但是当我运行etcd成员列表命令时,出现以下错误
ETCDCTL_API=3 etcdctl member list \
--endpoints=https://etcd.udayvishwakarma.com:2379 \
--cacert=./ca.pem \
--cert=etcd-client.pem \
--key=etcd-client-key.pem
Error: context deadline exceeded
Run Code Online (Sandbox Code Playgroud)
但是,当将--insecure-skip-tls-verify标志添加到etcdctl member list命令时,它将列出成员。我已经cfssl使用以下配置生成了证书
ca.json
{
"CN": "Root CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "UK",
"L": "London",
"O": "Kubernetes",
"OU": "CA"
}
],
"ca": {
"expiry": "87658h"
}
}
Run Code Online (Sandbox Code Playgroud)
ca.config
{
"signing": {
"default": {
"expiry": "2190h"
},
"profiles": {
"client": {
"expiry": "8760h",
"usages": [
"signing",
"key encipherment", …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 etcdv3 restful api 观看密钥,遵循etcd/Documentation/dev-guide/api_grpc_gateway.md,但它似乎不适用于 watch。
curl http://localhost:2379/v3beta/watch \
-X POST -d '{"create_request": {"key":"Zm9v"} }'
curl http://localhost:2379/v3beta/watch \
-X POST -d '{"create_request": {"key":"Zm9v"} }'
#{"header":{"cluster_id":"7016043442779247867","member_id":"5993310732371594633","revision":"2","raft_term":"2"}}
Run Code Online (Sandbox Code Playgroud)
手表不会有反应。
这是我的 docker-compose.yml:
version: "3"
services:
etcd:
image: quay.io/coreos/etcd:latest
command: >
/usr/local/bin/etcd
--name node1
--initial-advertise-peer-urls http://${HOST}:2380
--listen-peer-urls http://0.0.0.0:2380
--advertise-client-urls http://${HOST}:2379
--listen-client-urls http://0.0.0.0:2379
--initial-cluster node1=http://${HOST}:2380
--debug
expose:
- 2379
- 2380
ports:
- "2379:2379"
- "3380:2380"
Run Code Online (Sandbox Code Playgroud) 我硬着头皮做了一个定制的 Kubernetes 安装,并成功地将它安装在 Hyper V 的一个 2 节点集群上(1 个主 1 个工人),一切正常,但是这件事让我摸不着头脑,我想知道是否有人可以给我关于它为什么发生的洞察力。
etcdctl --help
Run Code Online (Sandbox Code Playgroud)
给了我 etcd v2 版本的帮助,它还给了我以下警告。
警告:环境变量 ETCDCTL_API 未设置;默认为 etcdctl v2。设置环境变量 ETCDCTL_API=3 以使用 v3 API 或 ETCDCTL_API=2 以使用 v2 API。
如果我设置环境变量并再次运行命令,它会被忽略:
ETCDCTL_API=3
etcdctl --help
Run Code Online (Sandbox Code Playgroud)
但如果我这样做
ETCDCTL_API=3 etcdctl --help
Run Code Online (Sandbox Code Playgroud)
然后它给了我 etcd v3 版本的帮助,我还需要将 ETCDCTL_API=3 放在 etcdctl snapshot save 前面,以便将其识别为有效命令。
ETCDCTL_API=3 etcdctl snapshot save ~/etcd.backup \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/etcd/ca.pem \
--cert=/etc/etcd/kubernetes.pem \
--key=/etc/etcd/kubernetes-key.pem
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我将 etcd 作为 docker 容器运行,10.132.41.234 是我运行 docker 容器的主机 IP,我收到这样的错误信息,我不知道它是否正确,我现在熟悉 etcd,有人可以提供帮助?谢谢!
2017-09-13 08:55:03.339612 I | etcdmain: etcd Version: 3.0.17
2017-09-13 08:55:03.339891 I | etcdmain: Git SHA: cc198e2
2017-09-13 08:55:03.339902 I | etcdmain: Go Version: go1.6.4
2017-09-13 08:55:03.339912 I | etcdmain: Go OS/Arch: linux/amd64
2017-09-13 08:55:03.339921 I | etcdmain: setting maximum number of CPUs to 2, total number of available CPUs is 2
2017-09-13 08:55:03.340059 I | etcdmain: peerTLS: cert = /etc/ssl/certs/server.pem, key = /etc/ssl/certs/server-key.pem, ca = , trusted-ca = /etc/ssl/certs/ca.pem, client-cert-auth …Run Code Online (Sandbox Code Playgroud) 我很难etcd watch与多种客户合作。
什么有效:我Watch在golang客户端做,我put也在那里做。然后观察寄存器的变化。如果我etcdctl以相同的方式使用,即在命令行中观看/收听,它也可以工作。
什么不起作用:我从命令行发布并在 go 中观看,反之亦然。
我所说的“不起作用”是指观察者没有被触发。
我正在使用的 Go 代码(你可以像这样运行go run main.go (true|false) (true|false)):
package main
import (
"github.com/coreos/etcd/clientv3"
"context"
"time"
"fmt"
"os"
)
func main() {
listen := os.Args[1]
submit := os.Args[2]
cfg := clientv3.Config{
Endpoints: []string{"http://10.0.75.1:2379"},
}
c,_ := clientv3.New(cfg)
if listen == "true" {
fmt.Println("listening: on")
ch := c.Watch(context.Background(), "/foo")
go func() {
for s := …Run Code Online (Sandbox Code Playgroud) 我是新手ETCD,我想知道可以存储在的值是否有大小限制ETCD?