Deploying Hyperledger Fabric on Kubernetes.pptx

wonyong hwang
wonyong hwangProfessor à Korea Polytechnics
Deploying Hyperledger
Fabric 2.x on Kubernetes
-실습 참고 자료-
한국폴리텍대학 스마트금융과
황원용 교수
NFS
NFS 준비
• 서버 준비
- Virtual Box, 실서버 등 (OS: Ubuntu 20.04 or above)
NFS 설정
## NFS Server
1. sudo apt update
2. sudo apt install nfs-kernel-server
3. sudo mkdir -p /mnt/nfs_share
4. sudo chown -R nobody:nogroup /mnt/nfs_share/
5. sudo chmod 777 /mnt/nfs_share/
6. echo "/mnt/nfs_share *(rw,sync,no_subtree_check,insecure)" | sudo tee -a /etc/exports
7. sudo exportfs -a
8. sudo systemctl restart nfs-kernel-server
## NFS Client (Ubuntu)
1. sudo apt update
2. sudo apt install nfs-common
3. sudo mkdir -p /mnt/nfs_clientshare
4. sudo mount <IP>:/mnt/nfs_share /mnt/nfs_clientshare
5. ls -l /mnt/nfs_clientshare/
nfs-common 설치는 쿠버네티스 모든 노드에 설치해야 함!
CentOS에서는 yum install nfs-utils로 설치
참고 : pv나 pvc삭제시
kubectl delete pv/pv-name --grace-period=0 --force
kubectl delete pvc/pvc-name --grace-period=0 --force
NFS 설정
• PV 배포
• PVC 배포
• 테스트용 Pod 배포
인증서 생성
인증서 생성 관련 준비
인증서 유효기간 변경
- 전자서명 : 5년
- ca 인증서 : 10년
인증서 유효기간 변경
- 전자서명 : 5년
- ca 인증서 : 10년
인증서 생성 관련 준비
인증서 생성관련 파일을 NFS로 복사
chmod a+x /mnt/nfs_vb_share/scripts/*
cd /mnt/nfs_vb_share/
mkdir organizations
cp -r fabric-ca/ organizations/
인증서 생성 관련 준비 - fabric ca
ca-org1.yaml
① nfs 에 인증서 설정 yaml 이 있고, 이 경로를 pod의 subPath로 지정
② pod 기동 이후로, nfs 확인해 보면 pod의
/etc/Hyperledger/fabric-ca-server의 파일이 nfs로 mount됨을 확인
인증서 생성 관련 준비 - fabric ca
• k apply -f ca-org1.yaml
• k apply -f ca-org1-service.yaml
• k apply -f ca-org2.yaml
• k apply -f ca-org2-service.yaml
• k apply -f ca-orderer.yaml
• k apply -f ca-orderer-service.yaml
인증서 생성 관련 준비
• 인증서 생성 쉘 스크립트 준비하여 NFS 서버로 복사
• 인증서 생성 Job 실행
k apply -f job.yaml
실행 중 스토리지 부족 오류 발생 대처
예> VB에서 25GB의 공간을 VDI로 할당하였는데, 우부투에서
df –h 로 확인한 공간이 12GB로 절반이하로 할당된 상황
$ lvm
lvm> lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv
lvm> exit
$ resize2fs /dev/ubuntu-vg/ubuntu-lv
<Tip> 우분투에서 VirtualBox에서 할당한 공간보다
하드디스크 공간이 부족하게 잡히는 경우
인증서 생성 실행 결과 확인
channel-artifacts 생성
Anchor Peer 설정
준비
• 조직 정의(configtx.yaml) 파일 및 채널 생성 등 스크립트 NFS로 복사
실행
• k apply -f job.yaml
결과 확인
orderer 실행
Orderer 실행
• k apply -f .
configMap 설정
configMap 설정
• 체인코드 빌드에 사용할 config
• peer 컨테이너 실행에 사용할 config
• k apply -f builder-config.yaml
peer 실행
peer, peer-cli 실행
• k apply -f org1/
• k apply -f org2/
어플리케이션 채널 생성
• peer0 org1 cli 컨테이너에서...
./scripts/createAppChannel.sh
채널 조인
• 모든 peer cli 컨테이너에서...
peer channel join -b ./channel-artifacts/mychannel.block
• peer channel list
update anchor peer
• peer0 org1 cli 컨테이너에서...
./scripts/updateAnchorPeer.sh Org1MSP
• peer0 org2 cli 컨테이너에서...
./scripts/updateAnchorPeer.sh Org2MSP
Debugging
networking
issues with
multi-node
Kubernetes
on
VirtualBox
• 클러스터내에서 dns 조회가 안되는 현상
(예> ping orderer, nslookup orderer)
• 진단을 위한 pod 설치
진단은 https://kubernetes.io/docs/tasks/administer-
cluster/dns-debugging-resolution/ 를 참조
kubectl apply -f
https://k8s.io/examples/admin/dns/dnsutils.yaml
• 아래 명령에서 오류 확인
kubectl exec -i -t dnsutils -- nslookup kubernetes.default
• 해당 pod로 진입하여, nslookup 확인 (오류 확인)
kubectl exec -it dnsutils -- bash
nslookup kubernetes.default
• 원인
flannel이 Virtual Box의 NAT 인터페이스(enp0s3, 10.0.*.*)으로
네트워크 인터페이스를 사용하여 문제가 발생
 쿠버네티스 클러스터를 연결하는 Bridge 인터페이스(enp0s8,
192.168.56.*)을 사용하도록 설정해야 함
Debugging networking issues with
multi-node Kubernetes on VirtualBox
Deploying Hyperledger Fabric on Kubernetes.pptx
체인코드 준비 & 배포 준비
• 체인코드 준비 및 NFS 서버로 복사
• /mnt/nfs_clientshare/chaincode/basic/packaging
In packaging directory,
tar cfz code.tar.gz connection.json
tar cfz basic-org1.tgz code.tar.gz metadata.json
rm code.tar.gz
open connection.json & replace "basic-org1" with "basic-org2"
tar cfz code.tar.gz connection.json
tar cfz basic-org2.tgz code.tar.gz metadata.json
rm code.tar.gz
체인코드 설치
• In every cli Container,
cd /opt/gopath/src/github.com/chaincode/basic/packaging
peer lifecycle chaincode install basic-org<N>.tgz
체인코드 컨테이너 생성
Dockerfile을 통해 go 빌드하지 않고,
native 빌드를 해야 추후 컨테이너가
정상 작동한다.
go build -o chaincode -v .
Dockerfile
 go 빌드 결과
체인코드 컨테이너 생성
체인코드 Pod 생성 준비
• org<N>-chaincode-deployment.yaml 설정
이전 장에서 체인코드 설치한 결과로 받은 id값을 설정하고 org1-chaincode-deployment.yaml,
org2-chaincode-deployment.yaml 배포 k apply -f .
체인코드 approve
• peer0 org1 cli 컨테이너에서...
peer lifecycle chaincode approveformyorg -o orderer:7050 --channelID mychannel --name basic
--version 1.0 --package-id
basic:6e260574b04b921dbc4e680ae9ca9ab12075a1789580f68a3c9d94df19062839 --sequence 1 -
-tls --cafile $ORDERER_CA
• peer0 org2 cli 컨테이너에서...
peer lifecycle chaincode approveformyorg -o orderer:7050 --channelID mychannel --name basic
--version 1.0 --package-id
basic:7a1fac3fc6e3fdc20a46128468da4bc3e31f74f202086e9895b659fbe5a47a94 --sequence 1 --
tls --cafile $ORDERER_CA
※ 이전에 체인코드 설치하여 리턴받은 id를 입력해야 함!
체인코드 checkcommitreadiness
• 임의의 cli 컨테이너에서...
peer lifecycle chaincode checkcommitreadiness --channelID
mychannel --name basic --version 1.0 --sequence 1 -o -
orderer:7050 --tls --cafile $ORDERER_CA --output json
체인코드 commit
• 임의의 cli 컨테이너에서...
peer lifecycle chaincode commit -o orderer:7050 --channelID mychannel --name basic --version
1.0 --sequence 1 --tls true --cafile $ORDERER_CA --peerAddresses peer0-org1:7051 --
tlsRootCertFiles
/organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt --
peerAddresses peer0-org2:7051 --tlsRootCertFiles
/organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt
• commit 확인
peer lifecycle chaincode querycommitted -C mychannel
체인코드 테스트
• invoke
peer chaincode invoke -o orderer:7050 --tls true --cafile $ORDERER_CA -C mychannel -n basic -
-peerAddresses peer0-org1:7051 --tlsRootCertFiles
/organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt --
peerAddresses peer0-org2:7051 --tlsRootCertFiles
/organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt -c
'{"Args":["CreateAsset","asset100","red","50","tom","300"]}' --waitForEvent
체인코드 테스트
• query
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
[참고] 체인코드 업그레이드
• 흐름
체인코드 cli 컨테이너를 통해서 peer에 설치
실제 체인코드 pod를 생성(from docker hub)
체인코드 approve 및 commit
• 업그레이드(1.0  2.0)
2.0 체인코드 cli 컨테이너를 통해서 peer에 설치
2.0 체인코드 pod를 새로 생성하여 docker push
2.0 체인코드 approve 및 commit
CouchDB
미입력시 랜덤 포트 배정
start 버튼 클릭시
couchdb 조회를 위한 브라우저 자동 접속
CouchDB 조회
rest-api-go 설치
rest-api-go 컨테이너 빌드
기 생성된 인증서 중 org2.fmd.com 만 nfs로 부터 복사하여
도커 빌드할 서버의 소스 디렉토리에 위치 시킨다.
main.go를 빌드하여 restsvc 실행파일을 생성한다.
go build -o restsvc -v .
도커 빌드를 한다. Dockerfile는 좌측과 같다.
docker build --no-cache -t wyhwang/basic-rest-svc:5.0 .
테스트 하고 push한다.
docker run wyhwang/basic-rest-svc:5.0
docker push wyhwang/basic-rest-svc:5.0
pod 및 service 생성
k apply -f .
peer 버전 변경
• 변경 사유
rest-api-go 컨테이너는 Fabric Gateway 서비스를 사용하여 peer와 통신한다.
이 Gateway서비스는 fabric peer 2.4 이상부터 지원한다.
peer 버전 변경 후, 다시 적용한다.
peer 가 시작되고 약간의 시간(몇 분)이 지나면 g/w에서 정상응답이 가능하다.
외부 접속은 4000번 포트로 지정하고 테스트 준비
테스트
테스트
rest-api-go 컨테이너
외부변수 주입
MSP 및 인증서 등의 변수를 pod로 부터 전달받을 수 있도록 컨테이너를 수정한다.
소스 파일 변경 및 빌드
기 생성된 인증서 중 org2.fmd.com 만 nfs로 부터 복사하여
도커 빌드할 서버의 소스 디렉토리에 위치 시킨다.
main.go를 빌드하여 restsvc 실행파일을 생성한다.
go build -o restsvc -v .
도커 빌드를 한다. Dockerfile는 좌측과 같다.
docker build --no-cache -t wyhwang/basic-rest-svc:6.0 .
Dockerfile
컨테이너 테스트
테스트 하고 push한다.
- 테스트는 외부 환경 변수를 아래와 같이 설정하여 시뮬레이션 한다.
push한다.
docker push wyhwang/basic-rest-svc:6.0
pod 수정
테스트
hyperledger
explorer
인증서 준비
• config map에서 사용할 개인키를 준비
chmod 777 priv_sk
준비
• 컨피크맵 설정
k apply -f configmap.yaml
• k apply -f explorerdb.yaml
• k apply -f explorer.yaml
포트 포워딩
외부 접속 8080번 포트로 지정하고
테스트 준비
결과 확인
Thank you
1 sur 60

Recommandé

[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축 par
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축Ji-Woong Choi
4.6K vues55 diapositives
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker par
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 Docker
XECon2015 :: [1-5] 김훈민 - 서버 운영자가 꼭 알아야 할 DockerXpressEngine
2K vues68 diapositives
[1A6]Docker로 보는 서버 운영의 미래 par
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래NAVER D2
25.1K vues133 diapositives
Kafka slideshare par
Kafka   slideshareKafka   slideshare
Kafka slidesharewonyong hwang
372 vues128 diapositives
KAFKA 3.1.0.pdf par
KAFKA 3.1.0.pdfKAFKA 3.1.0.pdf
KAFKA 3.1.0.pdfwonyong hwang
140 vues252 diapositives
F5 container ingress_service_in_kuernetes_with_calico_cni_by_duck_in_korea par
F5 container ingress_service_in_kuernetes_with_calico_cni_by_duck_in_koreaF5 container ingress_service_in_kuernetes_with_calico_cni_by_duck_in_korea
F5 container ingress_service_in_kuernetes_with_calico_cni_by_duck_in_koreaInfraEngineer
395 vues19 diapositives

Contenu connexe

Similaire à Deploying Hyperledger Fabric on Kubernetes.pptx

하이퍼레저 패브릭 실습자료 par
하이퍼레저 패브릭 실습자료하이퍼레저 패브릭 실습자료
하이퍼레저 패브릭 실습자료TIMEGATE
3.9K vues66 diapositives
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기 par
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
2.5K vues155 diapositives
Red Hat OpenStack 17 저자직강+스터디그룹_2주차 par
Red Hat OpenStack 17 저자직강+스터디그룹_2주차Red Hat OpenStack 17 저자직강+스터디그룹_2주차
Red Hat OpenStack 17 저자직강+스터디그룹_2주차Nalee Jang
275 vues44 diapositives
PCF Installation Guide par
PCF Installation GuidePCF Installation Guide
PCF Installation Guideseungdon Choi
894 vues48 diapositives
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트 par
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트Ji-Woong Choi
10.6K vues29 diapositives
1908 Hyperledger Fabric 소개 및 첫 네트워크 구축하기 par
1908 Hyperledger Fabric 소개 및 첫 네트워크 구축하기1908 Hyperledger Fabric 소개 및 첫 네트워크 구축하기
1908 Hyperledger Fabric 소개 및 첫 네트워크 구축하기Hyperledger Korea User Group
1.3K vues40 diapositives

Similaire à Deploying Hyperledger Fabric on Kubernetes.pptx(20)

하이퍼레저 패브릭 실습자료 par TIMEGATE
하이퍼레저 패브릭 실습자료하이퍼레저 패브릭 실습자료
하이퍼레저 패브릭 실습자료
TIMEGATE3.9K vues
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기 par Chanwoong Kim
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
Chanwoong Kim2.5K vues
Red Hat OpenStack 17 저자직강+스터디그룹_2주차 par Nalee Jang
Red Hat OpenStack 17 저자직강+스터디그룹_2주차Red Hat OpenStack 17 저자직강+스터디그룹_2주차
Red Hat OpenStack 17 저자직강+스터디그룹_2주차
Nalee Jang275 vues
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트 par Ji-Woong Choi
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
[오픈소스컨설팅] Docker를 활용한 Gitlab CI/CD 구성 테스트
Ji-Woong Choi10.6K vues
JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기 par Ted Won
JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기
JCO 11th 클라우드 환경에서 Java EE 운영 환경 구축하기
Ted Won1.9K vues
Openstack live migration par ymtech
Openstack live migrationOpenstack live migration
Openstack live migration
ymtech3.3K vues
도커없이 컨테이너 만들기 1편 par Sam Kim
도커없이 컨테이너 만들기 1편도커없이 컨테이너 만들기 1편
도커없이 컨테이너 만들기 1편
Sam Kim1.8K vues
OpenStack DevStack Install - 2부 (Multi-nodes) par Ian Choi
OpenStack DevStack Install - 2부 (Multi-nodes)OpenStack DevStack Install - 2부 (Multi-nodes)
OpenStack DevStack Install - 2부 (Multi-nodes)
Ian Choi2.6K vues
docker on GCE ( JIRA & Confluence ) - GDG Korea Cloud par Jude Kim
docker on GCE ( JIRA & Confluence ) - GDG Korea Clouddocker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
docker on GCE ( JIRA & Confluence ) - GDG Korea Cloud
Jude Kim2.3K vues
20141029 하둡2.5와 hive설치 및 예제 par Tae Young Lee
20141029 하둡2.5와 hive설치 및 예제20141029 하둡2.5와 hive설치 및 예제
20141029 하둡2.5와 hive설치 및 예제
Tae Young Lee32.5K vues
postgres_빌드_및_디버깅.pdf par Lee Dong Wook
postgres_빌드_및_디버깅.pdfpostgres_빌드_및_디버깅.pdf
postgres_빌드_및_디버깅.pdf
Lee Dong Wook158 vues
[오픈소스컨설팅]Docker on Kubernetes v1 par Ji-Woong Choi
[오픈소스컨설팅]Docker on Kubernetes v1[오픈소스컨설팅]Docker on Kubernetes v1
[오픈소스컨설팅]Docker on Kubernetes v1
Ji-Woong Choi4.4K vues
caanoo Ernice par jumiss
caanoo Ernicecaanoo Ernice
caanoo Ernice
jumiss669 vues
Kubernetes on Premise Practical Guide par Chan Shik Lim
Kubernetes on Premise Practical GuideKubernetes on Premise Practical Guide
Kubernetes on Premise Practical Guide
Chan Shik Lim4.1K vues
Internship backend par Yein Sim
Internship backendInternship backend
Internship backend
Yein Sim120 vues

Plus de wonyong hwang

Hyperledger Explorer.pptx par
Hyperledger Explorer.pptxHyperledger Explorer.pptx
Hyperledger Explorer.pptxwonyong hwang
18 vues10 diapositives
하이퍼레저 페이지 단위 블록 조회 par
하이퍼레저 페이지 단위 블록 조회하이퍼레저 페이지 단위 블록 조회
하이퍼레저 페이지 단위 블록 조회wonyong hwang
8 vues15 diapositives
토큰 증권 개요.pptx par
토큰 증권 개요.pptx토큰 증권 개요.pptx
토큰 증권 개요.pptxwonyong hwang
73 vues10 diapositives
Vue.js 기초 실습.pptx par
Vue.js 기초 실습.pptxVue.js 기초 실습.pptx
Vue.js 기초 실습.pptxwonyong hwang
8 vues83 diapositives
k8s practice 2023.pptx par
k8s practice 2023.pptxk8s practice 2023.pptx
k8s practice 2023.pptxwonyong hwang
57 vues69 diapositives
HyperLedger Fabric V2.5.pdf par
HyperLedger Fabric V2.5.pdfHyperLedger Fabric V2.5.pdf
HyperLedger Fabric V2.5.pdfwonyong hwang
362 vues170 diapositives

Plus de wonyong hwang(20)

하이퍼레저 페이지 단위 블록 조회 par wonyong hwang
하이퍼레저 페이지 단위 블록 조회하이퍼레저 페이지 단위 블록 조회
하이퍼레저 페이지 단위 블록 조회
wonyong hwang8 vues
Ngrok을 이용한 Nginx Https 적용하기.pptx par wonyong hwang
Ngrok을 이용한 Nginx Https 적용하기.pptxNgrok을 이용한 Nginx Https 적용하기.pptx
Ngrok을 이용한 Nginx Https 적용하기.pptx
wonyong hwang172 vues
Kafka JDBC Connect Guide(Postgres Sink).pptx par wonyong hwang
Kafka JDBC Connect Guide(Postgres Sink).pptxKafka JDBC Connect Guide(Postgres Sink).pptx
Kafka JDBC Connect Guide(Postgres Sink).pptx
wonyong hwang66 vues
Nginx Reverse Proxy with Kafka.pptx par wonyong hwang
Nginx Reverse Proxy with Kafka.pptxNginx Reverse Proxy with Kafka.pptx
Nginx Reverse Proxy with Kafka.pptx
wonyong hwang484 vues
Kafka monitoring using Prometheus and Grafana par wonyong hwang
Kafka monitoring using Prometheus and GrafanaKafka monitoring using Prometheus and Grafana
Kafka monitoring using Prometheus and Grafana
wonyong hwang250 vues
App development with quasar (pdf) par wonyong hwang
App development with quasar (pdf)App development with quasar (pdf)
App development with quasar (pdf)
wonyong hwang1K vues
Hyperledger Fabric practice (v2.0) par wonyong hwang
Hyperledger Fabric practice (v2.0) Hyperledger Fabric practice (v2.0)
Hyperledger Fabric practice (v2.0)
wonyong hwang1.1K vues
Hyperledger fabric practice(pdf) par wonyong hwang
Hyperledger fabric practice(pdf)Hyperledger fabric practice(pdf)
Hyperledger fabric practice(pdf)
wonyong hwang252 vues
BlockChain implementation by python par wonyong hwang
BlockChain implementation by pythonBlockChain implementation by python
BlockChain implementation by python
wonyong hwang325 vues

Deploying Hyperledger Fabric on Kubernetes.pptx

  • 1. Deploying Hyperledger Fabric 2.x on Kubernetes -실습 참고 자료- 한국폴리텍대학 스마트금융과 황원용 교수
  • 2. NFS
  • 3. NFS 준비 • 서버 준비 - Virtual Box, 실서버 등 (OS: Ubuntu 20.04 or above)
  • 4. NFS 설정 ## NFS Server 1. sudo apt update 2. sudo apt install nfs-kernel-server 3. sudo mkdir -p /mnt/nfs_share 4. sudo chown -R nobody:nogroup /mnt/nfs_share/ 5. sudo chmod 777 /mnt/nfs_share/ 6. echo "/mnt/nfs_share *(rw,sync,no_subtree_check,insecure)" | sudo tee -a /etc/exports 7. sudo exportfs -a 8. sudo systemctl restart nfs-kernel-server ## NFS Client (Ubuntu) 1. sudo apt update 2. sudo apt install nfs-common 3. sudo mkdir -p /mnt/nfs_clientshare 4. sudo mount <IP>:/mnt/nfs_share /mnt/nfs_clientshare 5. ls -l /mnt/nfs_clientshare/ nfs-common 설치는 쿠버네티스 모든 노드에 설치해야 함! CentOS에서는 yum install nfs-utils로 설치 참고 : pv나 pvc삭제시 kubectl delete pv/pv-name --grace-period=0 --force kubectl delete pvc/pvc-name --grace-period=0 --force
  • 5. NFS 설정 • PV 배포 • PVC 배포 • 테스트용 Pod 배포
  • 7. 인증서 생성 관련 준비 인증서 유효기간 변경 - 전자서명 : 5년 - ca 인증서 : 10년 인증서 유효기간 변경 - 전자서명 : 5년 - ca 인증서 : 10년
  • 8. 인증서 생성 관련 준비 인증서 생성관련 파일을 NFS로 복사 chmod a+x /mnt/nfs_vb_share/scripts/* cd /mnt/nfs_vb_share/ mkdir organizations cp -r fabric-ca/ organizations/
  • 9. 인증서 생성 관련 준비 - fabric ca ca-org1.yaml ① nfs 에 인증서 설정 yaml 이 있고, 이 경로를 pod의 subPath로 지정 ② pod 기동 이후로, nfs 확인해 보면 pod의 /etc/Hyperledger/fabric-ca-server의 파일이 nfs로 mount됨을 확인
  • 10. 인증서 생성 관련 준비 - fabric ca • k apply -f ca-org1.yaml • k apply -f ca-org1-service.yaml • k apply -f ca-org2.yaml • k apply -f ca-org2-service.yaml • k apply -f ca-orderer.yaml • k apply -f ca-orderer-service.yaml
  • 11. 인증서 생성 관련 준비 • 인증서 생성 쉘 스크립트 준비하여 NFS 서버로 복사 • 인증서 생성 Job 실행 k apply -f job.yaml
  • 12. 실행 중 스토리지 부족 오류 발생 대처 예> VB에서 25GB의 공간을 VDI로 할당하였는데, 우부투에서 df –h 로 확인한 공간이 12GB로 절반이하로 할당된 상황 $ lvm lvm> lvextend -l +100%FREE /dev/ubuntu-vg/ubuntu-lv lvm> exit $ resize2fs /dev/ubuntu-vg/ubuntu-lv <Tip> 우분투에서 VirtualBox에서 할당한 공간보다 하드디스크 공간이 부족하게 잡히는 경우
  • 13. 인증서 생성 실행 결과 확인
  • 15. 준비 • 조직 정의(configtx.yaml) 파일 및 채널 생성 등 스크립트 NFS로 복사
  • 16. 실행 • k apply -f job.yaml 결과 확인
  • 18. Orderer 실행 • k apply -f .
  • 20. configMap 설정 • 체인코드 빌드에 사용할 config • peer 컨테이너 실행에 사용할 config • k apply -f builder-config.yaml
  • 22. peer, peer-cli 실행 • k apply -f org1/ • k apply -f org2/
  • 23. 어플리케이션 채널 생성 • peer0 org1 cli 컨테이너에서... ./scripts/createAppChannel.sh
  • 24. 채널 조인 • 모든 peer cli 컨테이너에서... peer channel join -b ./channel-artifacts/mychannel.block • peer channel list
  • 25. update anchor peer • peer0 org1 cli 컨테이너에서... ./scripts/updateAnchorPeer.sh Org1MSP • peer0 org2 cli 컨테이너에서... ./scripts/updateAnchorPeer.sh Org2MSP
  • 26. Debugging networking issues with multi-node Kubernetes on VirtualBox • 클러스터내에서 dns 조회가 안되는 현상 (예> ping orderer, nslookup orderer) • 진단을 위한 pod 설치 진단은 https://kubernetes.io/docs/tasks/administer- cluster/dns-debugging-resolution/ 를 참조 kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml • 아래 명령에서 오류 확인 kubectl exec -i -t dnsutils -- nslookup kubernetes.default • 해당 pod로 진입하여, nslookup 확인 (오류 확인) kubectl exec -it dnsutils -- bash nslookup kubernetes.default • 원인 flannel이 Virtual Box의 NAT 인터페이스(enp0s3, 10.0.*.*)으로 네트워크 인터페이스를 사용하여 문제가 발생  쿠버네티스 클러스터를 연결하는 Bridge 인터페이스(enp0s8, 192.168.56.*)을 사용하도록 설정해야 함
  • 27. Debugging networking issues with multi-node Kubernetes on VirtualBox
  • 29. 체인코드 준비 & 배포 준비 • 체인코드 준비 및 NFS 서버로 복사 • /mnt/nfs_clientshare/chaincode/basic/packaging In packaging directory, tar cfz code.tar.gz connection.json tar cfz basic-org1.tgz code.tar.gz metadata.json rm code.tar.gz open connection.json & replace "basic-org1" with "basic-org2" tar cfz code.tar.gz connection.json tar cfz basic-org2.tgz code.tar.gz metadata.json rm code.tar.gz
  • 30. 체인코드 설치 • In every cli Container, cd /opt/gopath/src/github.com/chaincode/basic/packaging peer lifecycle chaincode install basic-org<N>.tgz
  • 31. 체인코드 컨테이너 생성 Dockerfile을 통해 go 빌드하지 않고, native 빌드를 해야 추후 컨테이너가 정상 작동한다. go build -o chaincode -v . Dockerfile  go 빌드 결과
  • 33. 체인코드 Pod 생성 준비 • org<N>-chaincode-deployment.yaml 설정 이전 장에서 체인코드 설치한 결과로 받은 id값을 설정하고 org1-chaincode-deployment.yaml, org2-chaincode-deployment.yaml 배포 k apply -f .
  • 34. 체인코드 approve • peer0 org1 cli 컨테이너에서... peer lifecycle chaincode approveformyorg -o orderer:7050 --channelID mychannel --name basic --version 1.0 --package-id basic:6e260574b04b921dbc4e680ae9ca9ab12075a1789580f68a3c9d94df19062839 --sequence 1 - -tls --cafile $ORDERER_CA • peer0 org2 cli 컨테이너에서... peer lifecycle chaincode approveformyorg -o orderer:7050 --channelID mychannel --name basic --version 1.0 --package-id basic:7a1fac3fc6e3fdc20a46128468da4bc3e31f74f202086e9895b659fbe5a47a94 --sequence 1 -- tls --cafile $ORDERER_CA ※ 이전에 체인코드 설치하여 리턴받은 id를 입력해야 함!
  • 35. 체인코드 checkcommitreadiness • 임의의 cli 컨테이너에서... peer lifecycle chaincode checkcommitreadiness --channelID mychannel --name basic --version 1.0 --sequence 1 -o - orderer:7050 --tls --cafile $ORDERER_CA --output json
  • 36. 체인코드 commit • 임의의 cli 컨테이너에서... peer lifecycle chaincode commit -o orderer:7050 --channelID mychannel --name basic --version 1.0 --sequence 1 --tls true --cafile $ORDERER_CA --peerAddresses peer0-org1:7051 -- tlsRootCertFiles /organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt -- peerAddresses peer0-org2:7051 --tlsRootCertFiles /organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt • commit 확인 peer lifecycle chaincode querycommitted -C mychannel
  • 37. 체인코드 테스트 • invoke peer chaincode invoke -o orderer:7050 --tls true --cafile $ORDERER_CA -C mychannel -n basic - -peerAddresses peer0-org1:7051 --tlsRootCertFiles /organizations/peerOrganizations/org1.fmd.com/peers/peer0.org1.fmd.com/tls/ca.crt -- peerAddresses peer0-org2:7051 --tlsRootCertFiles /organizations/peerOrganizations/org2.fmd.com/peers/peer0.org2.fmd.com/tls/ca.crt -c '{"Args":["CreateAsset","asset100","red","50","tom","300"]}' --waitForEvent
  • 38. 체인코드 테스트 • query peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
  • 39. [참고] 체인코드 업그레이드 • 흐름 체인코드 cli 컨테이너를 통해서 peer에 설치 실제 체인코드 pod를 생성(from docker hub) 체인코드 approve 및 commit • 업그레이드(1.0  2.0) 2.0 체인코드 cli 컨테이너를 통해서 peer에 설치 2.0 체인코드 pod를 새로 생성하여 docker push 2.0 체인코드 approve 및 commit
  • 41. 미입력시 랜덤 포트 배정 start 버튼 클릭시 couchdb 조회를 위한 브라우저 자동 접속
  • 44. rest-api-go 컨테이너 빌드 기 생성된 인증서 중 org2.fmd.com 만 nfs로 부터 복사하여 도커 빌드할 서버의 소스 디렉토리에 위치 시킨다. main.go를 빌드하여 restsvc 실행파일을 생성한다. go build -o restsvc -v . 도커 빌드를 한다. Dockerfile는 좌측과 같다. docker build --no-cache -t wyhwang/basic-rest-svc:5.0 . 테스트 하고 push한다. docker run wyhwang/basic-rest-svc:5.0 docker push wyhwang/basic-rest-svc:5.0
  • 45. pod 및 service 생성 k apply -f .
  • 46. peer 버전 변경 • 변경 사유 rest-api-go 컨테이너는 Fabric Gateway 서비스를 사용하여 peer와 통신한다. 이 Gateway서비스는 fabric peer 2.4 이상부터 지원한다. peer 버전 변경 후, 다시 적용한다. peer 가 시작되고 약간의 시간(몇 분)이 지나면 g/w에서 정상응답이 가능하다.
  • 47. 외부 접속은 4000번 포트로 지정하고 테스트 준비
  • 50. rest-api-go 컨테이너 외부변수 주입 MSP 및 인증서 등의 변수를 pod로 부터 전달받을 수 있도록 컨테이너를 수정한다.
  • 51. 소스 파일 변경 및 빌드 기 생성된 인증서 중 org2.fmd.com 만 nfs로 부터 복사하여 도커 빌드할 서버의 소스 디렉토리에 위치 시킨다. main.go를 빌드하여 restsvc 실행파일을 생성한다. go build -o restsvc -v . 도커 빌드를 한다. Dockerfile는 좌측과 같다. docker build --no-cache -t wyhwang/basic-rest-svc:6.0 . Dockerfile
  • 52. 컨테이너 테스트 테스트 하고 push한다. - 테스트는 외부 환경 변수를 아래와 같이 설정하여 시뮬레이션 한다. push한다. docker push wyhwang/basic-rest-svc:6.0
  • 56. 인증서 준비 • config map에서 사용할 개인키를 준비 chmod 777 priv_sk
  • 57. 준비 • 컨피크맵 설정 k apply -f configmap.yaml • k apply -f explorerdb.yaml • k apply -f explorer.yaml
  • 58. 포트 포워딩 외부 접속 8080번 포트로 지정하고 테스트 준비

Notes de l'éditeur

  1. https://vnvn31.tistory.com/entry/kubernetes-nfs-you-might-need-a-sbinmounttype-helper-program-error-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95
  2. apiVersion: v1 kind: Pod metadata: name: task-pv-pod labels: app: task-pv spec: containers: - name: task-pv-container image: nginx resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" ports: - containerPort: 80 volumeMounts: - mountPath: /usr/share/nginx/html/ name: myvolume volumes: - name: myvolume persistentVolumeClaim: claimName: mypvc
  3. https://my-grope-log.tistory.com/15
  4. apiVersion: apps/v1 kind: Deployment metadata:     name: orderer spec:     selector:         matchLabels:             name: orderer     replicas: 1     template:         metadata:             labels:                 name: orderer         spec:            volumes:              - name: fabricfiles                persistentVolumeClaim:                   claimName: mypvc            containers:              - image: hyperledger/fabric-orderer:2.4                name: orderer                imagePullPolicy: IfNotPresent                env:                 - name: CONFIGTX_ORDERER_ADDRESSES                   value: "orderer:7050"                 - name: ORDERER_GENERAL_LISTENADDRESS                   value: "0.0.0.0"                 - name: ORDERER_GENERAL_LISTENPORT                   value: "7050"                 - name: ORDERER_GENERAL_LOGLEVEL                   value: debug                 - name: ORDERER_GENERAL_LOCALMSPDIR                   value: /organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/msp                 - name: ORDERER_GENERAL_LOCALMSPID                   value: OrdererMSP                 - name: ORDERER_GENERAL_GENESISMETHOD                   value: file                 - name: ORDERER_GENERAL_GENESISFILE                   value: /system-genesis-block/genesis.block                 - name: ORDERER_GENERAL_TLS_ENABLED                   value: "true"                 - name: ORDERER_GENERAL_TLS_PRIVATEKEY                   value: /organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.key                 - name: ORDERER_GENERAL_TLS_CERTIFICATE                   value: /organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.crt                 - name: ORDERER_GENERAL_TLS_ROOTCAS                   value: /organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/ca.crt                 - name:  ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY                   value: /organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.key                 - name:  ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE                   value: /organizations/ordererOrganizations/fmd.com/orderers/orderer.fmd.com/tls/server.crt                                resources:                  limits:                     memory: "250Mi"                     cpu: "250m"                  requests:                     memory: "200Mi"                     cpu: "150m"                                              volumeMounts:                 - name:  fabricfiles                   mountPath:  /organizations                   subPath: organizations                 - name: fabricfiles                   mountPath: /system-genesis-block                   subPath: system-genesis-block                 - mountPath: /var/hyperledger/production/orderer                   name: fabricfiles                   subPath: state/orderer                  
  5. https://www.jeffgeerling.com/blog/2019/debugging-networking-issues-multi-node-kubernetes-on-virtualbox https://stackoverflow.com/questions/65744565/kubernetes-dns-lookg-not-working-from-worker-node-connection-timed-out-no-ser
  6. https://stackoverflow.com/questions/47845739/configuring-flannel-to-use-a-non-default-interface-in-kubernetes
  7. https://lists.hyperledger.org/g/fabric/topic/fabric_sdk_golang_error/89341522?p=