Edit

HyperledgerFabric with Kubernetes

이문서는 https://marxi.co/ 에서 만들어졌습니다.

사양

  • 우분투 16.04 (Slave는 17 이었던거 같지만 정상작동했음.)

설치

  • 기존에 남아있는 kubernetes 삭제

    sudo apt-get purge kubeadm
    sudo apt-get purge kubectl
    sudo apt-get purge kubelet
    sudo apt-get purge kubernetes-cni
    rm -rf /etc/systemd/system/kubelet.service.d
    rm -rf /opt/cni/bin
    rm -rf ~/.kube/config

Kubernetes 설치 (version 1.13.1)

  • 참고한 자료

    https://github.com/IBM/blockchain-network-on-kubernetes/blob/master/README-ko.md
    https://medium.com/@dirty49374/kubeadm%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-kubernetes-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-ubuntu-18-04-61710f0b4db8
    https://medium.com/@debutinfotech/deploying-hyperledger-fabric-v1-2-on-kubernetes-cluster-94a4c8032f3

  • Master, Worker 아래 명령어를 통해 설치한다.. 소스 추가 등은 기존에 한 적이 있다면 생략

    sudo su -
    # google k8s 패키지 소스 등록
    apt update && apt upgrade -y
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
    cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
    deb http://apt.kubernetes.io/ kubernetes-xenial main
    EOF

    apt-get update
    apt install linux-image-extra-virtual ca-certificates curl software-properties-common -y
    # docker 소스 등록
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
    apt update
    apt install docker-ce kubelet kubeadm kubectl kubernetes-cni -y
  • Swap 제거 (Master, Worker 공통. 안해주면 kubeadm init 때 오류 발생)

    sudo su -
    swapoff -a
    vi /etc/fstab
    # swap에 해당하는 영역을 #로 커맨트
    #UUID=696444df-416c-4846-861e-ea4bb1f66ed0 none swap sw 0 0
  • Master 노드에서 아래 명령어를 통해 kubernetes 를 실행

    sudo kubeadm init --pod-network-cidr=10.244.0.0/16

    #--pod-network-cidr 옵션은 flannel 을 플러그인으로 사용할 경우 필수라고 한다.
    # 아래 join 명령어를 그대로 복사해서

    # kubeadm join 10.0.0.194:6443 --token au4wjg.rk4ft0pgf9babix7 --discovery-token-ca-cert-hash sha256:ff5aa52f16e1a738bf49fc6291e2813b43f7722d40af317bec046c1f3b50eebf
    mkdir -p $HOME/.kube
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
    export KUBECONFIG=$HOME/.kube/config
    export KUBECONFIG=$HOME/.kube/config | tee -a ~/.bashrc
    # ~~플러그인 설치 여기서는 수많은 network 플러그인 중 weave net 설치함~~ -> 내부 domain 을 못찾는 이슈가 생김.
    kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
    >https://www.weave.works/docs/net/latest/kubernetes/kube-addon/
    # 아래는 flannel 설치 방법
    kubectl -n kube-system apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
    >https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml
  • Worker 노드에서 아래 명령어 실행

    #마스터의 kubeadm init 결과로 나온 join 명령을 그대로 복사하여 붙여넣는다.
    kubeadm join 10.0.0.194:6443 --token *************** --discovery-token-ca-cert-hash sha256:****************

플러그인 설치

  • 대시보드 (마스터 노드)

    https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/

    kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml
    kubectl proxy --port=8001 --address=10.0.0.194 --accept-hosts='^10.0.0.[0-9]*$'
    # 기본적으로 서버내 브라우저로 하면 정상동작한다.. 위로 하면 api 정보만 나옴. 다른 옵션을 추가로 줘야 할 듯 함.
    #로그인 토큰 얻기
    kubectl -n kube-system get secret
    kubectl -n kube-system describe secrets replicaset-controller-token-kzpmc
    eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJyZXBsaWNhc2V0LWNvbnRyb2xsZXItdG9rZW4tcGI3ZmwiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoicmVwbGljYXNldC1jb250cm9sbGVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYWRjNjgxYWEtMTUzOC0xMWU5LWIzYzgtMTAxZjc0MGRhMjcwIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOnJlcGxpY2FzZXQtY29udHJvbGxlciJ9.jjM7B4mx8bUgjvLRMaiTSTbKQKbGJ9V3HbkJ-3muAnqWNk7FJxK25LneO69pONGr_EhFKdfGj_u_Tsgc3gMtKaE_vrCDBKInZzLSMsG4lx4BptA0T7kLiS0yo52kZC5JQ4hucVWE4k7Qkw2AvOVDQikiNiN9Ygcg4Dj6YtF43HTsV4zX8bYgi5emGZTC8AOx-5gTaYY6oAEAT-A1xsJcxjxbB-21IujibplCLo-5QtXMPFURZOuGNvHdU3E9dCwZB1ErsmYrLr6__W2Ra9dvR9Yp6-kuth4_yDyM2NTI4xTzIJz_iQSdg4rAPx0EKzz0Jja8il2v9UEYyEP-NRvzeg

    #위 로그인은 마스터의 local에서만 가능함

Hyperledger Fabric 설치

  • git 받기

    cd /root/fabric
    git clone https://github.com/IBM/blockchain-network-on-kubernetes.git
    cd blockchain-network-on-kubernetes
  • Kubernetes 서버 버전이 v1.11.x 이상인 경우 아래 커멘드 실행.


    ## macOS
    sed -i '' s#unix:///host/var/run/docker.sock#tcp://docker:2375# configFiles/peersDeployment.yaml
    ## Linux
    sed -i s#unix:///host/var/run/docker.sock#tcp://docker:2375# configFiles/peersDeployment.yaml
  • container 에 host 수정 (실행이 안되는 오류로 도메인문제인지 확인하기 위해 사용)

    kubectl describe pods/blockchain-orderer-7db9889bcc-2k5rf | grep IP | awk {'print $2'}
    #find ./ -name "*" -exec sed -i 's/old/new/g' {} \;
  • 패브릭 배포

    chmod +x setup_blockchainNetwork.sh
    ./setup_blockchainNetwork.sh

이슈

  1. 패브릭 배포할 때 ./setup_blockchainNetwork.sh 명령어 실행시 특정 명령어가 무한루프 도는 오류

    • 내부 스크립트를 한땀한땀 따서 실행. -> 그 뒤 setup_blockchainNetwork.sh 를 커스터마이징 하여 해결 완료.

  2. PV, PVC 생성 후, pod 생성할 때 디렉터리 공유가 안되는 현상 (/shared 가 계속 copy 성공해도 비어있음.)

    • 원원

      • 원인을 local 과 hostPath 형태의 Volume 이 accessMode ReadWriteMany 를 지원 안해서라고 판단됨.

      • 원인 추측 출처 http://arisu1000.tistory.com/27849

      • nfs 를 설치하기로 함. (10.0.0.194 서버)

    • 해결

      • NFS 설치 후 적용

      • 출처 : http://darksoulstory.tistory.com/9

      • 설치 진행 후 /shared/nfs 폴더 생성

        apt-get install nfs-common nfs-kernel-server portmap
        mkdir /shared/nfs
        cd /shared/nfs
        chmod 777 /shared/nfs
        chown nobody:nogroup /shared/nfs
      • NFS 설정 파일 변경

          • vi /etc/exports 하여 하단에 내용 추가

            #형식 : [/공유 디렉터리] [접근 IP] [옵션]
            /shared/nfs * (rw,no_root_squash,async)

      • NFS 커널 서버 및 NFS 포트맵 재 시작

        systemctl restart nfs-kernel-server
        systemctl restart portmap

      • 클라이언트에서 유틸 설치 진행

        apt install nfs-common
        apt install cifs-utils
        #테스트
        mount -t nfs -o nolock 10.0.0.194:/shared/nfs /mnt/nfs
        mkdir /mnt/nfs/a
  3. 채널 생성 실패.

    • 실행

      • kubectl create -f ${KUBECONFIG_FOLDER}/create_channel.yaml

      • 오류 출력 문구

      • Error: failed to create deliver client: orderer client failed to connect to blockchain-orderer:31010: failed to create new connection: context deadline exceeded

    • 원인

      • blockchain-orderer 에 대한 도메인 네임을 못찾아서 생긴 문제.

      • network plugin 으로 weave net 을 사용하였는데, 해당 네트워크에서는 DNS 에 있지 않는 도메인은 못 찾는 것 같음.

    • 해결

      • 네트워크 설치 방법 변경

      • weave net 대신 flannel 를 설치하여 해결함.

마치며…

  • IBM 에서 제공한 Kubernetes 에서 Hyperledger Fabric 을 동작시키는 방법 의 문서를 토대로 작성하였는데, 이 문서가 IBM Cloud 를 사용한다는 가정하에 만들어져있던 문서다보니 디스크 볼륨 구성을 새로하였습니다.

  • 네트워크 부분에서는 flannel 의 latest 버전이 설치가 안되고, weave net 로 설치하면 Domain 이 인식이 안되는 등의 문제가 있던 이슈도 있었습니다.

  • 좀더 자세한 자료를 얻고 싶다면, https://github.com/IBM/blockchain-network-on-kubernetes/blob/master/README-ko.md 을 확인하시기 바랍니다.

자주쓰는 명령어

kubectl describe pods/$(kubectl get pods |grep ca |awk '{print $1}') |grep IP
# peer1 이름 확인
kubectl get pods | grep org1peer1 | awk '{print $1}'
# 체인코드 인스턴스화 JOB 로그확인
kubectl logs --all-containers=true -f `kubectl get pods|grep chaincodeinstantiate|awk '{print $1}'`
# peer1 쉘실행
kubectl exec -it `kubectl get pods|grep org1peer1|awk '{print $1}'` /bin/bash
%23%20HyperledgerFabric%20with%20Kubernetes%0A%0A%3E%20%uC774%uBB38%uC11C%uB294%20https%3A//marxi.co/%20%uC5D0%uC11C%20%uB9CC%uB4E4%uC5B4%uC84C%uC2B5%uB2C8%uB2E4.%0A%0A%23%23%20%uC0AC%uC591%0A*%20%uC6B0%uBD84%uD22C%2016.04%20%28Slave%uB294%2017%20%uC774%uC5C8%uB358%uAC70%20%uAC19%uC9C0%uB9CC%20%uC815%uC0C1%uC791%uB3D9%uD588%uC74C.%29%0A%0A%23%23%20%uC124%uCE58%0A%0A*%20%uAE30%uC874%uC5D0%20%uB0A8%uC544%uC788%uB294%20kubernetes%20%uC0AD%uC81C%0A%20%20%60%60%60%0A%20%20sudo%20apt-get%20purge%20kubeadm%0A%20%20sudo%20apt-get%20purge%20kubectl%0A%20%20sudo%20apt-get%20purge%20kubelet%0A%20%20sudo%20apt-get%20purge%20kubernetes-cni%0A%20%20rm%20-rf%20/etc/systemd/system/kubelet.service.d%0A%20%20rm%20-rf%20/opt/cni/bin%0A%20%20rm%20-rf%20%7E/.kube/config%0A%0A%20%20%60%60%60%0A%0A%23%23%23%20Kubernetes%20%uC124%uCE58%20%28version%201.13.1%29%0A%0A*%20%uCC38%uACE0%uD55C%20%uC790%uB8CC%0A%20%20%3Ehttps%3A//github.com/IBM/blockchain-network-on-kubernetes/blob/master/README-ko.md%0A%20%20%3Ehttps%3A//medium.com/@dirty49374/kubeadm%25EC%259D%2584-%25EC%2582%25AC%25EC%259A%25A9%25ED%2595%2598%25EC%2597%25AC-kubernetes-%25EC%2584%25A4%25EC%25B9%2598%25ED%2595%2598%25EA%25B8%25B0-ubuntu-18-04-61710f0b4db8%0A%20%20%3Ehttps%3A//medium.com/@debutinfotech/deploying-hyperledger-fabric-v1-2-on-kubernetes-cluster-94a4c8032f3%0A%0A*%20Master%2C%20Worker%20%uC544%uB798%20%uBA85%uB839%uC5B4%uB97C%20%uD1B5%uD574%20%uC124%uCE58%uD55C%uB2E4..%20%uC18C%uC2A4%20%uCD94%uAC00%20%uB4F1%uC740%20%uAE30%uC874%uC5D0%20%uD55C%uC801%uC774%20%uC788%uB2E4%uBA74%20%uC0DD%uB7B5%uD55C%uB2E4.%0A%20%20%60%60%60%0A%20%20sudo%20su%20-%0A%0A%20%20%23%20google%20k8s%20%uD328%uD0A4%uC9C0%20%uC18C%uC2A4%20%uB4F1%uB85D%0A%20%20apt%20update%20%26%26%20apt%20upgrade%20-y%0A%20%20curl%20https%3A//packages.cloud.google.com/apt/doc/apt-key.gpg%20%7C%20apt-key%20add%20-%0A%0A%20%20cat%20%3C%3CEOF%20%3E%20/etc/apt/sources.list.d/kubernetes.list%0A%20%20deb%20http%3A//apt.kubernetes.io/%20kubernetes-xenial%20main%0A%20%20EOF%0A%0A%20%20apt-get%20update%0A%20%20apt%20install%20linux-image-extra-virtual%20ca-certificates%20curl%20software-properties-common%20-y%0A%0A%20%20%23%20docker%20%uC18C%uC2A4%20%uB4F1%uB85D%0A%20%20curl%20-fsSL%20https%3A//download.docker.com/linux/ubuntu/gpg%20%7C%20sudo%20apt-key%20add%20-%0A%0A%20%20add-apt-repository%20%20%20%20%22deb%20%5Barch%3Damd64%5D%20https%3A//download.docker.com/linux/ubuntu%20%24%28lsb_release%20-cs%29%20stable%22%0A%0A%20%20apt%20update%0A%20%20apt%20install%20docker-ce%20kubelet%20kubeadm%20kubectl%20kubernetes-cni%20-y%0A%20%20%60%60%60%0A%0A%0A*%20Swap%20%uC81C%uAC70%20%28Master%2C%20Worker%20%uACF5%uD1B5.%20%uC548%uD574%uC8FC%uBA74%20kubeadm%20init%20%uB54C%20%uC624%uB958%20%uBC1C%uC0DD%29%0A%20%20%60%60%60%0A%20%20sudo%20su%20-%0A%0A%20%20swapoff%20-a%0A%20%20vi%20/etc/fstab%0A%20%20%23%20swap%uC5D0%20%uD574%uB2F9%uD558%uB294%20%uC601%uC5ED%uC744%20%23%uB85C%20%uCEE4%uB9E8%uD2B8%0A%20%20%23UUID%3D696444df-416c-4846-861e-ea4bb1f66ed0%20none%20%20%20%20%20%20%20%20%20%20%20%20swap%20%20%20%20sw%20%20%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%200%0A%20%20%60%60%60%0A%0A%0A*%20Master%20%uB178%uB4DC%uC5D0%uC11C%20%uC544%uB798%20%uBA85%uB839%uC5B4%uB97C%20%uD1B5%uD574%20kubernetes%20%uB97C%20%uC2E4%uD589%uD55C%uB2E4.%0A%20%20%60%60%60%0A%20%20sudo%20kubeadm%20init%20--pod-network-cidr%3D10.244.0.0/16%0A%20%20%23--pod-network-cidr%20%uC635%uC158%uC740%20flannel%20%uC744%20%uD50C%uB7EC%uADF8%uC778%uC73C%uB85C%20%uC0AC%uC6A9%uD560%20%uACBD%uC6B0%20%uD544%uC218%uB77C%uACE0%20%uD55C%uB2E4.%0A%0A%20%20%23%20%uC544%uB798%20join%20%uBA85%uB839%uC5B4%uB97C%20%uADF8%uB300%uB85C%20%uBCF5%uC0AC%uD574%uC11C%0A%20%20%23%20kubeadm%20join%2010.0.0.194%3A6443%20--token%20au4wjg.rk4ft0pgf9babix7%20--discovery-token-ca-cert-hash%20sha256%3Aff5aa52f16e1a738bf49fc6291e2813b43f7722d40af317bec046c1f3b50eebf%0A%0A%20%20mkdir%20-p%20%24HOME/.kube%0A%20%20sudo%20cp%20-i%20/etc/kubernetes/admin.conf%20%24HOME/.kube/config%0A%20%20sudo%20chown%20%24%28id%20-u%29%3A%24%28id%20-g%29%20%24HOME/.kube/config%0A%20%20export%20KUBECONFIG%3D%24HOME/.kube/config%0A%20%20export%20KUBECONFIG%3D%24HOME/.kube/config%20%7C%20tee%20-a%20%7E/.bashrc%0A%0A%20%20%23%20%7E%7E%uD50C%uB7EC%uADF8%uC778%20%uC124%uCE58%20%uC5EC%uAE30%uC11C%uB294%20%uC218%uB9CE%uC740%20network%20%uD50C%uB7EC%uADF8%uC778%20%uC911%20weave%20net%20%uC124%uCE58%uD568%7E%7E%20-%3E%20%uB0B4%uBD80%20domain%20%uC744%20%uBABB%uCC3E%uB294%20%uC774%uC288%uAC00%20%uC0DD%uAE40.%0A%20%20kubectl%20apply%20-f%20%22https%3A//cloud.weave.works/k8s/net%3Fk8s-version%3D%24%28kubectl%20version%20%7C%20base64%20%7C%20tr%20-d%20%27%5Cn%27%29%22%0A%20%20%3Ehttps%3A//www.weave.works/docs/net/latest/kubernetes/kube-addon/%0A%0A%20%20%23%20%uC544%uB798%uB294%20flannel%20%uC124%uCE58%20%uBC29%uBC95%0A%20%20kubectl%20-n%20kube-system%20apply%20-f%20https%3A//raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml%0A%20%20%3Ehttps%3A//raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/Documentation/kube-flannel.yml%0A%20%20%60%60%60%0A%0A*%20Worker%20%uB178%uB4DC%uC5D0%uC11C%20%uC544%uB798%20%uBA85%uB839%uC5B4%uB97C%20%uC2E4%uD589%uD55C%uB2E4.%0A%20%20%60%60%60%0A%20%20%23%uB9C8%uC2A4%uD130%uC758%20kubeadm%20init%20%uACB0%uACFC%uB85C%20%uB098%uC628%20join%20%uBA85%uB839%uC744%20%uADF8%uB300%uB85C%20%uBCF5%uC0AC%uD558%uC5EC%20%uBD99%uC5EC%uB123%uB294%uB2E4.%0A%20%20kubeadm%20join%2010.0.0.194%3A6443%20--token%20***************%20--discovery-token-ca-cert-hash%20sha256%3A****************%0A%20%20%60%60%60%0A%0A%0A%23%23%23%20%uD50C%uB7EC%uADF8%uC778%20%uC124%uCE58%0A%0A*%20%uB300%uC2DC%uBCF4%uB4DC%20%28%uB9C8%uC2A4%uD130%20%uB178%uB4DC%29%0A%20%20%3Ehttps%3A//kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/%0A%20%20%60%60%60%0A%20%20kubectl%20create%20-f%20https%3A//raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended/kubernetes-dashboard.yaml%0A%20%20kubectl%20proxy%20--port%3D8001%20--address%3D10.0.0.194%20--accept-hosts%3D%27%5E10.0.0.%5B0-9%5D*%24%27%0A%20%20%23%20%uAE30%uBCF8%uC801%uC73C%uB85C%20%uC11C%uBC84%uB0B4%20%uBE0C%uB77C%uC6B0%uC800%uB85C%20%uD558%uBA74%20%uC815%uC0C1%uB3D9%uC791%uD55C%uB2E4..%20%uC704%uB85C%20%uD558%uBA74%20api%20%uC815%uBCF4%uB9CC%20%uB098%uC634.%20%uB2E4%uB978%20%uC635%uC158%uC744%20%uCD94%uAC00%uB85C%20%uC918%uC57C%20%uD560%20%uB4EF%20%uD568.%0A%0A%20%20%23%uB85C%uADF8%uC778%20%uD1A0%uD070%20%uC5BB%uAE30%0A%20%20kubectl%20-n%20kube-system%20get%20secret%0A%20%20kubectl%20-n%20kube-system%20describe%20secrets%20replicaset-controller-token-kzpmc%0A%20%20%20eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJyZXBsaWNhc2V0LWNvbnRyb2xsZXItdG9rZW4tcGI3ZmwiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoicmVwbGljYXNldC1jb250cm9sbGVyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYWRjNjgxYWEtMTUzOC0xMWU5LWIzYzgtMTAxZjc0MGRhMjcwIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOnJlcGxpY2FzZXQtY29udHJvbGxlciJ9.jjM7B4mx8bUgjvLRMaiTSTbKQKbGJ9V3HbkJ-3muAnqWNk7FJxK25LneO69pONGr_EhFKdfGj_u_Tsgc3gMtKaE_vrCDBKInZzLSMsG4lx4BptA0T7kLiS0yo52kZC5JQ4hucVWE4k7Qkw2AvOVDQikiNiN9Ygcg4Dj6YtF43HTsV4zX8bYgi5emGZTC8AOx-5gTaYY6oAEAT-A1xsJcxjxbB-21IujibplCLo-5QtXMPFURZOuGNvHdU3E9dCwZB1ErsmYrLr6__W2Ra9dvR9Yp6-kuth4_yDyM2NTI4xTzIJz_iQSdg4rAPx0EKzz0Jja8il2v9UEYyEP-NRvzeg%0A%0A%20%20%20%23%uC704%20%uB85C%uADF8%uC778%uC740%20local%uC5D0%uC11C%uB9CC%20%uAC00%uB2A5%uD55C%uB4EF/..............%0A%20%20%60%60%60%0A%0A%0A%23%23%23%20Hyperledger%20Fabric%20%uC124%uCE58%0A%0A*%20git%20%uBC1B%uAE30%0A%20%20%60%60%60%0A%20%20cd%20/root/fabric%0A%20%20git%20clone%20https%3A//github.com/IBM/blockchain-network-on-kubernetes.git%0A%20%20cd%20blockchain-network-on-kubernetes%0A%20%20%60%60%60%0A%0A*%20Kubernetes%20%uC11C%uBC84%20%uBC84%uC804%uC774%20v1.11.x%20%uC774%uC0C1%uC778%20%uACBD%uC6B0%20%uC544%uB798%20%uCEE4%uBA58%uB4DC%20%uC2E4%uD589.%0A%20%20%60%60%60%0A%20%20%23%23%20macOS%0A%20%20sed%20-i%20%27%27%20s%23unix%3A///host/var/run/docker.sock%23tcp%3A//docker%3A2375%23%20configFiles/peersDeployment.yaml%0A%20%20%23%23%20Linux%0A%20%20sed%20-i%20s%23unix%3A///host/var/run/docker.sock%23tcp%3A//docker%3A2375%23%20configFiles/peersDeployment.yaml%0A%20%20%60%60%60%0A%0A*%20container%20%uC5D0%20host%20%uC218%uC815%20%20%28%uC774%uC81C%20%uC548%uC500%29%0A%20%20%60%60%60%0A%20%20%20%20kubectl%20describe%20pods/blockchain-orderer-7db9889bcc-2k5rf%20%7C%20grep%20IP%20%7C%20awk%20%7B%27print%20%242%27%7D%0A%20%20%20%20%23find%20./%20-name%20%22*%22%20-exec%20sed%20-i%20%27s/old/new/g%27%20%7B%7D%20%5C%3B%0A%20%20%60%60%60%0A%0A*%20%uD328%uBE0C%uB9AD%20%uBC30%uD3EC%0A%20%20%60%60%60%0A%20%20chmod%20+x%20setup_blockchainNetwork.sh%0A%20%20./setup_blockchainNetwork.sh%0A%20%20%60%60%60%0A%0A%0A%0A%0A%0A%0A%23%23%23%20%uC774%uC288%0A1.%20%uD328%uBE0C%uB9AD%20%uBC30%uD3EC%uD560%20%uB54C%20./setup_blockchainNetwork.sh%20%uBA85%uB839%uC5B4%20%uC2E4%uD589%uC2DC%20%uD2B9%uC815%20%uBA85%uB839%uC5B4%uAC00%20%uBB34%uD55C%uB8E8%uD504%20%uB3C4%uB294%20%uC624%uB958%0A%20%20*%20%uB0B4%uBD80%20%uC2A4%uD06C%uB9BD%uD2B8%uB97C%20%uD55C%uB540%uD55C%uB540%20%uB530%uC11C%20%uC2E4%uD589.%20-%3E%20%uADF8%20%uB4A4%20setup_blockchainNetwork.sh%20%uB97C%20%uCEE4%uC2A4%uD130%uB9C8%uC774%uC9D5%20%uD558%uC5EC%20%uD574%uACB0%20%uC644%uB8CC.%0A%0A2.%20PV%2C%20PVC%20%uC0DD%uC131%20%uD6C4%2C%20pod%20%uC0DD%uC131%uD560%20%uB54C%20%uB514%uB809%uD130%uB9AC%20%uACF5%uC720%uAC00%20%uC548%uB418%uB294%20%uD604%uC0C1%20%28/shared%20%uAC00%20%uACC4%uC18D%20copy%20%uC131%uACF5%uD574%uB3C4%20%uBE44%uC5B4%uC788%uC74C.%29%0A%20%20*%20%uC6D0%uC778%0A%20%20%20%20*%20%uC6D0%uC778%uC744%20local%20%uACFC%20hostPath%20%uD615%uD0DC%uC758%20Volume%20%uC774%20accessMode%20ReadWriteMany%20%uB97C%20%uC9C0%uC6D0%20%uC548%uD574%uC11C%uB77C%uACE0%20%uD310%uB2E8%uB428.%0A%20%20%20%20*%20%uC6D0%uC778%20%uCD94%uCE21%20%uCD9C%uCC98%20http%3A//arisu1000.tistory.com/27849%0A%20%20%20%20*%20nfs%20%uB97C%20%uC124%uCE58%uD558%uAE30%uB85C%20%uD568.%20%2810.0.0.194%20%uC11C%uBC84%29%0A%0A%20%20*%20%uD574%uACB0%0A%20%20%20%20*%20NFS%20%uC124%uCE58%20%uD6C4%20%uC801%uC6A9%0A%20%20%20%20*%20%uCD9C%uCC98%20%3A%20http%3A//darksoulstory.tistory.com/9%0A%20%20%20%20*%20%uC124%uCE58%20%uC9C4%uD589%20%uD6C4%20/shared/nfs%20%uD3F4%uB354%20%uC0DD%uC131%0A%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20apt-get%20install%20nfs-common%20nfs-kernel-server%20portmap%0A%20%20%20%20%20%20mkdir%20/shared/nfs%0A%20%20%20%20%20%20cd%20/shared/nfs%0A%20%20%20%20%20%20chmod%20777%20/shared/nfs%0A%20%20%20%20%20%20chown%20nobody%3Anogroup%20%20/shared/nfs%0A%20%20%20%20%20%20%60%60%60%0A%0A%20%20%20%20*%20NFS%20%uC124%uC815%20%uD30C%uC77C%20%uBCC0%uACBD%0A%20%20%20%20%20%20*%20vi%20/etc/exports%20%uD558%uC5EC%20%uD558%uB2E8%uC5D0%20%uB0B4%uC6A9%20%uCD94%uAC00%0A%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%23%uD615%uC2DD%20%3A%20%5B/%uACF5%uC720%20%uB514%uB809%uD130%uB9AC%5D%20%5B%uC811%uADFC%20IP%5D%20%5B%uC635%uC158%5D%0A%20%20%20%20%20%20/shared/nfs%20*%20%28rw%2Cno_root_squash%2Casync%29%0A%20%20%20%20%20%20%60%60%60%0A%20%20%20%20*%20NFS%20%uCEE4%uB110%20%uC11C%uBC84%20%uBC0F%20NFS%20%uD3EC%uD2B8%uB9F5%20%uC7AC%20%uC2DC%uC791%0A%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20systemctl%20restart%20nfs-kernel-server%0A%20%20%20%20%20%20systemctl%20restart%20portmap%0A%20%20%20%20%20%20%60%60%60%0A%0A%20%20%20%20*%20%uD074%uB77C%uC774%uC5B8%uD2B8%uC5D0%uC11C%20%uC720%uD2F8%20%uC124%uCE58%20%uC9C4%uD589%0A%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20apt%20install%20nfs-common%0A%20%20%20%20%20%20apt%20install%20cifs-utils%0A%20%20%20%20%20%20%23%uD14C%uC2A4%uD2B8%0A%20%20%20%20%20%20mount%20-t%20nfs%20-o%20nolock%2010.0.0.194%3A/shared/nfs%20/mnt/nfs%0A%20%20%20%20%20%20mkdir%20/mnt/nfs/a%0A%20%20%20%20%20%20%60%60%60%0A%0A3.%20%uCC44%uB110%20%uC0DD%uC131%20%uC2E4%uD328.%0A%20%20*%20%uC2E4%uD589%0A%20%20%20%20*%20kubectl%20create%20-f%20%24%7BKUBECONFIG_FOLDER%7D/create_channel.yaml%0A%20%20*%20%uC624%uB958%20%uCD9C%uB825%20%uBB38%uAD6C%0A%20%20%20%20*%20Error%3A%20failed%20to%20create%20deliver%20client%3A%20orderer%20client%20failed%20to%20connect%20to%20blockchain-orderer%3A31010%3A%20failed%20to%20create%20new%20connection%3A%20context%20deadline%20exceeded%0A%20%20*%20%uC6D0%uC778%0A%20%20%20%20*%20blockchain-orderer%20%uC5D0%20%uB300%uD55C%20%uB3C4%uBA54%uC778%20%uB124%uC784%uC744%20%uBABB%uCC3E%uC544%uC11C%20%uC0DD%uAE34%20%uBB38%uC81C.%0A%20%20%20%20*%20network%20plugin%20%uC73C%uB85C%20weave%20net%20%uC744%20%uC0AC%uC6A9%uD558%uC600%uB294%uB370%2C%20%uD574%uB2F9%20%uB124%uD2B8%uC6CC%uD06C%uC5D0%uC11C%uB294%20DNS%20%uC5D0%20%uC788%uC9C0%20%uC54A%uB294%20%uB3C4%uBA54%uC778%uC740%20%uBABB%20%uCC3E%uB294%20%uAC83%20%uAC19%uC74C.%0A%20%20*%20%uD574%uACB0%0A%20%20%20%20*%20%uB124%uD2B8%uC6CC%uD06C%0A%20%20%20%20*%20weave%20net%20%uB300%uC2E0%20flannel%20%uB97C%20%uC124%uCE58%uD558%uC5EC%20%uD574%uACB0%uD568.%0A%0A%0A%0A%0A%23%23%23%20%uB9C8%uCE58%uBA70...%0A%0A%0A*%20IBM%20%uC5D0%uC11C%20%uC81C%uACF5%uD55C%20%60Kubernetes%20%uC5D0%uC11C%20Hyperledger%20Fabric%20%uC744%20%uB3D9%uC791%uC2DC%uD0A4%uB294%20%uBC29%uBC95%60%20%uC758%20%uBB38%uC11C%uB97C%20%uD1A0%uB300%uB85C%20%uC791%uC131%uD558%uC600%uB294%uB370%2C%20%uC774%20%uBB38%uC11C%uAC00%20IBM%20Cloud%20%uB97C%20%uC0AC%uC6A9%uD55C%uB2E4%uB294%20%uAC00%uC815%uD558%uC5D0%20%uB9CC%uB4E4%uC5B4%uC838%uC788%uB358%20%uBB38%uC11C%uB2E4%uBCF4%uB2C8%20%uB514%uC2A4%uD06C%20%uBCFC%uB968%20%uAD6C%uC131%uC744%20%uC0C8%uB85C%uD558%uC600%uB2E4.%0A%0A*%20%uB124%uD2B8%uC6CC%uD06C%20%uBD80%uBD84%uC5D0%uC11C%uB294%20flannel%20%uC758%20latest%20%uBC84%uC804%uC774%20%uC124%uCE58%uAC00%20%uC548%uB418%uACE0%2C%20weave%20net%20%uB85C%20%uC124%uCE58%uD558%uBA74%20Domain%20%uC774%20%uC778%uC2DD%uC774%20%uC548%uB418%uB294%20%uB4F1%uC758%20%uBB38%uC81C%uAC00%20%uC788%uB358%20%uC774%uC288%uB3C4%20%uC788%uC5C8%uB2E4.%0A%0A*%20%uD655%uC778%uD574%uBCF4%uB2C8%20%uCC38%uACE0%uD55C%20%uBB38%uC11C%20%uC790%uCCB4%uC5D0%uC11C%20%uC0AC%uC6A9%uD55C%20Kubernetes%20%uBC84%uC804%uC774%20%uC124%uCE58%uD558%uB824%uB294%20%uBC84%uC804%uBCF4%uB2E4%200.4%20%uB0AE%uC740%20%uBC84%uC804%uC774%uC5C8%uB2E4.%0A%0A*%20%uC880%uB354%20%uC790%uC138%uD55C%20%uC790%uB8CC%uB97C%20%uC5BB%uACE0%20%uC2F6%uB2E4%uBA74%2C%20https%3A//github.com/IBM/blockchain-network-on-kubernetes/blob/master/README-ko.md%20%uC744%20%uCC38%uC870%uD558%uAE38%20%uBC14%uB780%uB2E4.%0A%0A%0A%0A%0A%0A%0A%23%23%23%20%uC790%uC8FC%uC4F0%uB294%20%uBA85%uB839%uC5B4%0A%60%60%60%0Akubectl%20describe%20pods/%24%28kubectl%20get%20pods%20%7Cgrep%20ca%20%7Cawk%20%27%7Bprint%20%241%7D%27%29%20%20%7Cgrep%20IP%0A%0A%23%20peer1%20%uC774%uB984%20%uD655%uC778%0Akubectl%20get%20pods%20%7C%20grep%20org1peer1%20%7C%20awk%20%27%7Bprint%20%241%7D%27%0A%0A%23%20peer1%20%uB85C%uADF8%uD655%uC778%0Akubectl%20logs%20--all-containers%3Dtrue%20-f%20%60kubectl%20get%20pods%7Cgrep%20chaincodeinstantiate%7Cawk%20%27%7Bprint%20%241%7D%27%60%0A%0A%23%20peer1%20%uC258%uC2E4%uD589%0Akubectl%20exec%20-it%20%60kubectl%20get%20pods%7Cgrep%20org1peer1%7Cawk%20%27%7Bprint%20%241%7D%27%60%20/bin/bash%0A%0A%60%60%60%0A





 프로젝트 도중 서버에 접속하지 않고도 입력 테스트를 간단하게 진행할 수 있어 텔레그램 앱을 사용하게 되었습니다.

 매번 쉘에 접속하여 테스트 명령어를 치지 않고도 간단히 메신저로 테스트 입력값을 쏠 수 있도록 하였습니다.


 텔레그램에서는 봇을 텔레그램 내부에서 실행되는 '타사 응용 프로그램'으로 정의하고 있습니다.

'타사 응용 프로그램' 에서는 https 요청을 통하여 봇을 제어할 수 있습니다. 인증은 bot 에 대한 token 값으로 진행합니다.


 


시작하기



1. http://core.telegram.org/bots 에 접속한 뒤, BotFather 링크를 클릭합니다.






2. Send Message 링크를 클릭합니다.






3. Telegram 의 BotFather 대화방에 들어오면 시작버튼을 누릅니다.



4. 아래 /newbot 명령어로 봇 생성을 하며,  봇의 이름과 봇의 유저이름을 설정해줍니다.  유저이름의 경우 뒤에 _bot 이 들어가야 합니다.




 

5. 생성되었습니다. BotFather 가 알려준 HTTP API 토큰 값을 잘 기억해두어야 합니다.





테스트



 만든 봇을 이용하여 테스트를 진행하도록 하겠습니다.

테스트는 Python 으로 아래 링크를 참조하여 테스트를 진행하였습니다.











테스트 환경 구축


1. pip install python-telegram-bot 명령어로 설치를 진행합니다.






2. git clone https://github.com/python-telegram-bot/python-telegram-bot --recursive 명령어를 통해 샘플 코드를 받습니다.






3. examples 폴더의 echobot.py 파일을 편집합니다. (토큰을 입력합니다.)







테스트 진행


1. 텔레그램에서 만든 Bot을 전역검색하여 찾은 뒤, 아래와 같이 텍스트를 입력하였습니다. 현재까지는 아무 응답이 없습니다.






2. 설치한 서버에서 examples 폴더의 echobot.py 파일을 실행시킵니다. 




3. 입력한 문구들에 대한 답장이 한꺼번에 오는 것을 확인할 수 있습니다.  그 뒤, 텍스트를 입력하면 입력한 텍스트에 대한 답장이 바로 오는 것을 확인할 수 있습니다.



4. 아래는 텍스트 입력할 때마다 출력되는 로그입니다. 

  아래 로그는 코드 내의 update 를 출력한 것으로, 이 update 에 포함되어있는 데이터를 기반으로 Rule-based 시스템을 구축할 수 있습니다.








출처 

https://core.telegram.org/bots/ 공식홈페이지

https://github.com/python-telegram-bot/python-telegram-bot/ 파이썬 예제

https://blog.psangwoo.com/coding/2016/12/08/python-telegram-bot-1.html 설명이 잘 되어 있습니다.

1)    gRPC 관련 지식

A.    gRPC

구글에서 처음 개발하여 공개한 원격 프로시저 호출(RPC) 시스템으로 HTTP/2 를 사용하고 인터페이스 설명 언어로 프로토콜 버퍼를 사용함.

 인터페이스 설명 언어가 하나이기 때문에 다양한 언어에서 데이터를 주고 받을 수 있는 장점이 있음

 

B.     HTTP/2

HTTP/1.1의 알려진 성능 제한이 개선된 프로토콜로 헤더 필드 압축과 동일한 연결에서 다중 동시 교환 허용 등을 통한 리소스 비용 절감 및 성능 개선이 진행됨

 

C.     프로토콜 버퍼

구글에서 공개한 직렬화 데이터 구조로 다양한 언어를 지원한다는 장점이 있다. 최대 64M 까지 데이터를 전달할 수 있다고 하며, JSON 과 유연한 데이터 전환이 가능하다.

관련 출처 : http://bcho.tistory.com/1182

 


2)    gRPC 사용 (python to nodejs)

I.      사용한 소프트웨어  (ubuntu 16.04 환경에서 설치함)

l  nodejs (v6.14.4)

n  nodejs grpc module (v1.11.0)


l  mongoDB(v2.6.10)


l  Python (v2.7.12)

n  grpcio, grpcio-tool (v1.16.0)


II.    protobuf 인터페이스 선언

gRPC 를 사용하려면 받는 쪽과 주는 쪽 모두 인터페이스 모델을 정의해주어야 한다.  message 는 각 언어에서 Object 에 해당하는 값이며 Service Function 에 해당하는 값이다.


syntax = "proto3";

package json;

service Json {

  rpc grpcSend (Request) returns (Response) {}

}

message Request {

  string jsonStr = 1;

}

message Response {

  string jsonStr = 1;

}

 

III.   서버 및 클라이언트 설치


l  nodejs 설치

cd ~

curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh

bash nodesource_setup.sh

apt-get install nodejs

apt-get install build-essential

 

 

l  npm 모듈 설치 (아래 package.json 파일 작성 후 npm install 실행)

{

  "name": "myapp",

  "version": "0.1.0",

  "description": "",

  "main": "app_grpc.js",

  "scripts": {

    "test": "echo \"Error: no test specified\" && exit 1"

  },

  "author": "nanum",

  "license": "ISC",

  "bugs": {},

  "homepage": "",

  "dependencies": {

    "body-parser": "^1.18.3",

    "ejs": "^2.3.3",

    "express": "^4.16.3",

    "grpc-web": "^1.0.0",

    "method-override": "^3.0.0",

    "mongoose": "^5.3.0",

    "requests": "^0.2.2",

    "websocket": "^1.0.28",

    "@grpc/proto-loader": "^0.1.0",

    "async": "^1.5.2",

    "google-protobuf": "^3.0.0",

    "grpc": "^1.11.0",

    "lodash": "^4.6.1",

    "minimist": "^1.2.0"

  }

}

 

l  mongoDB 설치

vi /usr/sbin/policy-rc.d

# exit 101 대신 exit 0 으로 변경.

 

#실행까지 같이

apt-get install mongodb-clients mongodb-server

apt-get update

 

 

l  python 관련 grpc 라이브러리 설치

apt-get install python-pip

pip install --upgrade pip

python -m pip install grpcio #--ignore-installed

python -m pip install --user grpcio-tools

 

 

 

IV.  클라이언트 코드


grpc_sender.py (공통 코드)


from __future__ import print_function

import json

import time

import grpc

import json_pb2

import json_pb2_grpc

 

def make_request(_jsonStr):

    return json_pb2.Request(jsonStr=_jsonStr)

 

def grpcSend(_jsonStr):

    with grpc.insecure_channel('10.0.0.133:3002') as channel:

        request = make_request(_jsonStr)

        stub = json_pb2_grpc.JsonStub(channel)

        response = stub.grpcSend(request)

 

    print('Sent : grpc')

 

 



grpc_inference.py (main)


import sum

import base64

import time

import grpc_sender

 

#ws_sender.sendWs()

 

def toJson(message):

    jsonString = json.dumps(message, ensure_ascii=False).encode('utf8')

    return jsonString

 

def get_data(num):

 

    json_path = '/root/client_send/json/api/inference/current_tracking_'+str(num)+'.json'

    img_path = '/root/client_send/images/cam/cam ('+str(num)+').jpg'

    #json_path = '/home/star/generator/images/screenshots/conference.jpg'

    with open(json_path, 'rb') as single_json:

        json_text = single_json.read()

    with open(img_path, 'rb') as single_img:

        img_b64 = base64.b64encode(single_img.read())

 

    json_text = "{\"api-type\": \"inference\", \"current_tracking\":" + json_text + ", \"img\" : \"" + img_b64 + "\"}"

    print(json_text)

    return json_text

 

 

def main():

    type_num = 1

    while type_num <= 21:

 

        tmpString = get_data(type_num)

        print(tmpString)

        grpc_sender.grpcSend(tmpString)

        type_num = type_num+1

 

        time.sleep(2)

 

if __name__ == '__main__':

    print('start')

    main()

    print('end')

 

 

current_tracking_1.json (샘플 json 데이터)

{

    "time": "2018-10-19T14:45:04.080163+09:00",

    "state_name": "daily_ready",

    "status": null,

    "state_id": 140001861004480,

    "intent": "unknown",

    "slots": null,

    "state_group": "ready",

    "domain": "Daily",

    "state_tag": "Daily.ready.daily_ready.Ready",

    "stance": "neutral",

    "speech": "안녕",

    "subject": null

}

 

 

 

cam (1).jpg (샘플 이미지 데이터)

 


 

V.    서버 코드


l  app_grpc.js (주요 핵심 코드)


/*  proto파일에서 service descriptors 로드    */

var PROTO_PATH = __dirname + '/protobuf/json.proto';

var grpc = require('grpc');

var protoLoader = require('@grpc/proto-loader');

// Suggested options for similarity to existing grpc.load behavior

var packageDefinition = protoLoader.loadSync(

    PROTO_PATH,

    {keepCase: true,

     longs: String,

     enums: String,

     defaults: true,

     oneofs: true

    });

var protoDescriptor = grpc.loadPackageDefinition(packageDefinition);

// The protoDescriptor object has the full package hierarchy

var json = protoDescriptor.json;

/*  proto파일에서 service descriptors 로드 end    */

 

 

 

 

function grpcSend(call, callback) {

  //sendWS(call.request.message);

  console.log(call.request.jsonStr);

  broadcast(call.request.jsonStr);

  callback(null, call.request);

}

function grpc_start() {

  var server = new grpc.Server();

  server.addService(json.Json.service, {grpcSend: grpcSend});

  server.bind('0.0.0.0:4996', grpc.ServerCredentials.createInsecure());

  server.start();

}

grpc_start();



 

VI.  통합 테스트

Receive서버 실행

node app_grpc.js

 

Send클라이언트 실행

python grpc_inference.py






 grpc 도 처음이지만, protobuf 라는 것을 처음 써보았다.


사용해본 바로는 Java의 SOAP 와 JNI 를 합친 느낌이었다.



 JNI 인터페이스 처럼 protobuf 인터페이스를 지정해서 언어에 맞는 전처리 작업을 해주고,


SOAP 처럼 gRPC도 원격으로 서버의 함수를 실행시키는 듯한 느낌을 주었다.


  

 웹 소켓으로 되어 있던 모듈을 grpc로 바꾸는 작업이었던 지라, 


웹 소켓과의 속도 비교도 할 수 있었는데, 약 1.2배정도 빠른 것을 확인할 수 있었다.  (63 kb 데이터)


'프로그래밍' 카테고리의 다른 글

이클립스 꿀팁  (0) 2016.02.12

+ Recent posts