wsl2 ubuntu 환경에서 실행하였습니다.
이 실습은 k3s가 ubuntu에 이미 설치가 된 환경에서 이루어집니다. 실습전에 k3s를 설치해주세요!
우선 스토리지 확보를 위해 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
위 커맨드를 실행시켰을 때 각각 아래와 같은 상태가 된다면 성공적으로 바인딩 된 것 입니다!


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
오 해보니 조직 3개가 진짜로 나왔네요! 꿀팁 감사합니다