쿠버네티스의 특징 및 포드(pod) 개념, Nginx-pod.yaml 작성 예시

All We Need is Data, itself !·2022년 1월 25일
1

Docker/Kubernetes

목록 보기
3/7

ref: 시작하세요 도커/쿠버네티스


Kubernetes의 특징

  1. 모든 리소스는 오브젝트 형태로 관리된다.
  • 쿠버는 대부분의 리소스를 '오브젝트'라고 불리는 형태로 관리함
  • 컨테이너의 집합(pods), 컨테이너의 집합을 관리하는 컨트롤러(replica set), 사용자(user), 노드(node) 이 모든 것을 오브젝트로 사용할 수 있음.
  • 쿠버에서 사용할 수 있는 오브젝트 확인하기
kubectl api-resources

그러나 이 오브젝트를 다 알 필요는 없음, 필요할 때마다 검색 ~!!

  • 특정 오브젝트의 설명 보기
kubectl explain pod

  1. 쿠버는 명령어로도 사용할 수 있지만, yaml 파일을 더 많이 사용한다.
  • 쿠버에서 yml 파일의 용도는 컨테이너뿐만 아니라 거의 모든 리소스 오브젝트에 사용될 수 있다는 것

    • 컨테이너 자체는 물론이고, configmap, secrets 등도 모두 yml 파일로 정의해서 사용한다.
    • 실제로 서비스를 배포할 때도 kubectl이 아니라 여러 개의 yml 파일을 정의해 적용시키는 방식으로 동작함
  • 따라서 쿠버를 잘 사용하는 방법은 yaml 파일을 잘 작성하는 것


  1. 쿠버는 여러 개의 컴포넌트로 구성되어 있다.
  • 노드의 역할을 크게 마스터와 워커로 나뉘어져 있고, 마스터 노드는 관리자, 워커 노드에는 애플리케이션 컨테이너임

  • 도커 스웜 모드는 단일 도커 데몬만을 설치해 사용하지만, 쿠버는 도커를 포함한 많은 컴포넌트들이 실행됨.

    • 마스터 노드에서는 API 서버(kube-apiserver), 컨트롤러 매니저(kube-controller-manager), 스케줄러(kube-scheduler), DNS 서버 (coreDNS)등이 실행된다.
    • 모든 노드에서는 오버레이 네트워크 구성을 위해 프록시(kube-proxy)와 네트워크 플러그인(calico, flanner 등)이 실행된다.
  • 또한 이런 컴포넌트들은 기본적으로 도커 컨테이너로서 실행되고 있음.

  • 마스터 노드에 SSH로 접속해 docker ps 명령어를 실행해보면 많은 컨테이너가 실행되고 있는 것을 확인할 수 있음.

  • 그리고 쿠버의 클러스터 구성을 위해 kubelet이라는 에이전트가 모든 노드에서 실행됨.

    • kubelet은 컨테이너의 생성, 삭제 뿐만 아니라 마스터와 워커 노드 간의 통신 역할을 함께 담당하는 중요한 에이전트임.
    • 따라서 kubelet이 제대로 실행되지 않으면 쿠버와 노드가 연결되지 않을 수 있음.


    쿠버의 입장에서 보면 도커 데몬 또한 하나의 컴포넌트 - 쿠버네티스는 도커에 내장된 기능이 아니기 때문.
    오히려 컨테이너를 사용하기 위해 쿠버네티스가 도커를 이용하는 방식이므로 쿠버네티스에서 반드시 도커를 사용해야 하는 것은 아니며, OCI(Open Container Initiative)라는 컨테이너의 런타임 표준을 구현한 CRI(Container Runtime Interface)를 갖추고 있다면 어떠한 컨테이너를 써도 문제는 없음.



    Pod란?

    쿠버 내에 있는 다양한 리소스 중에서 반드시 알아야 할 몇 가지의 오브젝트

  • 포드(pod)
    저는 팟이라고 합니다....혼용 주의

  • 레플리카 셋(replica set)

  • 서비스 (service)

  • 배포 (deployment)

    pod 사용하기

    도커 엔진의 기본 단위 = 도커
    쿠버네티스는 컨테이너 애플리케이션을 배포하기 위한 기본 단위로 pod을 사용
    한개의 pod에는 1개의 container만이 존재할 수도 있고, 여러 개가 있을 수도 있음.

    간단한 예시로, nginx 웹 서비스를 쿠버네티스에서 생성하려면 컨테이너와 팟을 어떻게 사용할 수 있을까? 가장 쉬운 방법은 팟 1개에 nginx 컨테이너 1개만을 포함해 생성하는 것이고, 만약 동일한 nginx 컨테이너를 여러 개 생성하고 싶다면 1개의 nginx 컨테이너가 들어 있는 동일한 팟을 여러개 생성하면 된다.

    nginx-pod.yaml 파일 작성해보기

apiVersion: v1
kind: Pod
metadata:
        name: my-nginx-pod
spec:
        containers:
                - name: my-nginx-container
                  image: nginx:latest
                  ports:
                         - containerPort: 80
                           protocol: TCP


pod 생성하기

  • 작성한 yml 파일 쿠버네티스에 생성하기 - 새로운 팟 생성하기
kubectl apply -f nginx-pod.yaml


성공!


  • 특정 오브젝트의 목록 확인하기
kubectl get <오브젝트>

이 nginx 팟을 생성할 때, yml 파일에 사용할 포트(containerPort)를 정의하긴 했지만, 아직 외부에서 접근할 수 있도록 노출된 상태는 아님!
따라서 팟의 nginx 서버로 요청을 보내려면 팟 컨테이너의 내부 IP로 접근해야 함.

kubectl describe pods [팟 이름]

위의 명령어를 사용하면 생성된 리소스의 자세한 정보를 얻어올 수 있음.

팟의 내부 IP는 192.168.1.2 인 것을 확인할 수 있음.
그러나 이건 외부에서 접근할 수 있는 IP가 아니기 때문에 클러스터 내부에서만 접근 가능.
docker run 에서 -p 옵션을 안한 거랑 비슷함

쿠버네티스 외부 또는 내부에서 팟에 접근하려면 서비스(service)라고 하는 쿠버네티스 오브젝트를 따로 생성해야 하지만, 지금은 서비스 오브젝트 없이 IP만으로 nginx 팟에 접근할 것.

클러스터의 노드 중 하나로 접속한 뒤 nginx 팟의 IP로 HTTP 요청을 전송, 이로써 nginx 팟이 정상적으로 활동중인지 체크할 수 있다.

worker 노드에서 확인했을 때 잘 실행중인 것을 볼 수 있음.

pod container 내부로 직접 들어가 보기

docker exec 명령어와 비슷하게 kubectl exec 명령어 실행 가능

kubectl exec -it my-nginx-pod bash

다음과 같이 my-nginx-pod에서 배시 셀을 실행하되, -it 옵션으로 셀 유지 가능

kubectl logs my-nginx-pod

docker logs 처럼 kubectl logs 를 사용할 수 있음.

삭제

# kubectl delete -f nginx-pod.yaml
# kubectl delete pod [팟 이름]

위의 코드는 nginx-pod.yaml에 정의된 nginx 팟을 삭제하는 코드임.


profile
분명히 처음엔 데린이었는데,, 이제 개린이인가..

0개의 댓글