본문 바로가기
네트워크/k8s

[k8s] 3. Pod - 실습

by Lauren X Ming 2021. 1. 31.

Pod 실습

 

  • 한 파드에 여러 컨테이너를 생성하는 실습
  • 두 개의 컨테이너가 있음
  • 하나는 이미지가 p8000으로 8000으로 접속
  • 다른 하나는 p8080

1. 파드 생성

+생성 버튼 클릭

아래 YAML 복붙 후 업데이트 클릭

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
spec:
  containers:
  - name: container1
    image: kubetm/p8000
    ports:
    - containerPort: 8000
  - name: container2
    image: kubetm/p8080
    ports:
    - containerPort: 8080

생성중인 pod-1 클릭

상세에서 IP 확인

  • 상태는 Running
  • IP는 서비스 없이 이 파드에 접근할 수 있는 IP
  • 쿠버네티스 클러스터 내에서만 접근 가능

Master에서 생성한 컨테이너 포트번호 호출해보기

[root@k8s-master ~]# curl 20.109.131.3:8000
containerPort : 8000
[root@k8s-master ~]# curl 20.109.131.3:8080
containerPort : 8080
  • Master에서 명령어 날리는 것 자체가 클러스터내에서 하는 것
  • 둘 다 연결 잘 되네

8000 컨테이너로 들어가서 8080 컨테이너 접근해보기

EXEC 클릭

 

container1

root@pod-1:/# curl localhost:8080
containerPort : 8080

container2

root@pod-1:/# curl localhost:8000
containerPort : 8000

아까 YAML 파일에서 두 컨테이너의 포트번호를 같게 하면?

  • 오류남 ㅎㅎ
  • 한 파드내에서 컨테이너의 포트는 같을 수가 없음

간단하게 컨트롤러를 만들어보기

  • 파드가 시스템에서 관리 되면 파드의 아이피는 파드가 재생성될 때 변경됨
  • 컨트롤러는 파드를 만들어주고 죽으면 다시 생성해주는 관리자 역할
apiVersion: v1
kind: ReplicationController
metadata:
  name: replication-1
spec:
  replicas: 1
  selector:
    app: rc
  template:
    metadata:
      name: pod-1
      labels:
        app: rc
    spec:
      containers:
      - name: container
        image: kubetm/init

  • 위 yaml로 파드 생성하고 삭제하면 바로 지워지지 않음
  • 컨트롤러가 다시 새 파드를 생성함

2. Label

  • 6개의 파드를 만듦
  • 1에서 한 pod-1 지우고 시작

pod-1: web, 개발환경

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    type: web
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init

pod-2: db, 개발환경

apiVersion: v1
kind: Pod
metadata:
  name: pod-2
  labels:
    type: db
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init

pod-3: server, 개발환경

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
  labels:
    type: server
    lo: dev
spec:
  containers:
  - name: container
    image: kubetm/init

pod-4: web, 상용환경

apiVersion: v1
kind: Pod
metadata:
  name: pod-4
  labels:
    type: web
    lo: production
spec:
  containers:
  - name: container
    image: kubetm/init

pod-5: web, 상용환경

apiVersion: v1
kind: Pod
metadata:
  name: pod-5
  labels:
    type: db
    lo: production
spec:
  containers:
  - name: container
    image: kubetm/init

pod-6: web, 상용환경

apiVersion: v1
kind: Pod
metadata:
  name: pod-6
  labels:
    type: server
    lo: production
spec:
  containers:
  - name: container
    image: kubetm/init

파드 구성

서비스 생성 - svc-for-web

apiVersion: v1
kind: Service
metadata:
  name: svc-for-web
spec:
  selector:
    type: web
  ports:
  - port: 8080

 

  • type:web인 파드 2개 확인

서비스 생성 - svc-for-prod

apiVersion: v1
kind: Service
metadata:
  name: svc-for-prod
spec:
  selector:
    lo: production
  ports:
  - port: 8080

  • 파드에 라벨을 달아놓으면 서비스로 해당 목적의 파드를 연결할 수 있넹

3. Node Schedule

노드를 지정한 파드 생성 --> nodeSelector 사용

apiVersion: v1
kind: Pod
metadata:
  name: pod-3
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: kubetm/init
  • 스팩을 보면 nodeSelector가 있음
  • 쿠버네티스(kubernets.io) 호스트(hostname)가 노드 1번(k8s-node1)을 가리킴
  • 1번은 기본적인 레이블들이 있음

 

  • node1의 k8s-node1 레이블을 선택한 것

  • 이전에 한 파드들은 다 삭제 ^^
  • 파드3가 노드1에 생성됨

노드 스캐줄 생성 - 스캐줄러가 알아서 노드를 선택해주는 방법

pod-4 - 2Gi 요청

apiVersion: v1
kind: Pod
metadata:
  name: pod-4
spec:
  containers:
  - name: container
    image: kubetm/init
    resources:
      requests:
        memory: 2Gi
      limits:
        memory: 3Gi

  • node2에 생성됨

pod-5 - 0.5Gi 요청

apiVersion: v1
kind: Pod
metadata:
  name: pod-5
spec:
  containers:
  - name: container
    image: kubetm/init
    resources:
      requests:
        memory: 0.5Gi
      limits:
        memory: 0.5Gi

 

  • node1에 생성됨
  • 노드 스캐줄러는 노드마다 점수를 매겨서 가장 높은 노드에 파드 할당
  • 노드 점수에 영향을 미치는게 자원양

출처

인프런 - 대세는 쿠버네티스