ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes 기본적인 이론 / 설치 및 명령어 내용 기록
    Kubernetes 2024. 5. 1. 23:55

     

     

    소프트웨어 마에스트로의 꽃인 멘토 특강을 수강하면서 배웠던 내용들을 기록하고 되새김하기 위해 작성한 글입니다!

     

     

    멘토님의 쿠버네티스 기본 과정 총 4회 차 중, 1회 차는 아래의 내용을 다뤘습니다.

    가상화 기술 / 컨테이너 / Docker의 이해

    Docker 설치 및 기본 사용법 

    Docker 이미지 생성과 Docker Hub의 사용 

    쿠버네티스 기본 이론 

    kubectl 설치 및 기본 명령어 습득 

    Pod의 이해와 생성

     

     

     

    Docker

    Kubernetes를 배우려는데 갑자기 Docker가 웬 말이냐?라고 할 수도 있습니다.

     

    Kubernetes는 클러스터 내에서 컨테이너화된 애플리케이션을 효율적으로 관리하고 운영하기 위해 사용되는데,

    Docker를 알고 이해함으로써 컨테이너 기술의 기본 개념과 작동 방식을 습득하게 된다면

    k8s를 배울 때 보다 효과적으로 학습하고 응용할 수 있기 때문입니다.

     

    Docker는 애플리케이션을 개발,전달 및 실행하기 위한 개방형 플랫폼으로

    Docker를 사용하므로써, 개발자의 코드작성과 프로덕션 환경에서 실행하는 사이의 갭을 크게 줄일 수 있다는 장점을 가집니다.

     

    도커에서 말하는 이미지는 컨테이너를 생성하기 위한 빌드 및 실행 환경을 정의하는 템플릿이고, 

    컨테이너는 이러한 이미지의 인스턴스로, 실제로 실행되고 관리되는 독립적인 프로세스입니다. 

     

    즉 도커 이미지는 컨테이너를 만들고 실행하는 데 사용되며,

    하나의 이미지에서 여러 개의 컨테이너 인스턴스를 생성할 수 있습니다.

     

     

     

    Kubernetes

    계속 도커를 사용하며 컨테이너들을 관리하다가...

    프로젝트의 스케일이 커지게 되면서 수십 수 백 개의 여러 컨테이너로 구성되면

    이러한 컨테이너 간의 관계, 스케일링, 로드 밸런싱, 서비스 디스커버리 등을 관리하는 것이 복잡해집니다.

    그러므로 컨테이너 오케스트레이션을 위한 k8s를 사용하면 효과적으로 관리, 운영을 할 수 있게 됩니다!

     

    쿠버네티스란?

    • 쿠버네티스란 명칭은 키잡이(helmsman)나 파일럿을 뜻하는 그리스어에서 유래했다.
    • k8s라는 표기는 "K"와 "s"와 그 사이에 있는 8글자를 나타내는 약식 표기이다.
    • 구글이 2014년에 쿠버네티스 프로젝트를 오픈소스화했다.

     

    쿠버네티스의 장점

    여러 장점들이 있지만 대표적으로 아래와 같은 장점들이 존재합니다.

    • 자동 확장: 사용량에 따라 컨테이너화된 애플리케이션 및 해당 리소스를 자동으로 확장 또는 축소한다.
    • 선언적 모델: 원하는 상태를 선언하면 k8s가 백그라운드에서 작동하여 해당 상태를 유지하고 모든 장애에서 복구한다.
    • 부하분산: k8s는 다양한 요구사항을 해결하기 위해 다양한 내부 및 외부 부하 분산 옵션을 지원한다.

     

     

    쿠버네티스 컴포넌트

    쿠버네티스 클러스터는 컨테이너화된 애플리케이션을 실행하는 노드(Node)라고 하는 워커 머신의 집합으로,

    모든 클러스터는 최소 한 개의 워커 노드를 가집니다.

     

    워커 노드는 애플리케이션의 구성요소인 파드(Pod)를 호스트하고,

    컨트롤 플레인(Control Plane)은 워커 노드와 클러스터 내 파드를 관리합니다.

     

    master / slave라는 용어 대신
    master -> control plane (제어판)
    slave ->  node (일꾼)
    두 가지를 묶어서 cluster라는 단어를 사용합니다.

     

    위 사진에서는 노드의 개수가 3개 이므로, 가상머신 3개를 가지고 있는 k8s 클러스터입니다.

     

    Pod

    바로 위에서 잠깐 파드를 언급했었습니다.

    파드는 하나 또는 그 이상의 애플리케이션 컨테이너(도커와 같은)들의 그룹이고

    공유 스토리지(볼륨), IP 주소 그리고 그것을 동작시키는 방식에 대한 정보를 포함하고 있습니다.

     

    Pod는 Kubernetes 클러스터 내에서 실행되는 가장 작은 배포 단위로 보면 될 것 같습니다.

     

    중요한 점은 만약 컨테이너들이 밀접하게 결합되어 있고

    디스크와 같은 자원을 공유해야 한다면 오직 하나의 단일 파드에 함께 스케줄 되어야 한다고 합니다.

     

    또한 Pod 내의 각 컨테이너는 고유한 IP 주소와 호스트 이름을 가지며, 서로 다른 컨테이너 간의 포트 충돌을 방지합니다.

    Pod는 수명 주기가 있으며, 새로운 Pod는 생성(create)되고, 삭제(delete)할 수 있으며, 일시 중지(suspend)하거나

    재개(resume)할 수도 있습니다. Pod를 삭제하면 Pod 내의 모든 컨테이너도 함께 삭제됩니다.

     

    Node

    노드는 쿠버네티스에서 워커 머신을 말하며, 클러스터에 따라 가상 또는 물리 머신일 수 있습니다.

    파드는 언제나 노드 상에서 동작하고, 각 노드는 컨트롤 플레인에 의해 관리됩니다.

    하나의 노드는 여러 개의 파드를 가질 수 있고,

    쿠버네티스 컨트롤 플레인은 클러스터 내 노드를 통해서 파드에 대한 스케쥴링을 자동으로 처리합니다.

    또한 컨트롤 플레인의 자동 스케줄링은 각 노드의 사용 가능한 리소스를 모두 고려합니다.

     

     

    그리고 kubelet이라고 하는 각 노드에서 동작하는 중요한 구성 요소가 있습니다.

    kubelet은 쿠버네티스 워커 노드에서 동작하는 에이전트(agent)로,

    각 노드에서 실행되는 Pod을 관리하고 클러스터의 상태를 유지합니다.

    kubelet은 쿠버네티스 API 서버와 통신하여 Pod 생성, 업데이트, 삭제 등의 요청을 처리하고, 

    노드 자원(CPU, 메모리, 디스크)을 모니터링하고 이에 대한 정보를 API 서버에 보내어 전체 클러스터의 상태를 유지한다고 합니다.

     

     

    보다 자세한 내용들은 아래 쿠버네티스 공식 문서의 쿠버네티스 기초 학습 섹션에서 확인할 수 있습니다!

     

    쿠버네티스 기초 학습

    운영 수준의 컨테이너 오케스트레이션

    kubernetes.io

     

     

     

     

    도커 데스크탑에서 쿠버네티스 설치 및 실행하기

    우선은 아래 링크를 통해서 docker desktop이랑 kubectl CLI를 설치해 줍니다.

     

    도커 데스크탑 설치하기 

    https://www.docker.com/products/docker-desktop/

     

    자신의 실습 PC 운영체제에 맞게 kubectl CLI 설치하기 (저는 macos)

    https://kubernetes.io/ko/docs/tasks/tools/install-kubectl-macos/

     

    Docker Desktop을 실행한 모습

     

     

    저의 경우 이미 설치가 되어있기 때문에 Apply & restart가 안 먹히고 있는데

    Settings > Kubernetes > Enable Kubernetes > Apply & restart 클릭하시면 됩니다!

     

    설치가 완료되면 상단 트레이의 도커 아이콘을 클릭했을 때

    아래와 같이 쿠버네티스의 동작 여부도 확인할 수 있게 됩니다.

     

     

     

    이제 터미널을 켜서 k8s가 잘 설치되었는지 확인해 봅시다

    kubectl version 확인

     

     

    위와 같이 도커 이미지를 확인하면 k8s 설치 작업을 하면서

    k8s 실행을 위한 여러 컨테이너 이미지가 사용되었음을 알 수 있습니다.

     

    k8s에서 현재 클러스터에 등록된 모든 노드의 상태와 관련 정보를 아래 명령어를 통해 출력해 보겠습니다.

    $ kubectl get nodes -o wide

     

    이번에는 k8s 운영을 위해 돌아가는 Pod들을 확인해보겠습니다.

    $ kubectl get pods -A

     

     

     

     

    kubectl 기본 명령어들 학습

    kubectl 명령어들

    https://jamesdefabia.github.io/docs/user-guide/kubectl/kubectl/

     

    k8s 클러스터를 관리하고 모니터링하기 위해

    자주 사용하는 몇 가지 기본 명령어들을 정리해보면 아래와 같습니다.

     

    • kubectl get : 리소스 가져오기
      • kubectl get pods : 클러스터 내의 모든 Pod 목록을 가져옵니다. 
      • kubectl get nodes : 클러스터 내의 모든 노드 목록을 가져옵니다. 
      • kubectl get services : 클러스터 내의 모든 서비스 목록을 가져옵니다. 
      • kubectl get deployments : 클러스터 내의 모든 배포 목록을 가져옵니다.

     

    • kubectl describe : 자원에 대한 상세한 정보를 보여주기
      • kubectl describe pod <pod_name> : 특정 Pod의 세부 정보를 가져옵니다.
      • kubectl describe node <node_name> : 특정 노드의 세부 정보를 가져옵니다.
      • kubectl describe service <service_name> : 특정 서비스의 세부 정보를 가져옵니다.
      • kubectl describe deployment <deployment_name> : 특정 배포의 세부 정보를 가져옵니다.

     

    • kubectl create: 리소스 생성 
      • kubectl create deployment <deployment_name> --image=<container_image>: 새로운 배포 생성합니다.

     

    • kubectl delete: 리소스 삭제
      • kubectl delete pod <pod_name>: 특정 Pod를 삭제합니다.
      • kubectl delete node <node_name>: 특정 노드를 삭제합니다.
      • kubectl delete service <service_name>: 특정 서비스를 삭제합니다.
      • kubectl delete deployment <deployment_name>: 특정 배포를 삭제합니다.

     

    • kubectl logs: Pod 로그 확인 
      • kubectl logs <pod_name>: 특정 Pod의 로그를 출력합니다. 
      • kubectl logs -f <pod_name>: 특정 Pod의 로그를 실시간으로 스트리밍합니다.

     

     

     

    Pod와 Deployment 실습

    라이브 수업에서 docker를 통해 pull 받은 nginx 이미지를 가지고 pod를 생성해보겠습니다!

    $ kubectl run webapp --image=nginx --port=80

     

    Kubernetes 클러스터에서 webapp이라는 이름의 새로운 Deployment가 생성됩니다.

    해당 Deployment는 Nginx 이미지를 사용하여 파드를 생성하고,

    이 파드는 포트 80을 노출하여 외부와 통신할 수 있도록 설정됩니다.

     

    이번에는 Pod가 잘 생성되었는지 확인해보겠습니다.

    내부 IP로 잘 생성된 것을 확인할 수 있습니다.

     

    k8s 클러스터 내에서 실행 중인 webapp 파드 안의 

    컨테이너에서 curl http://localhost 명령어를 실행해 볼 수 있습니다.

    80포트로 노출시켰던 nginx 내용이 잘 표시되는 것을 확인할 수 있습니다.

     

    또한

    kubectl exec webapp -it -- /bin/bash 명령어로 파드 내부로 진입할 수 있고

    kubectl delete pod webapp 명령어로 파드를 지울 수 있습니다.

     

     

    yaml 파일로 pod 생성해보기

    Pod는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이지만,

    Pod 1개에 여러 개의 컨테이너를 설정하여 사용할 수 있습니다.

    그러므로 yaml 파일 안에 여러 컨테이너 이미지를 작성하여 Pod를 생성할 수 있는 것입니다!

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-redis
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 81
      - name: redis
        image: redis
        ports:
        - containerPort: 6379

     

    위와 같이 Redis 컨테이너 이미지와 nginx 컨테이너 이미지를 사용하는 Pod의 구성 파일을 작성해보겠습니다.

    simple-pod2.yaml라는 이름으로 작성해보았습니다.

     

    그리고 아래 명령어를 통해 pod를 생성해봅니다.

    $ kubectl create -f simple-pod2.yaml

     

     

    아까 생성했던 webapp과 함께 두 개의 pod가 존재하는 것을 확인할 수 있습니다.

    각 pod들은 아래와 같이 구성되어 있다고 할 수 있겠습니다.

    • webapp 파드 - nginx 80포트 컨테이너
    • nginx-redis 파드 - nginx 81포트 컨테이너, redis 6379포트 컨테이너

     

     

    수정하고 싶다면, 조건에 맞게 각각의 명령어를 사용해주면 된다고 합니다.

    $ kubectl edit pod nginx-redis
    
    $ kubectl apply -f simple-pod2.yaml
    
    $ kubectl replace -f simple-pod2.yaml

     

    삭제를 하고 싶다면

    $ kubectl delete -f simple-pod2.yaml

     

    모든 pod들을 삭제하고 싶다면?

    $ kubectl delete pod --all

     

    참고로 모든 Pod 상태 변화를 지속적으로 모니터링하고 싶다면!!! (유용)

    $ kubectl get pods --watch

     

     

    Deployment를 사용하여 Pod 관리하기

    갑자기 튀어나온?! Deployment에 대해서 얘기하보자면

    Deployment는 Pod를 관리하는 추상적인 개념으로, Deployment를 사용하여 Pod를 생성, 업데이트 및 롤백할 수 있습니다. 

    즉, Deployment는 Pod을 관리하는 컨트롤러 역할을 합니다. 

     

    Deployment를 사용하면 새로운 버전의 Pod을 쉽게 배포하고, 이전 버전의 Pod을 삭제하거나 롤백할 수 있습니다. 

    또한 Deployment는 롤링 업데이트를 지원하여 서비스 중단 없이 업데이트를 수행할 수 있습니다.

     

    정리하자면

    Pod과 Deployment의 가장 큰 차이점은 Pod는 컨테이너의 실행 단위이며,

    Deployment는 Pod을 관리하는 컨트롤러 역할을 한다는 것입니다.

     

     

    그렇다면 이제 Replicas를 사용하여 deployment 생성을 해보겠습니다!

    $ kubectl create deployment webserver --image=nginx --replicas=2

     

    아래와 같이 똑같은 이미지 2개를 잘 생성해 주는 것을 확인할 수 있습니다.

     

     

    혹시 아까 위에서 말했던 watch 명령어가 기억나시나요??

    watch로 모니터링하면, delete해도 replicas를 2개로 설정했으므로 또 새로운 pod가 생기는 것을 확인할 수 있습니다. (신기하다)

     

     

    또한

    Deployment를 yaml 파일로 직접 작성해서 생성할 수도 있다고 합니다!

    https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

     

     

     

     

     

     

    출처

     

     

    파드와 노드 보기

    <!DOCTYPE html> 목표 쿠버네티스 파드에 대해 배운다. 쿠버네티스 노드에 대해 배운다. 배포된 애플리케이션의 문제를 해결한다. 쿠버네티스 파드 모듈 2에서 배포를 생성했을 때, 쿠버네티스는 여

    kubernetes.io

     

     

    macOS에 kubectl 설치 및 설정

    시작하기 전에 클러스터의 마이너(minor) 버전 차이 내에 있는 kubectl 버전을 사용해야 한다. 예를 들어, v1.30 클라이언트는 v1.29, v1.30, v1.31의 컨트롤 플레인과 연동될 수 있다. 호환되는 최신 버전

    kubernetes.io

     

     

     

    [Docker] 왜 도커(Docker)를 사용해야 하는가?

    개발자의 PC에서 잘 작동하던 애플리케이션이 서버에 올리고 나서 에러가 발생하는 경우가 있다. PC와 ...

    blog.naver.com

     

     

     

    [Docker] 도커 데스크톱 버전에서 쿠버네티스 실행하기

    쿠버네티스 학습을 위한 hands-on-lab 환경을 찾아보면 대략 아래와 같이 귀결된다. ① 쿠버네티스가 설치...

    blog.naver.com

     

     

     

     

    쿠버네티스 리소스 생성을 위한 YAML 파일 설정

    Explain 명령으로 오브젝트 별 API 버전을 알 수 있다. pod의 경우 v1, deployment는 apps/v1이다. Po...

    blog.naver.com

     

     

     

Designed by Tistory.