Kubernetes

    Kubernetes, GitHub Actions, ArgoCD를 사용한 자동화 CI/CD 파이프라인 구축기

    Kubernetes, GitHub Actions, ArgoCD를 사용한 자동화 CI/CD 파이프라인 구축기

    Summary 졸업과제 프로젝트를 진행하면서 Kubernetes를 사용해 CI/CD 파이프라인을 구축했던 과정을 정리한 글이다. 쿠버네티스를 어떻게 구축했는지, 어떤 서비스를 구축했는지를 볼 수 있다. main branch로의 merge 한번으로 테스트, 애플리케이션 빌드, 도커 이미지 빌드, 배포를 진행할 수 있는 파이프라인을 볼 수 있다. 추가로 그 과정에서 필요한 Secret Key들에 관한 관리 방법까지 다뤘다. 개발자는 main branch로 pull request 및 merge를 수행한다. Github Actions의 workflow가 트리거되면서 애플리케이션의 테스트 및 빌드가 수행된다. 빌드가 완료되면 docker image를 빌드하고 docker hub repository에 push가 일..

    [kubernetes] ubuntu에 kubeadm으로 K8s 설치하기 (cgroup, coredns 해결)

    [kubernetes] ubuntu에 kubeadm으로 K8s 설치하기 (cgroup, coredns 해결)

    1. Docker 설치 [Docker] Ubuntu 도커 설치 Ubuntu와 Docker 이 글에서는 Ubuntu 도커 설치와 관련된 내용을 다룬다. Docker는 리눅스를 기반으로 하기 때문에 리눅스 운영체제 위에서 돌아가야한다. Ubuntu는 Linux계열 운영체제로 바로 설치가 가능 myjamong.tistory.com 위 블로그 따라서 Docker를 먼저 설치한다. 설치가 끝났다면 docker ps 명령어를 입력해 보자. 위와 같은 에러가 날 수 있다. 해당 문제는 사용자가 /var/run/docker.sock 에 접근하려고 했지만 권한이 없어 발생하는 문제로, 사용자가 root:docker 권한을 가지고 있어야 한다. root 권한을 가지고 실행하는 것은 권장되지 않으므로, 사용자를 docker..

    [Kubernetes] No Ingressclass resource with name nginx found 문제 해결하기 (Helm stable repo)

    [Kubernetes] No Ingressclass resource with name nginx found 문제 해결하기 (Helm stable repo)

    Stable 및 Incubator 차트를 위한 새로운 공간 헬름 - 쿠버네티스 패키지 매니저 helm.sh 결론 helm repo remove stable helm repo add bitnami https://charts.bitnami.com/bitnami stable은 더 이상 업데이트를 하지 않는다. bitnami repo를 쓰던가 따로 찾아서 쓰기로 생각했다. 서론 helm을 사용하려면 로컬에 helm repo 를 등록해야 한다. 그래서 주로 사용하는 repo면서, 책에서도 소개한 repo 면서, Helm 공식 사이트에서도 소개하는 repo인 stable을 설치하기 위해서는 다음 명령어를 입력하면 된다. helm repo add stable https://charts.helm.sh/stable --..

    [kubernetes] #10 쿠버네티스 영속성 데이터와 볼륨

    [kubernetes] #10 쿠버네티스 영속성 데이터와 볼륨

    서론 Persistent Volume, Persistent Volume Claim, Storage Class를 사용해서 쿠버네티스 데이터를 영구적으로 유지하는 방법을 알아보자. 볼륨의 필요성 애플리케이션이 mysql 파드를 사용한다고 가정하자. 애플리케이션을 사용할 수록 데이터는 업데이트되고, 생성될 것이다. 하지만 mysql 파드가 재시작 되면 내부의 데이터는 모두 초기화 될 것이다. 쿠버네티스는 기본적으로 데이터의 영속성을 제공하지 않기 때문에 파드의 라이프사이클에 관계없이 데이터를 보존하고 싶다면, 별도의 저장소가 필요하다. 그리고 저장소는 어디에 생성될 지 알 수 없기 때문에 모든 노드에 대해서 접근이 가능해야 한다. 그리고 저장소는 쿠버네티스 클러스터가 파괴되어도 영향을 받아서는 안된다. 위 조..

    [kubernetes] #9 쿠버네티스 Ingress 란?

    [kubernetes] #9 쿠버네티스 Ingress 란?

    서론 Ingress가 무엇인지, 어떻게 사용하고 어떻게 생성하는지에 대해서 알아보자. Ingress vs External Service 간단한 my-app파드와 파드를 연결해주는 my-app서비스를 생각해보자. external-service는 사용자가 브라우저를 통해서 보낸 요청을 받아서 알맞은 파드로 전달해주는 역할을 한다. 사용자가 서비스에 접근하기 위해서는 클러스터에 접근하기 위한 클러스터 IP와 서비스가 열어놓은 포트 그리고 HTTP 프로토콜을 사용할 수 있다. 이러한 방식은 특정 케이스에 대해서 테스트하기 매우 빠르고 편리하다는 장점이 있다. 하지만 이는 배포 단계에서는 좋지 못하다. 배포 단계에서는 도메인 명으로 API 통신을 하는 것이 보안적 측면에서 중요하다. 이를 가능하게 해주는 쿠버네티..

    [kubernetes] VirtualBox의 Minikube Service 노출시키기

    [kubernetes] VirtualBox의 Minikube Service 노출시키기

    왜 Minikube에서 만든 서비스는 호스트 브라우저에서 접근이 안될까?? Minikube에서 Nginx와 mongo-express 서비스를 External-service로 만들어보고, Internal-service로 만들어서 Ingress를 활용해 연결도 해보았다. 그런데 minikube에는 minikube만의 IP가 있다.(이하 mini IP) Virtual Box 같은 VM 에서 minikube를 사용하는 경우에 External-service를 생성하면 curl http://:port 와 같이 반드시 minikube IP를 사용해서 접근해야 한다. 그리고 이런 접근 방법 때문에 Linux 내부 IPtable을 사용한 포트포워딩과 VM 자체 포트포워딩을 통해 VM의 IP와 minikube IP를 엮어..

    [kubernetes] #8 네임스페이스를 통해 컴포넌트 구성하기

    [kubernetes] #8 네임스페이스를 통해 컴포넌트 구성하기

    서론 네임스페이스가 무엇인지, 어떻게 사용하는지 알아보자. 네임스페이스란? #1 네임스페이스는 쿠버네티스 클러스터 내부의 가상 클러스터라고 생각할 수 있다. 클러스터를 만들때, 쿠버네티스는 기본적인 4개의 네임스페이스를 제공한다. kubectl get namespace kubernetes-dashboard : minikube에만 기본적으로 생성되어있는 네임스페이스이다. 대시보드의 생성에 필요한 컴포넌트를 가지고 있다. default : 다른 네임스페이스가 없는 오브젝트(컴포넌트)를 위한 기본 네임스페이스이다. kube-system : 쿠버네티스 시스템에서 생성한 오브젝트(시스템 프로세스)를 위한 네임스페이스이다. 사용자가 임의로 사용할 수 없다. kube-public : 공개적으로 접근할 수 있는 데이터..

    [kubernetes] #7 Demo 프로젝트: MongoDB + MongoExpress

    [kubernetes] #7 Demo 프로젝트: MongoDB + MongoExpress

    서론 우선 MongoDB 파드를 생성할 것이다. MongoDB 파드는 외부의 요청을 받지 않도록 Internal Service로 생성할 것이다. 그리고 MongoExpress Deployment를 생성할 것이다. MongoExpress 는 DB url이 필요할 것이고, 생성해 두었던 MongoDB와 연결될 것이다. MongoDB에 접근하기 위해선 인증을 위한 Credentials가 필요하다. DB User와 DB Password가 필요한 것이다. 이 정보들은 MongoExpress의 Deployment.yaml 파일의 environmental 부분에 입력할 것이다. 이는 어떻게 정보를 사용하는지를 나타내기 위함이다. 그리고 DB url을 가지고 있는 ConfigMap을 생성할 것이다. 그리고 Creden..

    [kubernetes] #6 쿠버네티스 YAML 설정 파일

    [kubernetes] #6 쿠버네티스 YAML 설정 파일

    서론 쿠버네티스의 컴포넌트의 설정을 도와주는 yaml 파일에 대해서 알아보자. yaml 파일이 보기에 엄청 길고 복잡해 보여도, 실상은 간단하고 논리적인 구조로 되어있기 때문에 겁먹을 필요 없다. 설정 파일의 세 부분 모든 쿠버네티스 설정파일은 3개의 부분으로 나눌 수 있다. # nginx-deployment.yaml apiVersion: v1 kind: Service metadata: name: nginx-service labels: spec: replicas: 2 selector: ports: templates: 1. metadata 컴포넌트를 서로 구분 지어줄 수 있는 이름과 설명을 입력할 수 있다. 2. specification kind에 적힌 컴포넌트에 대한 구체적인 내용을 정의하는 spec 부..

    [kubernetes] #5 핵심 kubectl 명령어

    [kubernetes] #5 핵심 kubectl 명령어

    서론 kubectl 명령어를 통해서 어떻게 파드를 생성하고 디버깅하는지 알아보자. 클러스터 컴포넌트 상태 확인, 생성, 수정 우선 클러스터에 포함된 노드의 상태를 알아보자 kubectl get nodes 클러스터에서 구동중인 파드의 상태를 알아보자 kubectl get pods 클러스터의 서비스들의 상태를 알아보자 kubectl get services get 명령어는 쿠버네티스 클러스터에 존재하는 특정 컴포넌트들의 정보를 리스트 형식으로 가져올 수 있다. create 명령어는 쿠버네티스 클러스터에 특정 컴포넌트를 생성할 수 있다. 여기 나와있는 컴포넌트들을 생성할 수 있다. (kubectl create -h 를 입력하면 볼 수 있다.) 살펴보면 '파드'가 없다는 것을 확인할 수 있다. 파드는 쿠버네티스 ..