본문 바로가기
728x90

DevOps/Kubernetes21

Kubernetes Scheduling - Node Affinity Affinity를 사용하여 파드를 스케줄링할 노드를 찾을 때의 제약조건을 정의할 수 있다. Affinity를 사용하면 이전 시간에 언급한 nodeSelector보다 더 풍부한 방식으로 파드를 실행시키는 노드의 조건을 설정할 수 있다. Affinity에는 크게 NodeAffinity와 Pod간 Affinity가 있다. 이번 글에서는 Node Affinity에 대해 알아보자.NodeAffinityNode Affinity는 node label를 기반으로 파드를 스케줄링할 수 있는 노드를 제한할 수 있다. Affinity는 파드의 Spec이기 때문에 Affinity를 사용하면 파드가 노드를 선택하는 개념으로 볼 수 있다. Scheduler에서는 NodeAffinity 플러그인에서 NodeAffinity에 대한 .. 2024. 5. 2.
Kubernetes Scheduling 소개 및 NodeSelector Kubernetes Scheduling쿠버네티스에서 스케줄링은 파드를 실행할 쿠버네티스 클러스터에 있는 적절한 노드를 찾는 과정을 말한다. 기본적으로 쿠버네티스에서 스케줄링은 컨트롤 플레인에 있는 kube-scheduler라는 컴포넌트가 그 기능을 담당한다. 물론 쿠버네티스의 스케줄링 메커니즘을 잘 이해한다면 자신만의 커스텀 스케줄러를 구현하는 것도 가능하다. kube-schedulerkube-scheduler는 쿠버네티스의 컨트롤 플레인의 구성요소로, 쿠버네티스의 기본 스케줄러이다 kube-scheduler는 새로 생성되었지만 아직 노드에 스케줄링되지 않은 파드를 실행하기 위해 최적의 노드를 선택한다. kube-scheduler에서 파드를 스케줄링을 할 때는 기본적으로 총 12단계를 거치게 된다. 그 .. 2024. 5. 1.
[1] 쿠버네티스 확장 - kubectl plugin kubectl 도구는 내부적으로 쿠버네티스 API를 사용하여 쿠버네티스 클러스터와 통신하여 쿠버네티스 클러스터와 리소스를 조회하고 변경하기 위해 사용하는 CLI 툴이다. kubectl에서는 쿠버네티스 리소스를 조회하거나 변경하기 위한 여러가지 명령어들을 제공하고 있다. 그런데 kubectl에서 제공하는 명령어 외에도 사용자가 직접 쿠버네티스 클러스터에 관련된 기능들을 개발하여 명령어를 추가할 수 있다. kubectl 커맨드라인 도구 자체에서 플러그인을 사용할 수 있도록 확장성 있게 개발되었기 때문에 추가 명령어 개발이 가능하다. kubectl plugin kubectl에서 사용하는 plugin을 개발하려면 kubectl-로 시작되는 독립적인 실행 파일을 개발하기만 하면 된다.kubectl-xxx 이라는 .. 2023. 10. 29.
Helm Chart Repository 만들기 (2) - Harbor OCI registry 이전 시간에는 Github page로 Helm chart repository를 만들어보았다. 하지만 Github page 방식은 단점(트래픽 및 용량제한)이 있으며, 레포지토리가 무조건 공개된다는 특징이 있다. 이러한 단점을 해결하거나 사설망에 레포지토리를 구축해야 한다면 Github page 방식 외의 별도의 서버를 구축해야 한다. 별도의 서버를 구축하는 방법 중 가장 대표적인 것은 Harbor registry에서 제공하는 Chartmuseum 플러그인을 사용하는 방법이 있다. 물론 이 방법을 사용하려면 별도의 Harbor registry가 구축되어야 한다. Kubernetes 클러스터에 Harbor registry를 구축하는 방법은 아래 포스트를 참고하자. 2023.10.09 - [DevOps/Doc.. 2023. 10. 12.
Helm Chart Repository 만들기 (1) - Github 지금까지는 차트를 로컬에서 만들어보고 로컬에 있는 차트를 가지고 배포를 하는 방식을 알아보았다. 그런데 보통 개발자 로컬에서 차트를 개발하지만 실제로 차트를 사용하여 배포하는 곳은 애플리케이션 서버가 될 것이다. 그리고 도커 이미지처럼 개발자 본인 뿐 아니라 여러 개발자들끼리 함께 공유해서 사용할 수 있어야 한다. 그렇다면 개발한 차트는 어떻게 공유할 수 있을까? 가장 간단한 방법으로는 차트를 구성하는 디렉터리 자체를 압축하여 여러 개발자끼리 공유하는 방법이 될 수 있겠지만, 이러한 방식은 너무 번거롭다. 다행히 helm 도구는 도커와 비슷하게 차트 레포지토리라는 개념을 두어서 외부에 저장된 차트를 받아 배포하는 기능을 제공해주고 있다. Chart Repository Helm 공식 홈페이지에서는 Char.. 2023. 10. 9.
Helm Chart 유효성 검증과 문서화 이전 글에서는 Spring boot 애플리케이션을 배포하는 Helm chart를 직접 만들어보았다. 실제로 values.yaml에 특정 값을 잘 넣어서 배포를 해보면 문제는 없어보인다. 하지만 만약 값을 잘못 넣는다면 어떻게 될까? 예를 들어 아래와 같이 probes 부분을 파드의 readinessProbe, livenessProbe 문법에 맞지 않게 값을 넣어버린다면 어떻게 될까? app: name: todo-api replicas: 1 image: beer1/todo-server-kotlin:0.1.0 port: 9000 probes: readiness: a: 1 liveness: b: 2 $ helm install test ./spring-app -f ./spring-app/ci/test.yaml .. 2023. 10. 3.
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.
728x90