갬미의 성장일기
Day 52 - k8s secret, k8s PV, PVC 본문
오늘 배운 내용
- 쿠버네티스 시크릿
- 쿠버네티스 PV-PVC
지금가지 배운 내용을 되짚어보면
pod를 만드는 방법
- ReplicaSet
- Deployment
- DaemonSet
- Job
- Cron job
SVC 타입 종류
- ClusterIP
- NodePort
- LoadBalancer
Volume (일부만)
- Emptydir
- HostPath - 도커 마운트와 비슷
- BlockStorage - aws EBS, gcp Persistent Disk
- NFS - 전용 서버 만들어 사용
- Configmap - k8s에서 제공하는 conf 전용 스토리지
- Secret (오늘 할 것) - base64로 인코딩 되어 저장되는 스토리지
Secret
configmap - plain text, 스토리지 내에 저장
secret - base64 , 메모리에 저장(인메모리)
DB password 등을 저장하기 좋음
메모리는 직접 접근할 수 없기때문에 configmap보다 안전하다
마운트 가능한 볼륨으로는 다음이 있는데
- emptydir, hostpath, block storage, nfs, configmap, secret ...
이때 configmap과 secret은 환경변수에도 적용할 수 있다
mysql 환경변수를 secret으로 설정하기
1. secret 만들기 후 apply
kubectl create secret generic mysql-env --from-file rootpass -o yaml --dry-run=client > mysql-pass.yaml
DB.yml env 설정부분에 넣어주면 된다
apiVersion: v1
kind: Pod
metadata:
name: mysql
labels:
app: db
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
key : rootpass
name: mysql-pass
- name: MYSQL_DATABASE
valueFrom:
secretKeyRef:
key: dbname
name: mysql-pass
- name: MYSQL_USER
valueFrom:
secretKeyRef:
key: username
name: mysql-pass
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
key: userpass
name: mysql-pass
- name: MYSQL_ROOT_HOST
value: '%'
PV - PVC
PV(Persistent Volume) - 스토리지 볼륨, 운영자가 생성하며, 사용자는 PVC 요청을 통해 볼륨을 사용한다
PVC(PersistentVolumeClaim) - 사용자는 PVC를 정의하여 운영자가 생성한 PV와 연결하여 볼륨을 사용한다
운영자와 개발자(사용자)의 role 구분을 위한 기능
PV의 4가지 상태 종류
- Available: PV가 생성되고 나면 사용 가능한 상태
- Bound: PVC 요청에 의해 바인딩 되었을 때
- Released: PVC가 삭제되어 요청이 없을 경우
- Fail
바인딩(binding)
PV를 PVC에 연결시키는 단계로 PVC는 사용자가 요청하는 볼륨을 PV에 요청하고 PV는 사용자가 요청한 볼륨에 맞는 볼륨을 할당한다 PVC가 요청하는 볼륨이 PV에 없다면 계속 대기상태로 남게 됩니다. 정상적으로 완료되면 bound 상태가 됩니다.
프로비저닝(provisioning)
정적 프로비저닝 - 특정 용량을 가진 PV를 미리 생성해두고 PVC로부터 요청이 있을시에 미리 생성한 PV를 할당
동적 프로비저닝 - 정적과 다르게 사용자가 요청할 때 PV를 생성하는데 대표적으로 Storage Class를 사용하여 사용자가 원하는 만큼의 용량을 생성해서 자유롭게 사용
pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
resources:
requests:
storage: 2Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
storageClassName: ""
pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nginx-pv
spec:
capacity:
storage: 2Gi
volumeMode: Filesystem
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Recycle
storageClassName: ""
mountOptions:
- hard
- nfsvers=4.1
nfs:
path: /log
server: 10.128.0.54
nginx-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 10
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: gymin97/msa2:nginx_v3
volumeMounts:
- mountPath: /var/log/nginx
name: log
ports:
- containerPort: 80
volumes:
- name: log
persistentVolumeClaim:
claimName: nginx-pvc
pv-pvc와 다른 스토리지의 차이점은
다른 스토리지는 deployment에 nfs 서버 정보가 담겨있었지만
pv를 사용하는 경우 nfs 서버는 nginx-pvc로 고정되고,
nfs서버는 nginx-pvc 명세에 필요한 nfs의 스펙을 적고, 이에 맞는 볼륨은 pv에서 명세한다 (여기에 nfs가 적혀있음)
pv-pvc는 함께 존재해야 한다
deployment(container) - pvc와 연결 - pvc는 pv와 연결
PV-PVC 더 자세히 알아보기! (강추 포스팅)
https://do-hansung.tistory.com/57
[NaverCloud] Kubernetes PV / PVC / StorageClass
□ PV(Persistent Volume) 스토리지 볼륨을 마운트 하여 사용할때 Kubernetes에서는 PV라고 명칭하고 있습니다. 관리자가 PV를 생성하면 PVC는 사용자가 볼륨을 사용하기 위해 PV에 요청을 하게 됩니다. □ P
do-hansung.tistory.com
미니과제 1
오늘 구현할 것
내부 클러스터 [web - api] - 외부 DB[DB (RDS)]
대부분 회사에서도 개발 단계에서는 비용 절감을 위해 rds대신 vm에 mysql을 깔아서 사용함
prod 환경에서만 rds사용
문제 : GCP의 sql db를 만들어 놓고 3tier DB 서버를 이걸로 사용해보자! (RDS)
--> endpont를 이용하여 외부 VM과 DB 서비스를 연결할 수 있다
db-svc-ep.yml
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-svc # 서비스명과 동일할 것
subsets:
- addresses:
- ip: 10.0.0.3 # 서버 ip
ports:
- port: 3306
---
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
ports:
- port: 3306
targetPort: 3306
was, nginx.yml 은 어제와 동일
위와같이 DB svc와 ep를 구성하면 클러스터 내에서 DB 서버를 운영하는것이 아닌 외부 RDS를 사용하는것이다
서버에서 확인하기
미니과제 2
문제: DB 운영 서버를 클러스터 외부에 놓고 3tier DB 서버를 이걸로 사용해보자! (RDS x, db 서버를 따로 뺀것)
서버에 mysql DB를 구축해야하나? --> 컨테이너를 사용하자
VM을 하나 만들고 도커, mysql을 설치한다
db-server에서 mysql 컨테이너 실행
docker run --name mysql-svc -d -p 3306:3306 \
-e MYSQL_ROOT_PASSWORD='frodo' \
-e MYSQL_DATABASE='frodo' \
-e MYSQL_USER='frodo' \
-e MYSQL_PASSWORD='frodo' \
-e MYSQL_ROOT_HOST='%' \
-v /confd:/etc/mysql/ mysql:5.7
db-svc-ep.yml
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-svc # 서비스명과 동일할 것
subsets:
- addresses:
- ip: 34.68.137.137 # VM ip
ports:
- port: 3306
---
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
spec:
ports:
- port: 3306
targetPort: 3306
was, nginx.yml 은 동일
오늘의 회고
- 오늘과제는 팀프로젝트로 진행되었다 혼자 했으면 애를 먹었을 것 같은데 같이 머리 맞대고 고민하니 답이 나와서 신기했다 !
- k8s 이론과정은 오늘로 마쳤다 .. 넘모 신기 그간 했던 미니과제들을 잘 정리해서 깃에 업로드하도록 해야겠다
- 내일이 왜이렇게 주말같은지 모르겠지만 어쨌든 내일은 멀티 클라우드 첫시작을 하는날이다~~ 신난다
'Cloud > Cloud 공부일기' 카테고리의 다른 글
Day 54 - 3tier 구성하기, NAT gateway (2) | 2022.03.28 |
---|---|
Day 53 - Bastion host, BGP, VPN (0) | 2022.03.25 |
Day 51 - k8s Volume, job, cron job, configmap (0) | 2022.03.23 |
Day 50 - k8s DaemonSet, k8s Volume (0) | 2022.03.22 |
Day 49 - k8s 인그레스 구글 인증서 사용하기, k8s LB 알고리즘, k8s deployment (0) | 2022.03.21 |