2 분 소요

Kubernetes

  • 그리스어로 조타수라는 뜻으로 오늘날 사실상 표준으로 사용되고 있는 컨테이너 오케스트레이션 도구이다.

  • 쿠버네티스는 도커 스웜 모드처럼 여러대의 도커 호스트를 하나의 클러스터로 만들어 준다는 점은 같지만, 세부적인 기능을 더욱 폭넓게 제공하고 있다.


쿠버네티스의 장점

  • 서버 지원 클러스터링, 마이크로서비스 구조의 컨테이너 배포, 서비스 장애 복구 등 컨테이너 기반의 서비스 운영에 필요한 대부분의 오케스트레이션 기능을 폭넓게 지원한다.

  • 구글, 레드햇을 비롯한 많은 오픈소스 진영에서 쿠버네티스의 소스코드에 기여하고 있기 때문에 성능과 안정성 면에서 신뢰를 받고 있다.

  • 영속적 볼륨, 스케줄링, 장애복구, 오토 스케일링, 서비스 디스커버리 및 인그레스(Ingress) 등 컨테이너 기반의 클라우드를 운영할 때 필요한 대부분의 기능과 컴포넌트를 사용자가 직접 커스터마이징 할 수 있다.

  • CNCF(Cloud Native Computing Foundation) 및 다른 클라우드 운영 도구들과 쉽게 연동되므로 확장성이 높다.


쿠버네티스 설치

  • 쿠버네티스의 사용 환경은 크게 두 가지 종류로 나뉜다.

  • 첫 번째는 AWS, GKE 등의 클라우드 플랫폼 환경이고, 두 번째는 자체적으로 보유한 온프레미스(on-premise) 서버 환경이다.

  • 개발 용도의 쿠버네티스 설치 - Docker for Mac / windows에서 쿠버네티스 사용 Docker를 설치 했다면 쿠버네티스를 별도로 설치하지 않아도 된다.

  • 쿠너네티스는 일반적인 서버 클러스터 환경에서도 쿠버네티스를 쉽게 설치할 수 있는 kubeadm이라는 관리 도구를 제공한다.

# 마스터와 워커 노드 생성시 주의해야할 점 

- 모든 서버가 2GB, 2 CPU 이상의 충분한 자원을 가지고 있는지 확인한다.

- 다음 명령으로 메모리 스왑(Swap)을 비활성화 한다. 

- 메모리 스왑이 활성화 되어 있으면 컨테이너의 성능이 일관되지 않을 수 있기 때문에 쿠버네티스 설치 도구는 메모리 스왑을 허용하지 않는다. swapoff -a

# kubectl 사용법

1. Kubectl run으로 컨테이너 실행하기
Kubectl run 디플로이먼트명 --image 컨테이너이미지명 --port=포트번호
Kubectl create deploment 디플로이먼트명 --image 컨테이너이미지명 --port=포트번호
Run은 pod 1개만 생성하고 관리해 준다. (여러 개의 컨테이너가 모여서 1개의 pod를 만든다.)
Create는 그룹 내 1개를 생성하고 관리해 준다.
Run으로 생성한 파드는 초코파이 1개이고, create로 생성한 파드는 초코파이 박스 안에 있는 초코파이 1개이다.
  
kubectl create deployment nginx-app --image nginx --port=80
kubectl get pods // 파드 명령어 확인
kubectl get deployments // 전체 deployment의 현황 확인
kubectl scale deploy nginx-app --relicas=2 // 레플리카를 2개로 늘림
kubectl get pods
kubectl get deployments //  사용자가 최종 배포한 파드 갯수와 실제로 동작하는 파드 갯수가 각각 2개라는 뜻,  nginx-app이 라는 디플로이먼트 안에 각각 다른 pod 2개가 있다.
kubectl delete deployment nginx-app // 디플로이먼트 삭제
# 템플릿으로 컨테이너 실행하기

cd /
vi nginx-app.yaml
!
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  labels:
    app: nginx-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-app
  template:
    metadata:
       labels:
         app: nginx-app
    spec:
      containers:
      - name: nginx-app
        image: nginx
        ports:
        - containerPort: 80
!
kubectl apply -f nginx-app.yaml
kubectl get pods // deployment 1개에 pod 1개를 확인

kubectl get rs // 레플리가 셋 레플리카를 확인할 수 있다.
# 클러스터 외부에서 클러스 내부에 접근하기

위에서 실행중인 nginx 컨테이너에 접근하려고 localhost:80 으로 접근하면 실패한다. 
이는 쿠버네티스 내부에서 사용하는 네트워크가 외부와 격리되었기 때문이다.
쿠버네티스 내부에서 실행한 컨테이너를 외부에서 접근하려면 서비스를 사용해야 한다.
서비스타입은 pdf에 있는것 처럼 ClusterIP, NodePort, LoadBanlancer가 있다. 
여기서 NodePort에 대하여 살펴보도록 하자.


kubectl expose deployment nginx-app --type=NodePort // nginx app을 nodeport로 서비스한다. 즉 외부 포트로 노출
kubectl get service // 이제부터 node port로 외부에 노출이 됨.
http://localhost:30847, 192.168.0.100:30847 // nginx 가 보이는것을 확인 내 port넘버가 30847

# 지우고 다시

kubectl delete deployment,service,pod --all 
kubectl apply -f nginx-app.yaml
kubectl expose deployment nginx-app --type=NodePort
kubectl get serivce // 서비스된 포트번호로 모든 master를 포함 모든 node는 접근이 가능하다

댓글남기기