관리 메뉴

피터의 개발이야기

[kubernetes] Kubernetes 스키마를 검증하기 위한 방법 본문

Kubernetes/Infra작업

[kubernetes] Kubernetes 스키마를 검증하기 위한 방법

기록하는 백앤드개발자 2022. 9. 22. 22:04
반응형

 

ㅁ 개요

 ㅇ AWS EKS 1.20 지원일이 2022년 11월 1일까지이다. 현재 사용중인 1.20에서 1.21으로, 다시 1.22로 업그레이드 할 예정이다.

 ㅇ 실질적인 EKS 버젼업 작업을 하기 전에 kubernetes 스키마 유효성 검사를 수행하는 방법에 대해서 정리하였다.

 

 

ㅁ Amazon EKS Kubernetes 릴리스 일정

 ㅇ 자세한 내용은 이곳에서 확인할 수 있다.

 

 

ㅁ kubernetes 클러스터, dry-run 

  Kubernetes CLI(kubectl)에는 클러스터에 적용되기 전에 리소스를 확인할 수 있는 기능이 있다.  클러스터에 Kubernetes 리소스를 적용하지 않고 유효성 검사를 수행하는 kubectl create 또는 kubectl apply 명령을 수행할 때 dry-run

( --dry-run=client/server ) 을 사용하여 스키마를 확인할 수 있다.

  CD 단계에서 클러스터와 연결하는 데 문제가 없어야 하므로 가능하면 모든 코드 변경에 대해 kubectl --dry-run=server 를 실행하는 것이 가장 좋은 설정이지만, 모든 개발자나 CI 시스템에서 허용할 수 없기 때문에 실행하지 못할 수도 있다.

  실제로 검증을 위해선 실행 중인 Kubernetes 클러스터가 필요하다. 따라서 매니페스트 검증을 CI 프로세스에 통합할 때 유효성 검사를 수행하기 위해 연결 및 자격 증명도 관리해야 한다. 이는 여러 환경(프로덕트, 개발 등)에서 여러 마이크로서비스를 처리할 때 훨씬 더 어려워진다.

  비유를 들어 설명을 하면, CI 프로세스에 해당하는 젠킨스 빌드 시 Gradle을 이용하여 빌드도 하지만 Error나 Warning을 확인하여 운영 적용 시 문제점을 사전에 막아준다. dry-run은 스키마 벨리데이션을 체크하는 도구인 동시에 클러스터 자체에서 실행되기 때문에 검증에 제약사항이 생길 수 밖에 없다. 왜냐하면 버젼별로 클러스터를 다 준비해야 하기 때문이다.

 

 

ㅁ Datree

 Datree은 코드 변경에 대해 검증 수행 도구이다. 운영에 잘못된 설정을 반영한 경우 엔지니어들의 오버헤드가 발생하기 때문에 사전에 미리 검증을 하여 시간과 리소스를 절약하는데 도움이 된다. 스키마 유효성 검사 테스트를 실행하기 위해서는 단일 yaml 파일이나 디렉토리를 지정하면 된다.

 Datree에 대한 설명은 이전 글인 [kubernetes] Datree란, Yaml validation, kubernetes schama validation 에서 확인할 수 있다. 추가적으로 Datree를 사용 중이며, 경험상 알게 된 사용법은 [kubernetes] Datree 사용법에서 정리 중이다.

 

ㅁ minikube 환경을 이용한 클러스터 테스트

  Kubernetes 환경에 연결하지 않고 서버 모드에서 kubectl 건식 실행을 사용하는 또 다른 옵션은 minikube + kubectl --dry-run=server 를 실행하는 방법이다. 이 검증의 단점은 prod(동일한 볼륨, 네임스페이스 등)와 같은 minikube 클러스터를 설정하는 데도 필요하다는 것이다. 그렇지 않으면 Kubernetes 매니페스트의 유효성을 검사하려고 할 때 오류가 발생한다.

 

 

ㅁ minikube 1.21 설치과정 중 트러블 슈팅

 $ minikube start --cpus 4 --memory 8192 --vm-driver hyperkit --kubernetes-version=v1.21.0
😄  Darwin 11.2 의 minikube v1.25.2
❗  Kubernetes 1.21.0 has a known performance issue on cluster startup. It might take 2 to 3 minutes for a cluster to start.
❗  For more information, see: https://github.com/kubernetes/kubeadm/issues/2395

🙈  Exiting due to K8S_DOWNGRADE_UNSUPPORTED: Unable to safely downgrade existing Kubernetes v1.23.1 cluster to v1.21.0
💡  권장:

    1) Recreate the cluster with Kubernetes 1.21.0, by running:

    minikube delete
    minikube start --kubernetes-version=v1.21.0

    2) Create a second cluster with Kubernetes 1.21.0, by running:

    minikube start -p minikube2 --kubernetes-version=v1.21.0

    3) Use the existing cluster at version Kubernetes 1.23.1, by running:

    minikube start --kubernetes-version=v1.23.1

 ㅇ 위에 글에서 말하였듯이 dry-run 방식으로 쿠버클러스터 yaml을 점증하기 위해서는 해당 버젼으 클러스터가 필요하다.

 ㅇ 현재 1.23버젼이 설치되어 있는 관계로 1.21을 설치 시 위와 같은 문제가 발생하였다.

 ㅇ resorce의 문제로 인해 1번 방법으로 minikube를 삭제하고 다시 설치하도록 하겠다.

 ㅇ minikube 명령어 참조는 여기 

 

 

ㅁ minikube 삭제 후 1.21 버젼 설치하기

 ㅇ minikube delete 명령어를 통해 minikube 클러스터를 삭제하였다.

 

 

$ minikube start --cpus 4 --memory 8192 --vm-driver hyperkit --kubernetes-version=v1.21.0
😄  Darwin 11.2 의 minikube v1.25.2
❗  Kubernetes 1.21.0 has a known performance issue on cluster startup. It might take 2 to 3 minutes for a cluster to start.
❗  For more information, see: https://github.com/kubernetes/kubeadm/issues/2395
✨  유저 환경 설정 정보에 기반하여 hyperkit 드라이버를 사용하는 중
👍  minikube 클러스터의 minikube 컨트롤 플레인 노드를 시작하는 중
🎉  minikube 1.27.0 이 사용가능합니다! 다음 경로에서 다운받으세요: https://github.com/kubernetes/minikube/releases/tag/v1.27.0
💡  To disable this notice, run: 'minikube config set WantUpdateNotification false'

💾  쿠버네티스 v1.21.0 을 다운로드 중 ...
    > preloaded-images-k8s-v17-v1...: 495.84 MiB / 495.84 MiB  100.00% 857.21 K
🔥  hyperkit VM (CPUs=4, Memory=8192MB, Disk=20000MB) 를 생성하는 중 ...
🐳  쿠버네티스 v1.21.0 을 Docker 20.10.12 런타임으로 설치하는 중
    ▪ kubelet.housekeeping-interval=5m
    ▪ 인증서 및 키를 생성하는 중 ...
    ▪ 컨트롤 플레인이 부팅...
    ▪ RBAC 규칙을 구성하는 중 ...
🔎  Kubernetes 구성 요소를 확인...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  애드온 활성화 : storage-provisioner, default-storageclass

❗  /usr/local/bin/kubectl is version 1.25.0, which may have incompatibilites with Kubernetes 1.21.0.
    ▪ Want kubectl v1.21.0? Try 'minikube kubectl -- get pods -A'
🏄  끝났습니다! kubectl이 "minikube" 클러스터와 "default" 네임스페이스를 기본적으로 사용하도록 구성되었습니다.

 ㅇ minikube 클러스터의 버젼을 다운그레이드 완료하였다. 하지만 또다른 문제점이 발생하였다.

 

$ kubectl version --short                                                                                                                                                                         ✔  7492  18:52:49
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.25.0
Kustomize Version: v4.5.7
Server Version: v1.21.0
WARNING: version difference between client (1.25) and server (1.21) exceeds the supported minor version skew of +/-1

ㅇ Server와 Client의 버젼차이가 많이 발생하였다. 

 

 

ㅁ kubectl client 버젼 변경

# 바이너리 다운로드
$ curl -LO "https://dl.k8s.io/release/v1.21.0/bin/darwin/amd64/kubectl"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   138  100   138    0     0    556      0 --:--:-- --:--:-- --:--:--   556
100 51.9M  100 51.9M    0     0  14.3M      0  0:00:03  0:00:03 --:--:-- 17.2M

# kubectl 바이너리를 실행 가능 권한 수정
$ chmod +x ./kubectl

# kubectl 바이너리를 시스템의 파일 위치로 이동
$ sudo mv ./kubectl /usr/local/bin/kubectl
Password:

# 버젼확인
$ kubectl version --short
Client Version: v1.21.0
Server Version: v1.21.0

 ㅇ minikube k8s 버전과 일치하도록 kubectl 버전 다운그레이드 방법은 이전 버전 바이너리를 다운로드하고 현재 가지고 있는 바이너리를 교체하면 된다.

 

 

ㅁ 쿠버네티스 스키마에 대한 validation 체크 환경에 확인

 ㅇ dry-run, datree를 이용한 쿠버네티스 스키마 체크환경을 구축완료하였다.

 ㅇ dry-run의 경우 minikube를 버젼별로 설치해야하는 맹점이 있다. 반면에 datree는 설정페이지에서 버젼을 변경하여 바로 테스트를 실행할 수 있었다. 변경 방법은 여기에 있다.

 

 

ㅁ 함께 보면 좋은 사이트

 

Kubernetes Schema Validation | Datree.io

Running schema validation tests is important, and the sooner the better. If all machines (local developers environment, CI, etc.) have access to your Kubernetes cluster, run `kubectl --dry-run` in server mode on every code change. If this isn’t possible,

www.datree.io

 

 

[kubernetes] Datree 사용법

ㅁ 개요  ㅇ DevOps 개발자로서 k8s schema를 편집할 일이 자주 발생한다.  ㅇ 편집된 k8s에 대한 보안적, 문법적 이슈에 대해서 검증해 줄 수 있는 Datree를 사용 중이다.  ㅇ 사용법에 대해서 필요한

peterica.tistory.com

 

 

[kubernetes] Datree란, Yaml validation, kubernetes schama validation

ㅁ 개요  ㅇ kubernetes 구성 시 스크립트 오류는 실행을 해야지만 알 수 있다.  ㅇ datree은 코드에서 오류를 자동적으로 검사하여, 오류사항을 미리 예방할 수 있다.  ㅇ 이 글에서는 datree를 한번

peterica.tistory.com

 

반응형
Comments