Kubernates 맛보기

진이진이·2022년 6월 23일
0
post-thumbnail

Kubernetes란?

Linux 컨테이너 작업을 자동화하는 오픈소스 플랫폼이며, 컨테이너 운영 환경 중 가장 널리 사용되는 컨테이너 오케스트레이션툴 중 하나다.

  • 컨테이너 오케스트레이션 (Container Orchestration)

    : 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화 + 컨테이너 라이프사이클을 관리하면
    CICD 워크플로우에 이를 통합하는 DevOps 팀을 지원가능
    ex ) Kubernetes, Docker Swarm, Apache Mesos

    K8s

    쿠버네티스란 명칭은 키잡이(helmsman)나 파일럿을 뜻하는 그리스어에서 유래됐고, K8s라는 표기는 "K"와 "s"와 그 사이에 있는 8글자를 나타내는 약식 표기라고 한다.

📌간단한 용어 정리

많은 블로그에서 쿠버네티스는 도커를 다루는 도구다 라고 쓰여있다.
틀린말은 아니지만 쿠버네티스는 컨테이너 런타임 중 도커라는 툴을 기반으로 컨테이너를 다루는 것이다.

왜 사용하는가?

Docker는 한 개의 컨테이너만 사용이 가능하지만 Kubernates는 여러개의 다중 컨테이너 사용이 가능하다.

쿠버네티스 아키텍처

  • 마스터 ✅ 노드에 배포된 컨테이너를 관리하는 역할을 합니다.
  • 노드 ✅ 컨테이너가 배포되는 환경을 제공( 컨트롤 플레인에서 할당된 요청 태스크를 수행하는 머신 )
  • 파드 ✅ 파드(Pod)는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위입니다.

설치하기

  1. EC2 생성

  2. 도커&라이브러리 설치

    sudo apt-get update
    
    sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
    
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    
    sudo apt-get update
    
    sudo apt-get install -y docker-ce docker-ce-cli containerd.io
    
    sudo usermod -aG docker $USER
  3. 쿠버네티스 마스터 설치

  4. 클러스터 구축을 위한 설치 작업

  • 구글 클라우드의 공개 사이닝 키를 다운로드

    sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
  • 쿠버네티스 apt 리포지터리 추가

    echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
  • apt 패키지 색인을 업데이트

    sudo apt-get update
  • kubelet, kubeadm, kubectl을 설치

    sudo apt-get install -y kubelet kubeadm kubectl
  • 버전 고정

    sudo apt-mark hold kubelet kubeadm kubectl
  • 도커 데몬의 드라이버를 교체

    cat <<EOF | sudo tee /etc/docker/daemon.json
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2"
    }
    EOF
  • 도커 데몬 재실행( 한줄씩 실행 ❗❗ )

    sudo systemctl enable docker
    
    sudo systemctl daemon-reload
    
    sudo systemctl restart docker
    
    # kubelet가 실행인지 확인
    sudo systemctl status kubelet
    # 실행중이 아닐 경우
    sudo systemctl start kubelet
  • 클러스터 초기화

    sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  • 에러 : unknown service runtime.v1alpha2.RuntimeService 발생 시❗❗

    sudo rm /etc/containerd/config.toml
    sudo systemctl restart containerd
    sudo kubeadm init --pod-network-cidr=10.244.0.0/16
  • ❗ 클러스터 리셋( 초기화 에러발생시 )

    sudo kubeadm reset
    rm -rf $HOME/.kube/config
  • 완료확인 ( join 명령어 )

  • kubectl 사용 설정

    mkdir -p $HOME/.kube
    
    sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    
    sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 마스터 제한 제거( 옵션 )

    kubectl taint nodes --all node-role.kubernetes.io/master-
  1. CNI 설치
    CNI( Container Network Interface ) 란?
    : 컨테이너 간의 네트워킹을 제어할 수 있는 플러그인을 만들기 위한 표준.

  • 노드 상태 체크

    kubectl get nodes
  • 현재 상태 체크

    kubectl get pod --all-namespaces
  • 설치

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 쿠버네티스 노드 설치 (EC2 인바운드 규칙 )

  • 도커설치

  • 쿠버네티스 설치(클러스터 초기화 전까지!!)

  • 조인 명령어 실행

포드

포드 조회

  • 네임스페이스 조회
    kubectl get namespaces
  • 포드 조회
    kubectl get pod -n kube-system
  • .yaml 파일 만들기
    쿠버네티스 오브젝트 이해하기
    apiVersion - 이 오브젝트를 생성하기 위해 사용하고 있는 쿠버네티스 API 버전이 어떤 것인지
    kind - 어떤 종류의 오브젝트를 생성하고자 하는지
    metadata - 이름 문자열, UID, 그리고 선택적인 네임스페이스를 포함하여 오브젝트를 유일하게 구분지어 줄 데이터
    spec - 오브젝트에 대해 어떤 상태를 의도하는지
    example )
    apiVersion: v1
    kind: Pod
    metadata:
              name: my-springboot-pod
              labels:
                    app: my-springboot-pod
    spec:
            containers:
                    - name: my-springboot-app
                      image: wkdgudcjf/my-repo
                      ports:
                             - containerPort: 8080
  • 파드 생성
    kubectl apply -f ${metadata name}.yaml
  • 파드생성 확인
    kubectl get -f ${metadata name}.yaml
  • 파드 상세 정보
    kubectl describe -f ${metadata name}.yaml
  • 파드 로그 보기
    kubectl logs -f ${metadata name}
  • 파드 삭제
    kubectl delete -f ${metadata name}.yaml

서비스

서비스 만들기

  • 파일 만들기
    vim my-springboot-svc.yaml
  • yaml 파일
    apiVersion: v1
    kind: Service
    metadata:
              name: my-springboot-svc
    spec:
            selector:
                    app: my-springboot-pod
            ports:
                    - protocol: TCP
                      port: 8080
                      targetPort: 8080
            type: NodePort
  • 서비스 생성
    kubectl apply -f my-springboot-svc.yaml
  • 서비스 정보
    kubectl get -f my-springboot-svc.yaml
  • 서비스 상세 정보
    kubectl describe -f my-springboot-svc.yaml
profile
개발 어린이

0개의 댓글