Docker 내부 구조

https://koocci-dev.tistory.com/3

Docker 란?

https://medium.com/faun/docker-containerd-standalone-runtimes-heres-what-you-should-know-b834ef155426

Namespace 란? (리눅스)

  • 한덩어리의 데이터에 이름을 붙혀 충돌 가능성을 줄이고, 쉽게 참조할 수 있게하는 개념.

Linux 커널의 namespace 기능은 Linux의 오브젝트에 이름을 붙임으로써 다음과 같은 6개의 독립된 환경을 구축할 수 있다.

  1. PID namespace
    • 프로세스에 할당된 고유한 ID를 말하며 이를 통해 프로세스를 격리할 수 있다
    • namespace가 다른 프로세스 끼리는 서로 액세스할 수 없다
  2. Network namespace
    • 네트워크 디바이스, IP 주소, Port 번호, 라우팅 테이블, 필터링테이블 등의 네트워크 리소스를 namespace마다 격리시켜 독립적으로 가질 수 있다. 이 기능을 이용하면 OS 상에서 사용중인 Port가 있더라도 컨테이너 안에서 동일한 Port를 사용 가능하다.
  3. UID namespace
    • UID, GID를 namespace 별로 독립적으로 가질 수 있도록 한다.
    • namespace 안과 호스트 OS 상에서 서로 다른 UID, GID를 가질 수 있다.
  4. Mount namespace
    • 호스트 OS와 namespace가 서로 다른 격리된 파일시스템 트리를 가질 수 있도록 한다 (마운트는 컴퓨터에 연결된 기기나 기억장치를 OS에 인식시켜 사용가능한 상태로 만드는 것을 의미한다)
  5. UTS namespace
    • namespace 별로 호스트명이나 도메인 명을 독자적으로 가질 수 있다
  6. IPC namespace
    • 프로세스간 통신(IPC) 오브젝트를 namespace 별로 독립적으로 가질 수 있다

cGroups 란?

  • 리눅스의 프로세스는 하나 이상의 스레드 모음으로 동작한다. cGroups는 프로세스와 스레드를 그룹화하여 그 그룹안에 존재하는 프로세스와 스레드에 대한 관리를 수행하기 위한 기능이다. 예를 들어 호스트 OS의 CPU나 메모리와 같은 자원에 대해 그룹별로 제한을 둘 수 있다.
  • cGroups로 컨테이너 안의 프로세스에 대해 자원을 제한 함으로써 특정 컨테이너가 호스트 OS의 자원을 모두 사용하는 일을 막는다.

cGroups 서브 시스템

  1. CPU
    • CPU 사용량 제한
  2. CPUacct
    • CPU 사용량 통계
  3. CPUset
    • CPU나 메모리 배치를 제어
  4. memory
    • 메모리 사용량 제한
  5. devices
  • 디바이스 엑세스 허가/ 거부
  1. freezer
    • 그룹에 속한 프로세스 정지/ 재개
  2. net_cls
    • 네트워크 제어 태그를 부가
  3. blkio
    • 블록 디바이스 입출력량 제어

CRI(Container Runtime Interface )

그래서, kubelet의 코드를 수정하지 않고, 다양한 컨테이너 런타임을 지원하기 위해서, kubelet과 컨테이너 런타임 사이의 인터페이스를 통일화하는 스펙이 등장하였는데, 이것이 CRI (Container Runtime Interface)이다. 컨테이너의 생성,삭제 등의 생명 주기를 관리하는 스펙으로 gRPC 기반의 API 스펙으로 되어 있고, 새로운 컨테이너 런타임은 CRI 스펙에 맞춰서 CRI 컴포넌트를 구현하면 되는 구조가 되었다.

출처: https://bcho.tistory.com/1353 [조대협의 블로그]

OCI (Open Container Initiative)

그런데, 지원되는 컨테이너의 종류가 계속해서 늘어가고 있고, 그때마다, CRI를 다시 구현해야 하는 문제가 생김에 따라 컨테이너 런타임 자체를 표준화하고자 하는 노력이 있었는데, 그로 인해서 정해진 스펙이 OCI (Open Container Initiative) 이다. OCI 스펙을 맞춰서 구현된 컨테이너 런타임을 별도의 CRI 구현이 없이 OCI를 지원하는 CRI 구현체에 의해서 관리가 가능해진다. OCI 스펙에 따른 컨테이너 런타임을 관리하는 CRI 컴포넌트는 CRI-O 라는 컴포넌트로 구현되어 있다. 즉 OCI 스펙을 준수한다면, CRI-O를 통해서 kubelet으로 부터 명령을 받을 수 있는 구조가 된다.

출처: https://bcho.tistory.com/1353 [조대협의 블로그]

Containerd ?

runC를 제어하는 데몬으로 Docker engine에 내장. containerd는 업계 표준 컨테이너 런타임이며, 전체 컨테이너 life cycle(이미지 전송 및 저장, 컨테이너 실행 및 관리, low-level 저장 및 네트워크 첨부 등)을 관리 할 수 있다. runC를 활용하여 체크 포인트 및 복원, seccomp 및 userspace 지원과 같은 고급 기능을 제공한다.

Containerd 내 gRPC 모듈

  • containerd:shim
    • 컨테이너를 위한 IO 를 다루는 프로세스
  • containerd:execution
    • 컨테이너 생성 및 정보 획득을 위한 단순한 API
  • containerd:rootfs
    • 다운로드된 이미지를 압축 해제하고, 레이어 집합으로부터 루트 파일시스템을 준비한다. Mounts는 생성할 마운트 리스트를 반환한다.
  • containerd:content
    • 콘텐츠 주소 지정 저장소, Content는 요약(content hash)를 통해 식별된다. Status는 진행중인 write 트랜잭션의 상태를 제공한다.

Container Runtime Shim?

컨테이너 런타임 shim 은 컨테이너 관리자 ( containerd , cri-o , podman ) 와 컨테이너 런타임 ( runc , crun ) 사이에 상주하여 이러한 대응 물의 통합 문제를 해결하는 소프트웨어입니다.

  1. Docker (container) 의 작동 원리:
    1) namespaces
    2) cgroups
  2. cgroups
    • 메모리, CPU, I/O, 네트워크, device 노드(/dev/) 제어
  3. namespaces
    • 종류: mnt, uts, ipc, pid, net, user
    • namespace 사용법

      ps aux

      nsenter //cgroup 에 들어가지 않음. ㄹ소스 제한 영향 안 받음

      docker exec //cgroup 에 들어감. 리소스 제한 영향 받음

      cgcreate -a ssut -g memory:testgrp //ssut 유저 소유

      ls -alh /sys/fs/cgroup/memory/testgrp/ // /sys/fs/cgroup/{리소스}/{그룹이름}

      echo 2000000 > /sys/fs/cgroup/memory/testgrp/memory.kmem.limit_in_bytes //최대메모리 2MB

      cgexec -g memory:testgrp bash // bash 를 testgrp 그룹에 의해 제한 실행

    • unshare --fork --pid --mount-proc bash
  4. 런타임
    • lxc, libcontainer, runc
    • cgroup, namespaces 를 표준으로 정의해둔 OCI(Open Container Initative) 스펙을 구현한 컨테이너 기술의 구현체
      1) lxc : canonical 이 지원하는 프로젝트
      2) docker 에서의 runtime : lxc > libcontainer > runC(libcontainer 의 리팩토링 구현체) 로 자체 구현체를 갖게 됨.
  5. Docker 의 Process
                      Docker Engine
                                |
                          containerd
                                |
    |------------------------------|--------------------------|
    containerd-shim containerd-shim containerd-shim
    | | |
    runc runc runc
    • Docker-engine 과 containerd 완전히 분리
    • Docker engine 버전 올릴 때, 재시작해도 container 의 재시작 없이 사용할 수 있게 됩니다.
    • 4개의 독립적인 Process

      ps aux | grep docker

      docker
      docker-containerd
      docker-containerd-shim
      docker-runc
  6. 2) Docker Process 별 역할
    a) containerd : OCI 구현체(주로 runC) 를 이용해 container 관리하는 daemon
    b) Docker engine : 이미지,네트워크,디스크 등의 관리 역할
  7. 1) 구성도

출처: https://2infinity.tistory.com/46 [Learn and Run]

크롬의 설정 파일을 변경하여 특정 확장자 파일을 자동 실행할 수 있습니다.
오피스, pdf 등의 파일을 바로 열고 싶은 업무 환경에서 사용하면 유용할 듯 합니다.
방법은 아래와 같습니다.

  1. 먼저 실행 중인 크롬 브라우저를 닫습니다.

  2. cmd 창을 실행합니다.

  3. 아래 명령어를 그대로 실행합니다. 크롬 카나리를 사용하시는 분은 Chrome 대신 Chrome SxS 경로를 입력해야 합니다.

    • cd %HOMEPATH%\AppData\Local\Google\Chrome\User Data\Default
    • notepad Preferences
  4. 열린 편집창에서 download 부분을 찾아서 "extensions_to_open":"doc:docx:xls:xlsx:ppt:pptx:pdf" 를 추가해줍니다.

    • "download":{"directory_upgrade":true} -> "download":{"directory_upgrade":true,"extensions_to_open":"doc:docx:xls:xlsx:ppt:pptx:pdf"}
  5. 크롬을 실행하여 pdf, office 문서를 열어봅니다.


[부록] 자동 실행 해제 방법

  • 크롬에서 설정 -> 고급 -> 다운로드 순으로 이동하여 '다운로드 후에 특정 파일 형식을 자동으로 열기' 를 삭제하면 됩니다. (삭제할 경우 해당 옵션이 나타나지 않습니다.)

Docker Hub 에서 기본으로 제공되는 Docker Container 에서는 Docker 데몬 서비스를 실행 할 수 없습니다.
대신 추가로 제공되는 DinD 버전을 이용하거나, Docker socker 을 공유하는 방법으로 컨테이너 내에서 컨테이너를 실행할 수 있습니다.
아래는 두가지 방법 중 Docker Socket 을 Host 와 공유하는 방법입니다.


원리는 다음과 같습니다.
Docker Container 에서도 Host에서의 Docker Daemon 에 접근하여 컨테이너를 생성하도록 합니다.
즉, 컨테이너 내부에서 또다른 컨테이너를 만드는 명령어를 실행하지만 실제로는 Host 에서 컨테이너를 생성하는 것입니다.

컨테이너를 생성할 때 '/var/run/docker.sock' 볼륨을 공유하도록 생성한 뒤, docker.io 를 설치하여 명령어를 실행하면 됩니다.
아래는 코드입니다.

docker run -ti -v /var/run/docker.sock:/var/run/docker.sock docker

실제로 컨테이너 생성 명령을 내리는 곳은 Host 라는 것을 명심하여야 합니다.
컨테이너 내부에서 띄운 컨테이너 목록을 마찬가지로 Host 에서도 확인할 수 있습니다.

출처 : https://itnext.io/docker-in-docker-521958d34efd

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


+ Recent posts