LocalとK8SのLNDでhandshake
GKE上にデプロイしたLNDとローカルでconnectionを実施してみる。
この際に用いるコンテナはgithubにV0.1としてアップしている。
立ち上げ
空のクラスタを作成する。
gcloud container clusters create lnd-simnet --machine-type=n1-standard-1 --num-nodes=3 --region asia-northeast1-a
gcloud container clusters describe lnd-simnet
今後のローカルでのkubectlとの連携のために、credentialを渡す。
$ gcloud container clusters get-credentials lnd-simnet --zone asia-northeast1-a
Fetching cluster endpoint and auth data.
kubeconfig entry generated for test-cluster.
$ kubectl config get-contexts
Container Registry を認証するには、gcloud を Docker 認証ヘルパーとして使用する。
gcloud auth configure-docker
これができたら、imageをbuildし、gcrにpushする。 ホスト名と Google Cloud Platform Console のプロジェクト ID とイメージ名を組み合わせたものを指定する必要がある。
[HOSTNAME]/[PROJECT-ID]/[IMAGE]
docker build . -t gcr.io/<PROJECT_NAME>/lnd:latest
docker build . -t gcr.io/<PROJECT_NAME>/btcd:latest
続いて、このイメージをGCRにプッシュする。
docker push gcr.io/<PROJECT_NAME>/btcd:latest
docker push gcr.io/<PROJECT_NAME>/lnd:latest
コマンドでも可。
gcloud container images list
設定ファイルを対象にして、applyする。
$ kubectl apply -f StatefulSet.yaml --record
$ kubectl apply -f service.yaml --record
ここで、実際にコンテナに入り、立ち上げ作業を行う。
kubectl exec -it lnd-btcd-0 -c lnd bash 2019/10/18 8:51:10 +[master]
bash-5.0# lncli unlock
Input wallet password:
lnd successfully unlocked!
bash-5.0 lncli --network=simnet getinfo
{
"version": "0.7.1-beta commit=v0.7.1-beta-357-gfa063dd45c7db492e23cbe3da3ea9282e342664b",
"identity_pubkey": "xxx",
"alias": "03a511bf928935dc410e",
"color": "#3399ff",
"num_pending_channels": 0,
"num_active_channels": 0,
"num_inactive_channels": 0,
"num_peers": 0,
"block_height": 0,
"block_hash": "683e86bd5c6d110d91b94b97137ba6bfe02dbbdb8e3dff722a669b5d69d77af6",
"best_header_timestamp": 1401292357,
"synced_to_chain": false,
"synced_to_graph": false,
"testnet": false,
"chains": [
{
"chain": "bitcoin",
"network": "simnet"
}
],
"uris": null
}
ここで表示されたidentity_pubkey
に接続する。
portが開放されていることの確認はnetstatで可能。
bash-5.0# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:10009 0.0.0.0:* LISTEN
サービスのIPは下記で確認する。
~/G/s/LND_container ❯❯❯ kubectl get service 2019/10/18 8:54:56 +[master]
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ローカル
まず、せっかくなので自分で作ったnode.js製noise protocolツール、noise streamで接続を行う。
mkdir noise
cd noise
touch main.js
npm i @bruwbird/noise_stream
main.jsを下記の用に編集する。
const NoiseStream = require('@bruwbird/noise_stream');
const net = require('net');
const secp256k1 = require('bcrypto/lib/secp256k1');
const priv = secp256k1.privateKeyGenerate();
const stream = new NoiseStream();
const socket = net.connect({ port: 9735, host: "x.x.x.x" });
stream.connect(
socket,
Buffer.from(priv, 'hex'),
Buffer.from("xxxx", 'hex')
);
stream.on('connect', () => {
console.log("connected!")
})
これを実行すると、コネクションを確立できる。
~/D/noise ❯❯❯ node main.js 2019/10/18 9:49:21
connected!
docker composeで同じコンテナでも実施可能。
docker-compose run -d --name alice lnd-btc 2019/10/18 8:46:51 +[master]
Starting btcd ... done
bash-5.0# lncli --network=simnet connect xxxx@x.x.x.x
{
}
bash-5.0# lncli --network=simnet listpeers
{
"peers": [
{
"pub_key": "xxxx",
"address": "x.x.x.x:9735",
"bytes_sent": "139",
"bytes_recv": "139",
"sat_sent": "0",
"sat_recv": "0",
"inbound": false,
"ping_time": "0",
"sync_type": "ACTIVE_SYNC"
}
]
}
K8S側で確認すると、接続を確認できる。
lncli --network=simnet listpeers
{
"peers": [
{
"pub_key": "x.x.x.x",
"address": "x.x.x.x:xxxx",
"bytes_sent": "1683",
"bytes_recv": "1683",
"sat_sent": "0",
"sat_recv": "0",
"inbound": true,
"ping_time": "6026",
"sync_type": "ACTIVE_SYNC"
}
]
}
接続される側なので、"inbound": trueとなっている。