본문 바로가기
728x90

DevOps/Kubernetes24

Helm Chart 만들어보기 이번에는 실제로 마이크로서비스들을 배포하기 위한 helm chart를 직접 만들어보도록 하자. Chart를 만들기 전에, 실제로 어떤 목적으로 패키징할지 고민해봐야 한다. 이번 실습에서는 한국에서 자주 사용하는 Spring Boot 기반 애플리케이션을 배포하기 위한 helm chart를 만들어보자. 실습에 대한 파일들은 Github에 올려두었습니다. https://github.com/beer-one/charts GitHub - beer-one/charts Contribute to beer-one/charts development by creating an account on GitHub. github.com 차트 이름 결정하기 먼저 차트 이름을 결정해야 한다. 일단 차트를 만들 디렉터리를 하나 생성하고,.. 2023. 9. 25.
Helm Chart 소개 Helm 보통 쿠버네티스에서 리소스 관리는 yaml 파일로 저장하여 관리한다. 그리고 하나의 애플리케이션을 쿠버네티스 환경으로 배포할 때는 Deployment와 같은 워크로드를 생성하는 것이 전부가 아니다. 서비스 디스커버리와 로드밸런싱 기능을 제공하는 Service도 생성해야 하고, 애플리케이션 설정 정보를 담는 ConfigMap, Secret도 추가해야 하고, 애플리케이션 안에서 쿠버네티스 리소스를 참조해야 한다면 Role, RoleBinding, ServiceAccount 등 여러가지 쿠버네티스 리소스가 추가되어야 한다. 이와같이 보통 마이크로서비스를 배포할 때 각 마이크로서비스마다 비슷한 패턴으로 쿠버네티스 리소스를 추가하게 된다. 배포해야 할 마이크로서비스가 적다면 큰 문제는 없겠지만 많아진다면.. 2023. 9. 17.
Encryption at Rest (쿠버네티스 데이터 암호화) 쿠버네티스에서 etcd에 저장되는 모든 API 리소스들은 암호화 기능을 지원한다. 기본적으로는 etcd로 저장될 때는 평문으로 저장되지만 특정 리소스에 대해서 암호화하여 저장하도록 설정할 수 있다. 암호화 하지 않았을 때는 다음과 같이 etcd에 평문으로 저장된다. # middleware 네임스페이스의 mysql 시크릿 조회 $ sudo ETCDCTL_API=3 etcdctl --endpoints=https://localhost:2379 \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ get /registry/sec.. 2023. 8. 27.
[11] 쿠버네티스 ConfigMap & Secret 보통 애플리케이션을 배포하면 하나의 환경에서만 배포하는 것이 아니라 여러 환경에서 배포를 하게 될 수도 있다. 그러면 환경마다 달라지는 것들이 있는데, 이런 것들을 보통 환경변수나 설정 파일 등으로 관리한다. 쿠버네티스에서는 이런 환경변수나 설정 파일 등을 저장하는 용도로 ConfigMap과 Secret을 제공해준다. ConfigMap ConfigMap은 Key-value 쌍의 형태로 데이터를 저장하는 데 사용하는 쿠버네티스 오브젝트이다. 보통 ConfigMap에 저장된 값을 파드에서 사용하는데, 파드의 환경변수에 ConfigMap의 값을 바인딩하거나 ConfigMap으로 파드 볼륨을 생성하여 볼륨 마운팅을 통해 파드 내부에서 파일의 형태로 ConfigMap을 사용할수도 있다. 선언 및 생성 Config.. 2023. 8. 27.
[2] 쿠버네티스 클러스터 설치 쿠버네티스 클러스터 설치 쿠버네티스 클러스터는 물리머신이나 가상머신에 모두 설치할 수 있다. 설치 방법은 여러가지가 있는데 minikube, kubeadm, k3s, microk8s 등이 있지만 minikube와 쿠버네티스 공식 홈페이지에 있는 kubeadm에 대한 설치만 다룰 것이다. minikube도 공식 홈페이지에서 지원하지만, 공식 홈페이지에 튜토리얼로 완전 잘 나와있다. 그리고 minikube는 로컬 머신에 VM을 만들고 하나의 노드로 구성된 간단한 클러스터를 생성한다. 하나의 노드로만 구성되어있어서 쿠버네티스에 대해 간단히 알아보는 정도?로만 가능할 것 같고 제약사항도 분명 있을거로 보인다. (지극히 개인적인 생각..) 그래서 여러 노드를 구성할 수 있는 kubeadm을 다뤄볼 것이다. min.. 2023. 2. 25.
[10] 쿠버네티스 Ingress 쿠버네티스에서 파드를 외부로 노출시키기 위해서 서비스를 사용하였다. 만약에 쿠버네티스 클러스터 내의 여러 애플리케이션을 외부로 노출시켜야 한다고 가정하자. 그러면 우리는 배운대로 애플리케이션을 디플로이먼트로 띄우고, 서비스를 통해 외부로 노출시킬 것이다. 운영 환경에서는 아래 그림과 같이 서비스를 LoadBalancer 타입으로 노출시킬 것이다. 하지만 이런 방식을 사용할 경우 애플리케이션 종류별로 로드밸런서를 구축해야 한다는 단점이 있다. 간단한 서비스의 경우, 비용적인 측면에서 효율적이지 못할 수도 있다. Ingress 다행히도 쿠버네티스에서는 이러한 측면을 보완해주는 쿠버네티스 오브젝트를 제공해주는데 그것이 바로 Ingress이다. Ingress는 간단히 말하면 Host, Path기반으로 애플리케이.. 2022. 7. 21.
쿠버네티스 Static Pods 쿠버네티스의 컨트롤 플레인 노드에 있는 kube-scheduler 는 파드가 생성되면 파드를 적절한 노드로 스케줄링한다. 하지만 kube-scheduler가 없다면(장애가 난다면), 또는 kube-apiserver가 없다면 파드를 생성하거나 스케줄링을 할 수 없다. 하지만 kube-scheduler, kube-apiserver 의 도움 없이 파드를 배포할 수도 있다. 실제로 파드를 직접 배포하는 컴포넌트는 각 노드에서 구동 중인 kubelet이기 때문이다. (사실은 kube-apiserver가 kubelet 에게 파드가 생성되었으니 파드를 배포시키라고 지시한다.) kube-apiserver 가 시키지 않고도 kubelet 이 스스로 파드를 배포하게 만들 수 있다. 노드의 /etc/kubernetes/ma.. 2022. 7. 16.
[9] 쿠버네티스 볼륨 Volume 컨테이너(파드)가 뜨면 컨테이너 만의 공간이 생성되고 이 공간은 임시적으로 사용된다. 만약 파드가 죽는다면 해당 공간은 사라진다. 웹 애플리케이션과 같은 Stateless한 애플리케이션인 경우에는 문제가 없지만, 애플리케이션이 특정 데이터를 저장해야 하는 경우나 파드에서 같이 실행되는 컨테이너 간에 임시 파일을 공유해야 하는 경우에 문제가 발생하게 된다. 컨테이너 애플리케이션이 특정 데이터를 저장해야 하는 경우에는 애플리케이션이 죽으면 쿠버네티스가 컨테이너를 다시 띄우겠지만 컨테이너 공간이 사라지기 때문에 해당 데이터는 당연히 삭제된다. 파드에서 같이 실행되는 컨테이너 간에 임시 파일을 공유해야 하는 경우, 파일을 저장하는 컨테이너가 죽어버리면 위와 똑같은 이유로 임시파일에 저장된 데이터는 .. 2022. 2. 20.
[8] 쿠버네티스 서비스 지금까지는 파드로 컨테이너 기반 애플리케이션을 띄우고 디플로이먼트로 파드의 레플리카 수와 버전을 관리하였다. 하지만 이것만으로는 파드로 띄운 웹 애플리케이션을 쿠버네티스 클러스터 외부로 서비스할 수 없다. 왜냐하면 파드는 파드 고유의 IP를 가지긴 하지만 클러스터 내부용 IP이며, 파드는 클러스터의 상태에 맞게 생성되고 삭제되기 때문에 파드는 영구적인 리소스가 아니다. 즉, 파드가 장애가 났다고 판단하면 디플로이먼트가 파드를 재구동 시키면서 파드의 IP가 유지되지 않아서 파드가 클러스터 외부와 통신이 가능한다 하더라도 제대로된 서비스를 할 수가 없다. 이러한 파드의 특성 때문에 쿠버네티스의 클러스터 외부에서 파드와 통신할 수 있도록 하는 메커니즘이 필요하다. 필요한 기능은 먼저 파드가 영구적인 리소스가 .. 2022. 2. 9.
728x90