IDCFクラウドでCoreOSをディスクからインストールするからしばらく経ちました。
TechClunchにMicrosoft、Red Hat、IBM等がGoogleのDockerコンテナ管理ツール、Kubernetesサポートで団結という記事を読んだら、Salt,CoreOS,Mesosの3つは速くマスターしないといけないです。
IDCFクラウドだと手順が煩雑なのですが、CoreOSクラスタを再構築のためdiscovery.etcd.ioの操作を確認します。
discovery.etcd.io からTOKENの取得
discovery.etcd.ioからTOKENを取得します。
$ curl https://discovery.etcd.io/new https://discovery.etcd.io/a876553c49f52f4a3a5a91b5bbdca88c
|
discovery.etcd.io取得したTOKENをdiscoveryに使用します。
ローカルでCoreOSクラスタを構築するので、各nodeはプライベートIPアドレスで見つかるようにします。
~/coreos_apps/cloud-config.yml
ssh_authorized_keys: - ssh-rsa xxxx
coreos: etcd: discovery: https://discovery.etcd.io/1461ea8c611984341b01f611ff5940e1 addr: $private_ipv4:4001 peer-addr: $private_ipv4:7001 units: - name: etcd.service command: start - name: fleet.service command: start
|
discovery.etcd.io のTOKENからノードの削除
CoreOSをディスクにインストールする場合、TOKENがハードコードしてしまいます。
根本的に解決はしないのですが、新しいクラスタを作る場合にディスカバリをリセットしたいです。
Howto Reset etcd discoveryにURLのリセット方法がありました。
$ curl -XDELETE https://discovery.etcd.io/TOKEN/_state
|
削除したいノードが残っている状態です。
$ curl https://discovery.etcd.io/1461ea8c611984341b01f611ff5940e1 {"action":"get","node":{"key":"/_etcd/registry/1461ea8c611984341b01f611ff5940e1","dir":true,"nodes":[{"key":"/_etcd/registry/1461ea8c611984341b01f611ff5940e1/2a631c0e82604e93bc727887a01fc3b8","value":"http://10.1.0.73:7001","expiration":"2014-07-19T00:16:14.12997006Z","ttl":604575,"modifiedIndex":49748734,"createdIndex":49748734}],"modifiedIndex":49375252,"createdIndex":49375252}}
|
_state
キーを確認します。
$ curl https://discovery.etcd.io/1461ea8c611984341b01f611ff5940e1/_state {"action":"get","node":{"key":"/_etcd/registry/1461ea8c611984341b01f611ff5940e1/_state","value":"started","modifiedIndex":49748735,"createdIndex":49748735}}
|
_state
キーを削除します。
$ curl -XDELETE https://discovery.etcd.io/1461ea8c611984341b01f611ff5940e1/_state {"action":"delete","node":{"key":"/_etcd/registry/1461ea8c611984341b01f611ff5940e1/_state","modifiedIndex":49751193,"createdIndex":49748735}}
|
削除できているか_state
キーを確認します。
$ curl https://discovery.etcd.io/1461ea8c611984341b01f611ff5940e1/_state {"errorCode":100,"message":"Key not found","cause":"/_etcd/registry/1461ea8c611984341b01f611ff5940e1/_state","index":49751488}
|
_state
キーが削除できたので、ディスカバリの失敗は発生しなくなりますが、ノードの登録はexpirationするまで残りそうです。
$ curl https://discovery.etcd.io/1461ea8c611984341b01f611ff5940e1 {"action":"get","node":{"key":"/_etcd/registry/1461ea8c611984341b01f611ff5940e1","dir":true,"nodes":[{"key":"/_etcd/registry/1461ea8c611984341b01f611ff5940e1/2a631c0e82604e93bc727887a01fc3b8","value":"http://10.1.0.73:7001","expiration":"2014-07-19T00:16:14.12997006Z","ttl":604440,"modifiedIndex":49748734,"createdIndex":49748734}],"modifiedIndex":49375252,"createdIndex":49375252}}
|
discovery.etcd.io のTOKENからノードの削除
discovery.etcd.ioがGitHubにあるのでソースコードを読んでみます。http.goにGorillaのハンドラ登録がありました。
/{token:[a-f0-9]{32}}/{machine}
を渡してDELTEできそうです。
http.gofunc init() { r := mux.NewRouter()
r.HandleFunc("/", handlers.HomeHandler) r.HandleFunc("/new", handlers.NewTokenHandler) r.HandleFunc("/health", handlers.HealthHandler)
r.HandleFunc("/{token:[a-f0-9]{32}}", handlers.TokenHandler). Methods("GET", "PUT") r.HandleFunc("/{token:[a-f0-9]{32}}/", handlers.TokenHandler). Methods("GET", "PUT") r.HandleFunc("/{token:[a-f0-9]{32}}/{machine}", handlers.TokenHandler). Methods("GET", "PUT", "DELETE")
logH := gorillaHandlers.LoggingHandler(os.Stdout, r)
http.Handle("/", logH) }
|
ノードを指定して削除します。
$ curl -XDELETE https://discovery.etcd.io/1461ea8c611984341b01f611ff5940e1/2a631c0e82604e93bc727887a01fc3b8 {"action":"delete","node":{"key":"/_etcd/registry/1461ea8c611984341b01f611ff5940e1/2a631c0e82604e93bc727887a01fc3b8","modifiedIndex":49755257,"createdIndex":49748734}}
|
確認してみます。ノードのエントリが削除できました。
$ curl https://discovery.etcd.io/1461ea8c611984341b01f611ff5940e1 {"action":"get","node":{"key":"/_etcd/registry/1461ea8c611984341b01f611ff5940e1","dir":true,"modifiedIndex":49375252,"createdIndex":49375252}}
|
まとめ
これが正しい手順なのかよくわかりませんが、試行錯誤の段階なのでこのまま進んで、IDCFクラウド上にCoreOSのクラスタを構築してみます。