아키텍쳐
현재 제가 Test하고 있는 GCE에서 kubeadm을 이용하여 구성한 kubernetes 환경입니다.
Kubernetes Volume - nfs
Kubernetes는 다양한 Volume을 지원합니다. 대표적으로 emptyDir, hostPath, AmazonEBS... 이번에는 흔히 볼 수 있는 NFS로 볼륨을 구성하여 파드간의 통신과, 데이터 백업을 할 수 있는 환경을 구성하였습니다.
현재 저는 GCE에서 "kubeadm"을 사용하여 Master-node(Control plane)과 2개의 worker-node를 구성하였습니다. 이번 실습에서는 추가적으로 NFS Server를 할 수 있는 GCE instance를 생성하여 테스트하였습니다.
GCE에서 instacne 생성 gcloud sdk cli
$ gcloud compute instances create nfs-server \
--image=ubuntu-1804-bionic-v20210325 \
--image-project=ubuntu-os-cloud --machine-type=e2-medium \
--zone=asia-northeast3-a --boot-disk-size=20GB
- 인스턴스 이름 : nfs-server
- image : ubuntu 18.04버전 (bionic), image-project라고 해서 이미지가 참조하는 영역(pool)정도 해석(?)입니다.
- zone : 서울 리전(asia-northeast3)에서 a zone
- boot-disk-size : 테스트 용이라 가볍게 설정하였습니다.
=> 추가적인 nfs-server instance(machine)이 생성되었습니다.
테스트 구성
일단 테스트 Version 정보는 다음과 같습니다.
- Ubuntu 18.04.5 (Bionic Beaver)
- Kubernetes Server "v1.20.5"
먼저 nfs test 환경을 위해 각 worker node와 NFS server machine에 환경 구성이 필요합니다.
worker-node 준비사항
각 worker-node에서 nfs client 환경을 구성합니다.
$ apt-get update && apt-get install nfs-common -y
nfs-common
패키지는 클라이언트와 서버에 공통적인 NFS 지원 파일입니다. 클라이언트와 서버 모두, NFS를 사용하는 모든 머신은 이 패키지를 사용합니다. 다음 프로그램을 포함합니다: (lockd, statd, showmount, nfsstat, gssd, idmapd, mount.nfs.)
NFS server 준비사항
nfs-server에서 nfs server 환경을 구성합니다.
$ apt-get update && apt-get install nfs-common nfs-kernel-server rpcbind -y
nfs-common
과nfs-kernel-server
로 nfs server환경을 구성하고rpcbind
패키지를 통해 RPC요청에 의해 포트를 결정합니다.(예전 portmap 역할)
사전 구성이 마치면 NFS Volume을 마운트하는 httpd 이미지의 Pod를 생성하는 yaml파일을 만듭니다.
nfs-httpd.yaml
apiVersion: v1
kind: Pod
metadata:
name: nfs-httpd
spec:
containers:
- image: httpd
name: web
volumeMounts:
- mountPath: /usr/local/apache2/htdocs
name: nfs-volume
readOnly: true
volumes:
- name: nfs-volume
nfs:
server: 10.178.0.13
path: /home/nfs
yaml 코드를 통해 Pod를 배치하고, NFS를 테스트하는 Test Shell Script를 작성합니다.
test.sh
#!/bin/bash
LIMIT=100
i=0
# create nfs-httpd Pod
kubectl create -f nfs-httpd.yaml
# Check running state of the Pod
while [ $i -le $LIMIT ]
do
if [[ $(kubectl get pod | awk 'FNR == 2{ print $3 }') == "Running" ]]; then
break
fi
echo 'Wait Pod status is Running...'$i
sleep 1
i=$(($i+1))
done
echo 'Pod is Running!'
# Port-forward BackGround
if [[ -z "${PORT}" ]]; then # check Port environment variable is set
PORT=8080
fi
kubectl port-forward nfs-httpd $PORT:80 &
sleep 2
# check index.html
curl 127.0.0.1:$PORT
# Go to nfs-server and Make new index.html in nfs directory then check!