local k3s 환경에서 hyperlegder-fabric deploy하기 (1)

JinYoungMo·2025년 3월 11일

wsl2 ubuntu 환경에서 실행하였습니다.
이 실습은 k3s가 ubuntu에 이미 설치가 된 환경에서 이루어집니다. 실습전에 k3s를 설치해주세요!

1. PV(Persistent Volume), PVC(Persistent Volumn Clain) 설정하기

우선 스토리지 확보를 위해 local 환경이지만 PV와 PVC를 구축해줍니다.
local 환경에서는 필수는 아니지만 데이터 지속성스토리지 관리의 용의성, 스케일링 및 환경 독립성 확보를 위해 설정합니다.
(k8s의 PV에 대해서 더 자세히 알고싶다면... https://kubernetes.io/ko/docs/concepts/storage/persistent-volumes/)

우선 ubuntu에 리소스를 바인딩할 디렉토리를 생성합니다.

cd /var/lib
mkdir k3s
cd k3s
mkdir storage

다시 home경로로 돌아간 후 디렉토리를 생성해줍니다.

mkdir k3s-hyperledger
cd k3s-hyperledger
mkdir ca
cd ca

PV를 정의할 파일을 생성합니다.

mypv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mypv
spec:
  storageClassName: local-path
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /var/lib/k3s/storage  # 로컬 스토리지 경로로 변경

PV 파일입니다. 실제 스토리지 리소스를 정의합니다. capacity에서 5G를 바인딩하고 있고 쓰기, 읽기 권한과 local ubuntu의 path 경로로 설정해주었습니다.

PVC 만든 PV를 요청하는 PVC 파일을 생성해줍니다.

mypvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mypvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: local-path

생성완료 되었다면 실행시켜줍니다.

kubectl apply -f mypvc.yaml
kubectl apply -f mypv.yaml
kubectl get pv
kubectl get pvc

위 커맨드를 실행시켰을 때 각각 아래와 같은 상태가 된다면 성공적으로 바인딩 된 것 입니다!

2. orderer와 조직 별로 CA 서버 구축하기

hyperlegder에서 CA는 인증기관으로 각 조직이나 orderer 노드들(orderer노드들의 모임)의 인증서를 관리하는 서버 입니다. 허가형 블록체인이기 때문에 각 조직이 블록체인에 참여하기 위해 "허가 받았음"을 증명하기 위해 필요하다고 생각하면 됩니다.

orderder ca 부터 생성해보겠습니다.

ca-orderer.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ca-orderer
spec:
  selector:
    matchLabels:
      app: ca-orderer
  replicas: 1
  template:
    metadata:
      labels:
        app: ca-orderer
    spec:
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: mypvc
      containers:

        - name: ca-orderer
          image: hyperledger/fabric-ca:latest
          imagePullPolicy: "IfNotPresent"
          command:
            [
              "fabric-ca-server" ,
              "start", "-b" ,"admin:adminpw","--port","10054", "-d"
            ]
          resources:
            requests:
              memory: "300Mi"
              cpu: "300m"
            limits:
              memory: "500Mi"
              cpu: "350m"
          env:
           - name: FABRIC_CA_SERVER_CA_NAME
             value: ca-orderer
           - name: FABRIC_CA_SERVER_TLS_ENABLED
             value: "true"
          volumeMounts:
            - name: data
              mountPath: /etc/hyperledger/fabric-ca-server
              subPath: organizations/fabric-ca/ordererOrg

service도 정의해줍니다.

ca-orderer-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: ca-orderer
  
  labels:
    app: ca-orderer
spec:
  type: ClusterIP
  selector:
    app: ca-orderer
  ports:
    - protocol: TCP
      targetPort: 10054
      port: 10054

외부에서 10054 포트로만 접근할 수 있게 설정하였습니다.

이처럼 쿠버네티스에서는 Deployment 파일이 Pod를 배포하는 설정파일이라고 하면 Service 파일은 그 Pods에 대한 접근 방식을 정의하는 파일입니다.

저는 조직을 3개 만들것이기 때문에 각 조직마다 deployment파일과 service도 배포해줍니다.
ex)

ca-org1.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ca-org1
spec:
  selector:
    matchLabels:
      app: ca-org1
  replicas: 1
  template:
    metadata:
      labels:
        app: ca-org1
    spec:
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: mypvc
      containers:
        - name: ca-org1
          image: hyperledger/fabric-ca:1.4.9
          imagePullPolicy: "Always"
          command:
            [
              "fabric-ca-server" ,
              "start", "-b" ,"admin:adminpw","--port","7054", "-d"
            ]
          resources:
            requests:
              memory: "300Mi"
              cpu: "250m"
            limits:
              memory: "400Mi"
              cpu: "350m"
          env:
           - name: FABRIC_CA_SERVER_CA_NAME
             value: ca-org1
           - name: FABRIC_CA_SERVER_TLS_ENABLED
             value: "true"
           - name: FABRIC_CA_SERVER_CSR_CN
             value: "ca-org1"
           - name: FABRIC_CA_SERVER_CSR_HOSTS
             value: "ca-org1"
          volumeMounts:
            - name: data
              mountPath: /etc/hyperledger/fabric-ca-server
              subPath: organizations/fabric-ca/org1
ca-org1-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: ca-org1
  labels:
    app: ca-org1
spec:
  type: ClusterIP
  selector:
    app: ca-org1
  ports:
    - protocol: TCP
      targetPort: 7054
      port: 7054

나머지 CA들도 배포해줍니다.

kubectl get pods

을 하였을 때
같이 결과가 나왔다면 잘 배포된 것입니다.

파일 구조는 다음과 같습니다.

└── ca
    ├── ca-orderer-service.yaml
    ├── ca-orderer.yaml
    ├── ca-org1-service.yaml
    ├── ca-org1.yaml
    ├── ca-org2-service.yaml
    ├── ca-org2.yaml
    ├── ca-org3-service.yaml
    ├── ca-org3.yaml
    ├── mypv.yaml
    └── mypvc.yaml
profile
blockchain core & payments and stable coins

1개의 댓글

comment-user-thumbnail
2025년 7월 1일

오 해보니 조직 3개가 진짜로 나왔네요! 꿀팁 감사합니다

답글 달기