쿠버네티스 기초 - Service, Volume

마자나다·2025년 1월 17일

k8s

목록 보기
1/5

내가 알고있는 쿠버네티스 간단 방식.

  • 서버를 작성하고 도커파일을 작성한다.
  • 도커파일내용 기반으로 도커허브에 이미지가 업로드 된다.
  • 내가 업로드한 이미지를 기반으로 쿠버네티스 컨테이너 기본이 된다.
  • Pod을 만들어서 해당 컨테이너를 동작하고 yaml파일에 정보를 담음.

Service

  • Pod의 네트워크 접근을 추상화하여 안정적인 네트워크 엔드포인트를 제공하는 기능.
  • Pod은 내부에서 사용가능한 IP를 할당 받는다.
    • 하지만 신뢰성이 떨어진다.. 왜? -> Pod은 부하 등 다양한 이유로 삭제되고 재생성된다. 그럴때마다 새로운 IP가 할당된다.
  • 때문에 유지성이 좋은 Service를 사용한다. service로 원하는 그룹을 만들어 IP할당이나 다양한 명령이 가능하다.

Cluster IP

  • 클러스터 IP는 클러스터 내부에 있는 Pod끼리 IP를 공유할 수 있다.
  • 클러스터 내부망으로 쓰기떄문에 Localhost로 접속이 안된다. -> 접속 가능한 방법이 있긴함
  • 매우 간단하게 설정 가능하다.

NodePort

  • 노드에 있는 IP를 사용한다.
  • 내부와 외부 모두 사용될 수 있긴하지만 보통 내부에서만 사용된다.

Load Balancer

  • AWS, GCP, Azure 등을 사용해서 내부 IP에 감추고 사용자에겐 외부IP만 접근하도록 한다.
  • 클라우드 환경에서 사용되고 거의유료이다.

Service 실습

apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30001
  type: NodePort
  externalTrafficPolicy: Local
  • 서비스를 작성할때 타겟포트는 연결할 pod의 포트를 지정.
  • port는 내부에서 해당 8080포트로 연결하기위해 9000번의 포트를 사용.
  • nodePort는 클러스터 밖에서 접근할수있는 포트로 port랑 이어진다.
  • 노드포트의 범위는 30000~32767이다.
  • 그외에 로드밸런서는 type만 바뀌어서 사용하면 된다.

Volume

  • Pod끼리 데이터를 주고받을수 있는 공간.

emptyDir

  • Pod내부에 생성되는 볼륨. 컨테이너끼리 데이터를 주고받을 수 있다.
  • 컨테이너가 삭제되거나 재생성시 볼륨의 데이터 모두 삭제.

hostPath

  • 노드 내부에서 생성되는 볼륨으로 Pod이 삭제되거나 재생성되도 볼륨은 삭제되지 않는다.
  • !하지만! 항상 똑같은 노드에 Pod이 생성되리란 보장없다. -> 고로 Pod의 데이터를 저장이 아닌 Node의 정보가 Pod에서 필요할때 사용하는게 맞다.
  • 물론 같은 node에 pod을 생성할 순 있으나 실수할수도있고 여러모로 위험..

PVC(Persistance Volume Claim) / PV(Persistance Volume)

  • Pod에 영속성 있는 볼륨을 제공하기 위한 방법.
  • 다양한 서버와 연결이 가능하다. (Git, AWS, NFS 등...)
  • Admin과 User영역을 나눠서 사용한다.
  • User는 PVC를 사용해서 볼륨에 접근한다. -> admin이 PV를 만들면 User가 PVC를 만들어 사용.

Volume 실습

emptyDir

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-1
spec:
  containers:
  - name: container1
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount1
  - name: container2
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount2
  volumes:
  - name : empty-dir
    emptyDir: {}
  • pod이 생성될때 빈 디렉토리로 시작.
  • pod내의 모든 컨테이너가 해당 볼륨을 공유할수 있음.
  • container1은 /mount1에 마운트 되었고 container2는 /mount2에 마운트됨

hostPath

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-3
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: host-path
      mountPath: /mount1
  volumes:
  - name : host-path
    hostPath:
      path: /node-v
      type: DirectoryOrCreate
  • k8s-node1: 파드를 k8s-node1 노드에 배포
  • /mount1: 파드 내에서 마운트할 경로.
  • /node-v: 노드의 /node-v 디렉토리를 파드에 마운트.
  • DirectoryOrCreate: 디렉토리가 없으면 생성.
  • 특정 노드에 파드를 생성하고, 노드의 디렉토리를 파드에 마운트.

PVC/PV

1. PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-03
spec:
  capacity:
    storage: 2G
  accessModes:
  - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
  • 해당 PV의 용량 2GB로 설정.
  • ReadWriteOnce로 하나의 노드에만 읽기쓰기가 가능하도록 설정.
  • 저장될 노드의 경로 /node-v 지정과 k8s-node1에만 저장이 된다.
  • key는 노드의 식별 기준을 정하고, values는 연결할 수 있는 노드의 이름을 지정하고 이 설정으로 k8s-node1 노드에만 PersistentVolume이 연결된다.

2.PVC

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-01
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1G
  storageClassName: ""
  • PVC는 access를 설정, 요청공간을 미리 1GB로 설정하는 코드.

Pod과 PVC 연결

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-3
spec:
  containers:
  - name: container
    image: kubetm/init
    volumeMounts:
    - name: pvc-pv
      mountPath: /mount3
  volumes:
  - name : pvc-pv
    persistentVolumeClaim:
      claimName: pvc-01
  • pod을 생성할때 /mount3에 pvc-pv 볼륨을 생성.
  • volumes에서 pvc-01을 연결
  • 이 파드는 pvc-01 PVC를 통해 할당된 저장소를 /mount3 경로에 마운트하여 사용.

PV와 PVC 연결

PV 설정

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-04
  labels:
    pv: pv-04
spec:
  capacity:
    storage: 2G
  accessModes:
  - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}

PVC 설정

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-04
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2G
  storageClassName: ""
  selector:
    matchLabels:
      pv: pv-04
  • yaml에서 보면 알 수 있듯이 라벨과 셀렉터로 연결.
  • pv에서 라벨을 pv-04를 달아놓고 pvc에서 셀럭터를 통해 pv-04로 연결하여 pvc-pv를 설정.
profile
우왕좌왕 개발

0개의 댓글