no image
[Kubernetes] ReplicaSet
[쿠버네티스]레플리카셋Replicaset쿠버네티스의 가장 최소의 단위인 포드가 장애가 나거나 실수로 삭제 되었을때는 어떻게 해야할까요? 관리자가 포드를 일일이 상태를 확인하고, 다시 재 배포 하여야 안정적으로 서비스를 운영할 수 있을까요?이를 위해 레플리카셋을 사용합니다. 레플리카셋은 관리자가 원하는 만큼 여러 포드를 실행시킬수 있고 포드가 장애가 나거나 삭제가 되면 쿠버네티스는 실시간으로 파드의 개수를 확인하고 정의된 포드의 수보다 실행되고 있는 포드가 적다면 새로 생성해 줍니다.    예를 들면 레플리카셋을 배포하고 명시된 포드가 3개 실행 되고 있습니다.그런데 갑자기 3번 포드가 장애가 났습니다. 그러면 어떻게 될까요 ?  위와 같이 정의된 포드의 갯수가 3개이기 때문에 쿠버네티스는 3번 포드가 장..
2024.05.09
no image
Raft Consensus Algorithm
Raft 알고리즘을 Kubernetes 카테고리에 넣은 이유는 Kubernetes, ETCD외 Karpenter, AWS LoadBalancer Controller 와 같이 Raft 알고리즘이 사용되는것들의 로그들을 보면 Leader Election 과 비슷한 로그들을 확인 할 수 있다. 그로 인해 Raft 알고리즘에 대해 충분히 이해 하면 Kubernetes 운영 관리자 입장에서 좋을 것 같아 정리 한다. 개요 Raft란 뗏목을 의미하며 분산 시스템 환경에서 일관성 있는 상태를 유지하기 위해 사용되는 합의 알고리즘이다. Kubernetes에서는 Raft 알고리즘을 사용하여 클러스터 내에서 리더를 선출하고, 리더를 통해 클러스터 전체의 일관성 있는 상태를 유지한다. 동작 원리 Raft Consensus ..
2024.04.17
no image
[Kubernetes] Pod
PodPod는 컨테이너 하나 또는 여러개의 애플리케이션 컨테이너들의 그룹을 나타내며 스토리지,IP 주소 그것을 동작시키는 방식에 대한 정보를 포함하고 있습니다. 또 Pod에서 컨테이너들의 일부는 컨테이너에 자원을 공유 할 수 있습니다.공유하는 자원볼륨과 같은 스토리지클러스터 IP와 같은, 네트워킹컨테이너 실행 방식 정보Pod는 쿠버네티스에서 가장 최소의 단위이며, 하나의 Pod에 여러개의 컨테이너를 생성 할 수 있고, 하나의 컨테이너를 담을수 있습니다. 예를 들어 Web컨테이너, App 컨테이너를 Pod에 담아서 배포 할 수 있습니다. Pod에 컨테이너가 새로 생성이 필요 할 때는 추가로 배포 할 수 있습니다.ex) podPod 배포Pod를 배포하는 방법에는 두가지 방법이 있습니다.커맨드 라인을 통한 배..
2024.04.17

[쿠버네티스]레플리카셋

Replicaset

쿠버네티스의 가장 최소의 단위인 포드가 장애가 나거나 실수로 삭제 되었을때는 어떻게 해야할까요? 관리자가 포드를 일일이 상태를 확인하고, 다시 재 배포 하여야 안정적으로 서비스를 운영할 수 있을까요?

이를 위해 레플리카셋을 사용합니다. 레플리카셋은 관리자가 원하는 만큼 여러 포드를 실행시킬수 있고 포드가 장애가 나거나 삭제가 되면 쿠버네티스는 실시간으로 파드의 개수를 확인하고 정의된 포드의 수보다 실행되고 있는 
포드가 적다면 새로 생성해 줍니다.

 

 

 

 

예를 들면 레플리카셋을 배포하고 명시된 포드가 3개 실행 되고 있습니다.
그런데 갑자기 3번 포드가 장애가 났습니다. 그러면 어떻게 될까요 ?

 

 

위와 같이 정의된 포드의 갯수가 3개이기 때문에 쿠버네티스는 3번 포드가 장애가 난 것을 확인하고 새로운 포드를 생성하기 위해 명시된 파드 템플릿을 사용합니다. 레플리카셋은 장애난 파드를 재생성 하기만 하지 않습니다. 만약에명시딘 파드는 3개인데 실행되고 있는 파드는 5개라면 레플리카셋은 2개의 파드를 삭제합니다.

 

Replicaset 배포하기

아래와 같이 레플리카셋을 배포하기 위해 manifest파일을 작성하였습니다.
Pod를 배포할때와 같은 명령어를 사용하시면 됩니다.

kubectl apply -f [배포할 파일].yaml

 

배포하고 난 후 레플리카셋과 파드를 확인해 봅시다.

 

$kubectl get replicaset #레플리카셋을 확인
$kubectl get pods #파드를 확인

위와 같은 명령어를 입력하면 아래와 같이 출력됩니다.

 

test-replicaset-xxxx 라는 파드가 명시된 대로 3개 생성 되었습니다.
제가 설명 드린대로 파드를 한번 삭제해볼까요 ?

pod를 삭제하는 명령어

kubectl delete pod [삭제할 포드 이름]

test-replicaset-kqfx4포드를 삭제했습니다. 그런데 제가 삭제한 포드는 삭제 되었고 test-replicaset-4fx2q 라는 이름을 가진 새로운 파드가 생성 되었습니다. 이와 같이 레플리카셋을 사용하면 더 안정적으로 서비스를 운영 할 수 있습니다. 그런데 포드를 더 생성하고 싶으면 어떻게 하면 될까요 ?

 

replicas 의 숫자를 늘리면 됩니다. 5개로 변경해보고 다시 배포해보겠습니다.

다시 배포하면 파드가 5개로 늘어난 것을 볼 수 있습니다. 이와 같이 레플리카셋은 정말 유용한 워크로드 중 하나입니다.

감사합니다.

'DevOps > kubernetes' 카테고리의 다른 글

Raft Consensus Algorithm  (0) 2024.04.17
[Kubernetes] Pod  (0) 2024.04.17



Raft 알고리즘을 Kubernetes 카테고리에 넣은 이유는 Kubernetes, ETCD외 Karpenter, AWS LoadBalancer Controller 와 같이 Raft 알고리즘이 사용되는것들의 로그들을 보면 Leader Election 과 비슷한 로그들을 확인 할 수 있다.

그로 인해 Raft 알고리즘에 대해 충분히 이해 하면 Kubernetes 운영 관리자 입장에서 좋을 것 같아 정리 한다.

 

개요

Raft란 뗏목을 의미하며 분산 시스템 환경에서 일관성 있는 상태를 유지하기 위해 사용되는 합의 알고리즘이다.
Kubernetes에서는 Raft 알고리즘을 사용하여 클러스터 내에서 리더를 선출하고, 리더를 통해 클러스터 전체의 일관성 있는 상태를 유지한다.

 


동작 원리

Raft Consensus Algorithm은 분산 시스템에서 모든 노드들은 1명의 리더와 나머지 노드들은 팔로워로 구성되며, 후보자는 리더가 응답이 없거나 타임아웃 상태 일 때 일시적으로 발생한다.

  • 리더(Leader) : 리더는 클러스터를 관리하는 핵심 서버이며, 클라이언트의 요청을 모두 처리하고 클러스터의 상태 변경 사항을 모두 기록합니다 로그 복제를 통해 다른 팔로워들에게 복제하며 일관성을 유지한다.
    리더는 반드시 1명이고 다른 노드들은 리더의 지시에 따라 동작한다.

  • 후보자(Candidate) : 리더가 타임아웃 상태이거나 응답이 없으면 새로운 리더 선출을 위해 자신을 후보자로 등록한다 타임아웃이 발생하면 자신의 임기(term)을 증가시키며 팔로워들에게 투표를 요청하며 과반수 이상일 시 자신이 리더가 된다.

  • 팔로워(Follower) : 리더의 지시를 받는 일반 노드이며, 리더의 요청을 받아 로그 복제, 커밋 등의 작업을 수행합니다 일정 시간동안 리더의 요청을 받지 못하면 타임아웃이 발생하여 후보자 상태로 전환 된다.

 


위와 같이 클라이언트는 리더에게만 통신한다 리더는 변경사항을 로그(log)를 생성하여 팔로워들에게 전달 하며 모든 팔로워들에게 복제하여 전달하고 팔로워들은 리더에게 로그에 대한 응답을 리더에게 보낸다.

 

 


 

 

 로그 복제 (Log Replication)

  • 리더는 상태 변화 로그를 기록하고, 이를 다른 노드들에게 복제한다.
  • 로그는 일관성 있게 유지되며, 리더가 변경되더라도 클러스터는 일관성이 유지 된다.

 


 

리더 선출(Leader Election)

Raft 알고리즘에서 리더는 팔로워들의 투표를 받고 과반수가 넘는 팔로워가 리더가 됩니다.

 

리더가 없거나 팔로워가 타임 아웃이 발생할 때 해당 팔로워는 후보자가 되어 새로운 리더 선출을 시작하며 과반수 이상을 받은 팔로워는 리더가 됩니다 리더가 선출 된 후 남은 노들들은 팔로워가 됩니다.

 

순서대로 정리하자면

  1. 클러스터에 리더가 없거나 팔로워의 타임아웃이 발생
  2. 타임아웃이 가장 먼저 발생한 팔로워는 후보자가 된다.
  3. 후보자는 자신에게 먼저 투표하고 노드들에게 투표 요청을 보낸다.
  4. 투표 요청을 받은 노드가 후보자에게 투표 응답을 보내고 자신의 선거 타임아웃을 초기화 한다.
    투표 과정에 있는 노드 외에 후보자가 발생하지 않도록 제어한다.
  5. 과반수 이상을 받은 노드는 새로운 리더로 선출 된다.

 

 

Diego Ongaro, John Ousterhout 논문

 

 

 


 

 

틀린 내용이 있다면 지적 부탁드리겠습니다.

 

감사합니다.

 

 

Ref. https://raft.github.io/

https://raft.github.io/raft.pdf  (논문)

 

Raft Consensus Algorithm

What is Raft? Raft is a consensus algorithm that is designed to be easy to understand. It's equivalent to Paxos in fault-tolerance and performance. The difference is that it's decomposed into relatively independent subproblems, and it cleanly addresses all

raft.github.io

 

 

 

 

 

'DevOps > kubernetes' 카테고리의 다른 글

[Kubernetes] ReplicaSet  (0) 2024.05.09
[Kubernetes] Pod  (0) 2024.04.17

[Kubernetes] Pod

jhyoonzi
|2024. 4. 17. 13:15

 

 

Pod

Pod는 컨테이너 하나 또는 여러개의 애플리케이션 컨테이너들의 그룹을 나타내며 스토리지,IP 주소 그것을 동작시키는 방식에 대한 정보를 포함하고 있습니다. 또 Pod에서 컨테이너들의 일부는 컨테이너에 자원을 공유 할 수 있습니다.

공유하는 자원

  • 볼륨과 같은 스토리지
  • 클러스터 IP와 같은, 네트워킹
  • 컨테이너 실행 방식 정보

Pod는 쿠버네티스에서 가장 최소의 단위이며, 하나의 Pod에 여러개의 컨테이너를 생성 할 수 있고, 하나의 컨테이너를 담을수 있습니다. 예를 들어 Web컨테이너, App 컨테이너를 Pod에 담아서 배포 할 수 있습니다. Pod에 컨테이너가 새로 생성이 필요 할 때는 추가로 배포 할 수 있습니다.

ex) pod

Pod 배포

Pod를 배포하는 방법에는 두가지 방법이 있습니다.

  1. 커맨드 라인을 통한 배포
  2. manifest 파일을 사용한 배포

먼저 1번 커맨드 라인을 통한 배포를 해보겠습니다.

$kubectl run nginx — image nginx:latest — port=80

커맨드 라인 배포

위의 커맨드 라인과 같이 nginx라는 Pod가 생성되었습니다. 보시면 Ready 0/1 이라고 되어 있는데, nginx Pod안에 컨테이너가 1개인 것을 알 수 있고, ContainerCreating 즉 컨테이너가 생성되는 중인 상태입니다.

생성된 Pod의 자세한 정보를 확인하려면 아래 명령어를 사용하여 확인 할 수 있습니다.

 

$kubectl describe pod [pod name]

pod의 상세 정보

다음은 2번 manifest 파일을 사용하여 2개의 컨테이너를 가진 Pod를 배포 해보겠습니다.

manifest파일로 Pod를 배포하려면 yaml 포맷을 사용하여 배포합니다.
아래와 같이 간단한 yaml 파일을 작성하였습니다.

yaml 파일을 작성하는 방법은 아래와 같은니 참고 부탁드립니다.

 

 

아래와 같이 Pod를 배포할 yaml 파일을 작성하였습니다. 
manifest 파일을 통해 pod를 배포하는 명령어는 아래와 같습니다.

$kubectl apply -f [배포할 파일].yaml

 

 

배포를 하고나서 Pod가 잘 생성되었는지 확인합니다.
아래와 같이 nginx라는 pod안에 컨테이너가 2개 전부 실행되고 있는것을 볼 수 있습니다.

 

Pod의 상세한 정보를 확인하려면 아래 명령어를 입력합니다.

$kubectl describe pod [Pod 이름]

 

 

Pod의 생명주기

파드는 생성 부터 삭제까지의 과정에 생명 주기가 있습니다.

  • Pedning 
    쿠버네티스 시스템에 파드를 생성하는 중임을 뜻하며, 컨테이너 이미지를 다운로드 후 전체 컨테이너를 실행하는 상태입니다.
  • Running
    파드 안의 모든 컨테이너가 실행중인 상태를 의미합니다.
  • Succeeded
    파드 안 모든 컨테이너가 정상 실행 종료된 상태로 재시작 되지 않습니다
  • Failed
    파드 안 모든 컨테인너 중 정상적으로 실행 종료되지 않은 컨테이너가 있는 상태입니다.
  • Unknown
    파드 안의 상태를 확인 할 수 없는 상태이며, 보통 파드가 있는 노드와 통신할 수 없을 때 입니다.

감사합니다.

'DevOps > kubernetes' 카테고리의 다른 글

[Kubernetes] ReplicaSet  (0) 2024.05.09
Raft Consensus Algorithm  (0) 2024.04.17