Kubernetes 쿠버네티스 - Pod, Deployment

salgu·2022년 12월 31일
0

kubernetes

목록 보기
2/16
post-thumbnail

Pod의 생성과 배포


  • Pod은 여러개의 컨테이너를 포함할 수 있고 하나의 노드에 배포됩니다.(Pod, Container 1:N)
  • Pod과 Container는 1:1을 기본적으로 설계합니다.(유연성)
  • Pod은 yaml파일로 정의 해두면 필요할 때 원하는 수 만큼 노드에 배포할 수 있습니다.

Pod IP


  • 쿠버네티스는 Pod을 생성할 때 클러스터 내부에서만 접근할 수 있는 ip를 할당합니다.
  • Pod ip는 컨테이너와 공유되기 때문에 컨테이너 간 포트 충돌을 주의해야 합니다.
  • 하나의 Pod에 속한 컨테이너들은 localhost로 통신할 수 있습니다.
  • 다른 Pod과의 통신은 Pod ip를 이용합니다.

Pod의 한계


ReplicaSet 도입

Pod은 Self-Healing이 되지 않아 Pod나 Node가 이상이 생겨 종료됩니다.
해당 문제를 해결하기 위해 사용자가 선언한 수 만큼 Pod 수를 유지해주는 ReplicaSet 오브젝트를 도입합니다.

Service 도입

Pod ip는 외부에서 접근할 수 없고 생성할 때마다 ip는 변경됩니다.
클러스터 외부에서 접근할 수 있는 고정적인 단일 엔드포인트가 필요했고 Pod 집합을 클러스터 외부로 노출하기 위해 Service 오브젝트를 도입합니다.



Pod 오브젝트 표현 방법


apiVersion: v1	# Kubernetes API 버전

kind: Pod		# Object 타입

metadata:						# Object를 식별하기 위한 정보
  name: kube-basic				# Object 이름
  labels:						# Object 집합을 구할 때 사용할 이름표
    app: kube-basic
    project: example-project
    
spec:				# 사용자가 원하는 Object의 상태
  nodeSelector:		# Pod을 배포할 Node 선택
    gpu: "true"		# Node 집합을 구하기 위한 식별자 (key-value)
  containers:					# Pod 안에서 실행할 컨테이너 목록
  - name: kube-basic			# 컨테이너 이름
    image: kube-basic:1.0		# 이미지 주소
    imagePullPolicy: "Always"	# 이미지 다운로드 정책(Always, IfNotPresent - 로컬에 있다면 다운로드, Never)
    env:					# 컨테이너에 설정할 환경변수 목록
    - name: PROFILE			# 환경변수 key
      value: prod			# 환경변수 value
    - name: LOG_DIRECTORY
      value: /logs
    - name: MESSAGE
      value: this application is running on $(PROFILE)	# 환경변수 참조 가능
    ports:
    - containerPort: 80			# 통신에 사용할 컨테이너 포트 
    volumeMounts:				# 컨테이너에서 사용할 Pod 볼륨 목록(여러개 설정 가능)
    - name: html				# Pod 볼륨 이름
      mountPath: /var/html		# 마운트할 컨테이너 경로
      readOnly: true			# 볼륨 readOnly 설정
  volumes:				# 컨테이너가 사용할 수 있는 볼륨 목록
  - name: host-volume	# 볼륨 이름
    hostPath:			# 볼륨 타입, 노드에 있는 파일이나 디렉토리를 마운트 할 때
      path: /data/mysql



Pod 명령어


pod, node, deploy를 조회

pod 생성

kubectl run {pod 명} --image={image 명} --port={port}

파드를 생성하고 실행할 수 있습니다.

pod 상세 조회

kubectl describe {조회할 대상 종류} {조회할 대상 이름}

명령어를 이용하여 상세 정보를 조회할 수 있고
Events: 해당 부분을 확인하여 상태변화 등 체크를 할 수 있습니다.

pod 삭제

kubectl delete pod/{pod 명}

pod를 삭제할 수 있습니다.

파드 내부의 컨테이너에 접근해 로그 확인

kubectl logs {pod 명} -c {container 명}

컨테이너 ip 확인

kubectl exec {pod 명} -- ifconfig eth0

컨테이너 listening 포트 확인

kubectl exec {pod 명} -- netstat -an

pod에 포트포워딩

kubectl port-foward pod/{pod 명} {포트}:{대상 포트}

pod는 원래 직접 접근할 수 없지만 해당 명령어로 포트포워딩을 해준다면 접근할 수 있게 됩니다.

컨테이너 ip 확인

kubectl exec {pod 명} -- ifconfig eth0

컨테이너 환경변수 확인

kubectl exec {pod 명} -- env




Deployment 명령어


deployment 생성

kubectl create deployment {deployment 명} --image={image 명}

deployment를 생성할 수 있습니다.

deployment 상세 조회

kubectl describe {조회할 대상 종류} {조회할 대상 이름}

명령어를 이용하여 상세 정보를 조회할 수 있고
Events: 해당 부분을 확인하여 상태변화 등 체크를 할 수 있습니다.

deployment로 pod scale out

kubectl scale deployment {deployment 명} --replicas={replica 갯수, pod 갯수}

방법으로 deployment를 이용하여 pod를 scale out할 수 있습니다.

deployment로 관리되고 있는 pod는 replica 갯수가 정해져 있기 때문에 pod를 삭제 하더라도 곧바로 replica 갯수에 맞춰 다시 생성됩니다.

replica의 갯수를 다시 줄일수도 있습니다.




yml 파일로 deployment 생성


yml 작성

위에서 kubectl 명령어로 deployment를 생성했던 내용과 같은 yml 파일을 작성해줬습니다.

yml 실행

kubectl apply -f {yml 파일 경로}

명령어로 yml 파일을 실행해주면 위에서 kubectl로 했던 실행과 같은 방식으로 deployment를 생성할 수 있습니다.





reference:
Jenkins를 이용한 CI/CD Pipeline 구축 - 이도원,
Kubernetes와 Docker로 한 번에 끝내는 컨테이너 기반 MSA

profile
https://github.com/leeeesanggyu, leeeesanggyu@gmail.com

0개의 댓글