📙
Daeun's devlogs
  • First page
  • Docker
    • 이미지, 레이어
    • 컨테이너 생성하기
    • Dockerfile로 이미지 생성하기
    • 이미지를 dockerhub repo에 push하기
  • Python
  • Algorithm Study
  • 방향없는 그래프(undirected graph)
  • 방향있는 그래프(directed graph)
  • 위상 정렬(topological sort)
  • BFS(Breadth-First Search)
  • 다익스트라(Dijkstra)
  • 벨만-포드(Bellman-Ford) 알고리즘
  • 최소신장트리(Minimum Spanning Tree)
  • 크루스칼(Kruskal) 알고리즘
  • Algorithm quiz
    • quizzes & solutions
    • graph에서 cycle 유무 확인하기
    • bipartite(이분그래프) 확인하기
    • Dijkstra 알고리즘으로 모든 정점으로의 최단 경로 구하기
  • operating system
  • 스루풋 & 레이턴시
  • Cloud Computing
    • cloud computing 의 종류
    • CloudFormation으로 EC2 & ElasticIP 생성하기
  • Network
    • DataLink 계층
    • Network 계층
    • subnetting & CIDR
    • Domain Name System
    • Transport 계층
  • Unix
    • dig 커맨드로 DNS서버에 질의하기
    • APT(Advanced Package Tool)로 젠킨스 설치하기
    • usermod 로 그룹에 유저 추가하기
    • sysctl 로 커널 변수 조회하기
  • Django
    • 마이그레이션 실행여부 확인하기
    • 마이그레이션 DDL 쿼리 확인하기
  • Kubernetes
  • 쿠버네티스(Kubernetes) 개념
  • k8s 클러스터에 애플리케이션 서버 실행하기
  • kops로 AWS에 k8s 클러스터 생성하기
  • k8s 클러스터에 replicaset 생성하기
  • Nginx & WSGI pod를 service로 노출하기
  • Helm으로 쿠버네티스 리소스 배포하기
Powered by GitBook
On this page
  • 1. replicaset 생성하기
  • 2. label selector

Was this helpful?

k8s 클러스터에 replicaset 생성하기

최초작성일 [2020.03.14]

마이크로서비스에서는 여러 개의 동일한 컨테이너를 생성한 뒤 외부 요청이 각 컨테이너에 적절히 분배될 수 있어야 한다.쿠버네티스에서는 여러 개의 동일한 컨테이너를 생성하기 위해 리플리카셋(replicaset)이라는 오브젝트를 사용한다. replicaset은 항상 정해진 수 만큼의 pod를 유지하며 노드에 장애가 발생하여 pod를 사용할 수 없을 경우 다른 노드에서 pod를 다시 생성하는 등의 pod 관리를 책임진다.

1. replicaset 생성하기

Nginx pod를 생성하는 replicaset을 만들어보자. 아래는 nginx.yml 파일의 내용이다.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-nginx
spec:
  replicas: 3

  selector:
    matchLabels:
      app: nginx

  template:
    metadata:
      name: pod-nginx
      labels:
        # selector의 matchLabels과 동일함.
        app: nginx
    spec:
      containers:
        - name: pod-nginx
          image: nginx:latest
          ports:
            - containerPort: 80

attribute

role

kind

리소스 종류.

$ kubectl api-resources 명령어 결과의 KIND 필드에서 확인할 수 있다.

metadata

리소스의 이름, 라벨 등의 부가정보.

spec

리소스 생성을 위한 명세.

spec.relicas

유지할 pod의 수.

spec.selector

생성해야 할 pod의 라벨.

spec.template

pod를 생성할 때 사용할 템플릿. pod template으로도 불린다.

spec.containers

pod에 들어갈 컨테이너.

pod에는 1개 이상의 컨테이너가 생성될 수 있으므로 여러개 정의할 수 있다.

ports.containerPort

컨테이너가 사용하는 포트번호.

작성한 리소스를 클러스터에 생성하고 확인해보자.

$ kubectl apply -f nginx.yml
replicaset.apps/replicaset-nginx created

$ kubectl get pods
replicaset-nginx-b2dsp        1/1     Running            0          10s
replicaset-nginx-j6zcj        1/1     Running            0          10s
replicaset-nginx-v2ztm        1/1     Running            0          10s

spec.relicas 에 정의된 갯수에 맞게 pod가 생성된 것을 볼 수 있다. 위의 pod 3개는 replicaset에 의해 만들어진 것이므로 replicaset을 삭제하거나 수정하면 pod에도 반영한다.

$ kubectl get pods
replicaset-nginx-b2dsp        1/1     Running            0          5m
replicaset-nginx-j6zcj        1/1     Running            0          5m
replicaset-nginx-v2ztm        1/1     Running            0          5m

$ kubectl delete replicaset replicaset-nginx
replicaset.apps "replicaset-nginx" deleted

2. label selector

replicaset은 pod와 '느슨한 연결'을 가지고 있는데, 이 느슨한 연결은 label selector로 이뤄져있다. label은 사용자 관점에서 리소스를 식별하는 데 쓰일 뿐만 아니라 오브젝트들이 서로를 찾아야 할 때 쓰기도 한다. replicaset은 spec.selector.matchLabels 속성에 정의된 라벨을 통해 생성해야하는 pod를 찾는다.

위에서 생성한 replicaset-nginx의 경우 app: nginx 라는 라벨을 가진 pod의 갯수가 replicas 속성에 정의된 숫자에 일치하지 않으면 template의 내용으로 pod를 생성한다. replicaset을 처음 생성했을 때는 라벨과 일치하는 pod가 아예 없었기 때문에 3개를 생성했다.

replicas속성을 3에서 4로 바꾸고 다시 $ kubectl apply -f nginx.yml을 실행했다.

$ kubectl apply -f nginx.yml 
replicaset.apps/replicaset-nginx configured

$ kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
replicaset-nginx-4zqvc   0/1     ContainerCreating   0          4s
replicaset-nginx-b2dsp   1/1     Running             0          40m
replicaset-nginx-j6zcj   1/1     Running             0          40m
replicaset-nginx-v2ztm   1/1     Running             0          40m

새로운 pod 1개가 만들어졌다. app: nginx 라벨을 가진 pod 3개가 이미 있기 때문에 1개만 새로 생성된 것이다.

반대로 replicaset에 의해 만들어진 pod를 직접 삭제하면 어떻게 될까?

$ kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
replicaset-nginx-4zqvc   0/1     ContainerCreating   0          4s
replicaset-nginx-b2dsp   1/1     Running             0          40m
replicaset-nginx-j6zcj   1/1     Running             0          40m
replicaset-nginx-v2ztm   1/1     Running             0          40m

$ kubectl delete pods replicaset-nginx-b2dsp
pod "replicaset-nginx-b2dsp" deleted

$ kubectl get pods                          
NAME                     READY   STATUS    RESTARTS   AGE
replicaset-nginx-4zqvc   1/1     Running   0          12m
replicaset-nginx-bzg4z   1/1     Running   0          28s
replicaset-nginx-j6zcj   1/1     Running   0          53m
replicaset-nginx-v2ztm   1/1     Running   0          53m

replicaset-nginx-b2dsp라는 pod를 직접 삭제했더니 replicaset-nginx-bzg4z라는 pod를 새로 생성했다.

이번에는 pod의 라벨을 직접 수정하면 어떻게 될지 확인해보자. 아래 커맨드를 실행하여 replicaset-nginx-4zqvc 라는 pod의 label 속성을 삭제해보겠다. $ kubectl edit 을 실행하면 S3에서 관리하는 pod의 상태파일을 터미널에서 열어준다.

$ kubectl edit pods replicaset-nginx-4zqvc
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/podIP: 100.100.132.202/32
   kubernetes.io/limit-ranger: 'LimitRanger plugin set: cpu request for container
     pod-nginx'
 creationTimestamp: "2020-03-14T09:30:52Z"
 generateName: replicaset-nginx-
 name: replicaset-nginx-4zqvc

--show-labels 옵션으로 pod들의 라벨을 확인해보자. app=nginx 라벨을 가진 pod가 1개 유실된만큼 새로운 pod 1개를 생성했다. 라벨이 삭제된 pod는 <none>이라는 라벨을 갖게 되고 replicaset-nginx의 selector.matchLabels의 값과 일치하지 않으므로 replicaset-nginx가 더 이상 관리하지 않는다. 따라서 replicaset-nginx를 수정하거나 삭제해도 라벨이 삭제된 pod는 아무런 영향을 받지 않는다.

$ kubectl get pods --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
replicaset-nginx-4zqvc   1/1     Running   0          35m     <none>
replicaset-nginx-bzg4z   1/1     Running   0          23m     app=nginx
replicaset-nginx-j6zcj   1/1     Running   0          75m     app=nginx
replicaset-nginx-qwxxr   1/1     Running   0          3m39s   app=nginx
replicaset-nginx-v2ztm   1/1     Running   0          75m     app=nginx

출처

Previouskops로 AWS에 k8s 클러스터 생성하기NextNginx & WSGI pod를 service로 노출하기

Last updated 5 years ago

Was this helpful?

시작하세요! 도커/쿠버네티스
Labels and Selectors