컨트롤러로 생성된 파드들 중에 정상적인 파드만 서비스로 접근할 수 있게하려고 파드 설정 부분에서 설정 -> HTTP / TCP / exec 방식 가능
ClusterIP 서비스처럼 내부용 서비스
별도의 IP 주소는 없음 -> 서비스의 DNS 로 접속 가능
stateFullSet 과 함께 사용할 경우 특정 파드로 접근 가능
emptyDir
빈 디렉토리를 생성해서 파드 안의 컨테이너에 연결해주는 방식
-> 디렉토리는 자동으로 생성 및 삭제 (파드의 라이프사이클과 동일)
각 컨테이너들끼리 데이터 공유를 위해 사용
hostpath
파드가 실행되는 해당 노드의 특정 파일/디렉토리를 연결 (마운트)
노드마다 데이터가 다르거나 없을 수도 있음
PV
볼륨을 파드와 별개로 관리 (라이프사이클)
다양한 종류의 스토리지 서비스 지원
lifecycle
1. provisioning: 볼륨생성
2. binding: 볼륨 연결
3. using: 볼륨 사용
4. reclaiming: 볼륨을 반환
sudo apt install -y nfs-kernel-server
sudo mkdir /srv/nfs-volume
vim /etc/nfs-volume
/srv/nfs-volume *(rw,sync,no_subtree_check,no_root_squash)
vim index.html
hello NFS volume
각 노드에 NFS CLINET 설치
for NODE in {kube-node1,kube-node2,kube-node3}; do ssh vagrant@$NODE "sudo apt install -y nfs-common"; done
nfs 연결
ssh kube-node1
mkdir /test
sudo mount -t nfs kube-control1:/srv/nfs-volume /test
nfs 에 마운트 되는지 확인
PV, PVC 생성
apiVersion: v1
kind: PersistentVolume
metadata:
name: myapp-pv-nfs
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
path: /srv/nfs-volume
server: 192.168.56.11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapp-pvc-nfs
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
volumeName: myapp-pv-nfs
pvc 생성 후 CLAIM 항목에 bind 된 것을 확인
nfs 를 직접 연결해주면 pod에 볼륨은 남아있지 않음
pv 는 남아있음
myapp-rs-nfs.yaml
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs-nfs
spec:
replicas: 2
selector:
matchLabels:
app: myapp-rs-nfs
template:
metadata:
labels:
app: myapp-rs-nfs
spec:
containers:
- name: web-server
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- name: web-share
mountPath: /usr/share/nginx/html
volumes:
- name: web-share
persistentVolumeClaim:
claimName: myapp-pvc-nfs
myapp-svc-nfs.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp-svc-nfs
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 80
selector:
app: myapp-rs-nfs
볼륨 연결이 제대로 된 것을 확인해볼 수 있었음!
pvc 지워보고 pv 상태확인
pvc 정책이 retain 이라 pv에 남아는 있다
pvc를 새로 만들어도 자동으로 연결되지는 않는다.
pv 지워보고 pvc 상태 확인
pvc-> pending 에서 bound 로 바뀜
pv-> abailable -> bound
CREATE PV -> PVC -> POD
DELETE POD -> PVC -> PV
매번 정적 볼륨을 요청하고 PV를 매번 제공해야하면 귀찮음
스토리지 기능 및 분류 정보를 담고 있는 스토리지 클래스 리소스만 정의해 놓고 개발자가 pvc 를 요청하면 스토리지 클래스 리소스에 의해 pv 가 자동으로 프로비저닝 되어 사용될 수 있도록 함
git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
ls /nfs-subdir-external-provisioner/deploy
rbac.yaml -> 사용자 권한 설정 파일
deployment.yaml 파일 수정
pod 생성 확인
class.yaml -> sotrageclass 정의 파일
-- 사전 준비 끝 --
vim dynamic-nfs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapp-pvc-dynamic
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
storageClssName: nfs-client
vim dynamic-rs-nfs.yaml
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-rs-dynamic
spec:
replicas: 2
selector:
matchLabels:
app: myapp-rs-dynamic
metadata:
labels:
app: myapp-rs-dynamic
metadata:
spec:
containers:
- name: web-server
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- name: web-share
mountPath: /usr/share/nginx/html
volumes:
- name: web-share
persistentVolumeClaim:
claimName: myapp-pvc-dynamic
pv를 따로 지정해주지 않았지만 storageclass 에 의해 생성이 됨
myapp-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp
image: ghcr.io/c1t1d0s7/go-myweb:alpine
args:
- -port=8088 # image 의 port 를 8088 로 변경
ports:
- containerPort: 8088 # image port 번호여야 함
protocol: TCP
env-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: env-myapp-pod
spec:
containers:
- name: myapp
image: ghcr.io/c1t1d0s7/go-myweb:alpine # MESSAGE 환경 변수가 있으면 해당 변수의 값을 출력메세지로 사용하도록 만들어짐
ports:
- containerPort: 8080
protocol: TCP
env:
- name: MESSAGE
value: "Customized Hello World" # image 내부의 내용 변경
kubectl create cm test-cm --from-literal KEY=hello
kubectl create cm host-cm --from-file /etc/hosts
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config4
data:
key: value1
key2: value2
kye4: value4
configmap 생성
apiVersion: v1
kind: Pod
metadata:
name: env-myapp-pod-cm
spec:
containers:
- name: myapp
image: ghcr.io/c1t1d0s7/go-myweb:alpine
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
protocol: TCP
env:
- name: MESSAGE
valueFrom:
configMapKeyRef:
name: custom-img
key: message
# args:
# - -port=$portnumber
cofigmap 이 잘 적용된 것을 확인할 수 있음
apiVersion: v1
kind: Pod
metadata:
name: test-cm-mount
spec:
containers:
- name: test
image: busybox
command:
- sleep
- Infinity
imagePullPolicy: IfNotPresent
volumeMounts:
- name: cm-vol
mountPath: /mnt[/filename] # 개별 파일 마운트
# subPath: filename #개별 파일로 인식
volumes:
- name: cm-vol
configMap:
name: host-cm
디렉토리나 파일이 존재하지 않는 경우 마운트할 때 생성하고 마운트해줌
/mnt 에 기존 파일이 존재한다면 마운트 된 상태에서는 사용할 수 없음
디렉토리 전체에 마운트하지 말고, 개별 파일로 마운트할 수 있음