2025-07-07 쿠버네티스, 도커허브

sso·2025년 7월 7일

AWS

목록 보기
21/34

쿠버네티스 실습

cp, w1, w2 인스턴스 실행

systemctl --now enable containerd && systemctl --now enable kubelet
kubectl get pods -A
kubectl get nodes

톰캣 와스 서버를 통해 구성된 파드를 외부 AWS 로드 밸런서로 접속하되, 노드포트로 연결

vi tomcatdep.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat
  labels:
    app: tomcat
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcatcontainer
        image: tomcat:latest

kubectl apply -f tomcatdep.yaml
kubectl get deploy
kubectl get pod

파드는 직접적으로 외부와 연결할 수 없음 때문에 아래와 같이 연결하겠음

작업하려는 연결 구조 : ELB - 노드포트 - 디플로이먼트 - 파드

vi nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: tc-svc
spec:
  selector:
    app: tomcat
  ports:
    - name: http
      protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 30000
  type: NodePort

port: 서비스가 연결될 포트
targetport: 파드 내부의 포트
nodeport: 외부 노드에 연결 될 포트

kubectl apply -f nodeport.yaml
kubectl get svc

tc-svc가 연결된 포트 확인 가능

w1 인스턴스의 ip:30000 으로 웹 연결하면 tomcat 페이지가 나옴
(현재는 오류가 나서 404가 뜨지만 우선 연결은 되긴 했음)
(오류나는 이유가 어떤 폴더가 sample로 있어서 그럼 해당 폴더 복사해서 사용하는 걸로 이름 바꿔주면 오류 해결됨)

로드 밸런서 생성
노드 포트 30000과 일치하도록 로드밸런서의 대상 그룹을 w1, w2로 지정하고 포트 30000으로 연결되도록 구성


nfs는 cp 인스턴스에서 생성하기 때문에 cp 인스턴스의 프라이빗 ip 입력

mkdir /nfs_shared
echo '/nfs_shared 10.0.9.184/20(rw,sync,no_root_squash)' >> /etc/exports
systemctl restart nfs-server
systemctl status nfs-server
exportfs -v
vi nfs-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 100Mi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 10.0.9.184
    path: /nfs_shared

kubectl apply -f nfs-pv.yaml
kubectl get pv

vi nfs-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Mi

kubectl apply -f nfs-pvc.yaml
kubectl get pvc

분명 저장 공간을 10M 요청하였더니 결과는 100Mi로 들어갔음
pvc 10Mi는 최소한 이 정도의 PV와 매칭시켜 달라라는 의미
(예를 들어 10억 가진 아저씨하고 만나고 싶어요 했더니 10억 아저씨 없어서 100억 아저씨랑 매칭시켜준것과 같음)

PV는 사용자가 요청할 볼륨 공간을 관리자가 생성
PVC는 사용자(개발자)간 볼륨을 요청한다는것이 차이

vi nfs-pvc-deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-pvc-deploy
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nfs-pvc-deploy
  template:
    metadata:
      labels:
        app: nfs-pvc-deploy
    spec:
      containers:
      - name: httpd
        image: httpd:latest
        volumeMounts:
        - name: nfs-vol
          mountPath: /usr/local/apache2/htdocs
      volumes:
      - name: nfs-vol
        persistentVolumeClaim:
          claimName: nfs-pvc

kubectl apply -f nfs-pvc-deploy.yaml
kubectl get pod
kubectl exec -it nfs-pvc-deploy-7fd7984c8c-bx6vm -- /bin/bash

워커노드 (w1, w2)

mkdir /nfs_client
mount -t nfs 10.0.9.184:/nfs_shared /nfs_client
showmount -e 10.0.9.184

cp 인스턴스에서 생성한걸 다 지우고 지워졌는지 확인

kubectl delete -f nfs-pvc-deploy.yaml
kubectl delete -f nfs-pvc.yaml
kubectl delete -f nfs-pv.yaml
kubectl delete -f nodeport.yaml
kubectl delete -f tomcatdep.yaml

kubectl get pod
kubectl get svc
kubectl get deploy
kubectl get pv
kubectl get pvc


연구과제

nginx_dep 디플로이먼트 내부의 nginx 파드를 생성

nginx 파드 내부의 경로를 pv - pvc를 통해 웹 루트 경로를 영구적으로 보존하도록 구성

pv의 제공 용량 레이블 1G
pvc의 요청 용량 레이블 100M로 설정하여 Bound 확인

(pv - pvc를 통해 디렉터리 연결 후 해당 디렉터리에 배치한 컨텐츠가 외부 ALB 로드 밸런서로 출력되도록 구성)

vi pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 10.0.9.184
    path: /nfs_shared

kubectl apply -f pv.yaml
kubectl get pv

vi pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi

kubectl apply -f pvc.yaml
kubectl get pvc

vi nginx.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
  - name: nginx-pod
    image: nginx
    volumeMounts:
    - name: nginx-vol
      mountPath: /nfs_pod
  volumes:
  - name: nginx-vol
    persistentVolumeClaim:
      claimName: nginx-pvc

kubectl apply -f nginx.yaml
kubectl get pod
kubectl exec -it nginx-pod -- /bin/bash

profile
오늘도 하나씩 해결해 나가자!

0개의 댓글