Kubernetes 투구 도표 테스트

게시 기간 동안 키맵 테스트에 사용할 도구 개발

소개하다.


Helm Chart는 Kubernetes 템플릿을 작성하고 모든 의존 항목을 가진 도표로 포장하는 패키지 관리 소프트웨어이다.하나의 도표는nginx,memcache 또는 모든 웹 응용 프로그램을 배치하는 데 사용할 수 있습니다.다음 명령만 실행하면 모든 응용 프로그램 그래프를 배치할 수 있습니다.
helm install my-release bitnami/nginx

범위


본고는HelmChart 개발에 관한 상세한 정보를 언급하지 않습니다. 반면에HelmChart는 매우 좋은 문서가 있기 때문에 이 문서를 통해 더 많은 정보를 얻을 수 있습니다.
개발의 일부로서 어떻게 helm 도표를 테스트하는지, 그리고 단원 테스트에서 통합 테스트까지의 도표를 테스트할 수 있는 다양한 유형의 테스트 도구를 사용할 수 있는지 소개할 것이다.

키보드 개발. - 즐거운 체험이 아니에요.


헬멧 그래프는 고 템플릿으로 작성된 것으로, 이 템플릿을 작성해서 Kubernetes 목록을 보여주는 것은 고통스러운 경험이다.좋은 디버그 지원이 없고 오류도 잘 모르기 때문에 축소와 관련된 작은 문제를 복구하는 데 몇 시간이 걸릴 때도 있다.Helm은 템플릿을 표시할 때 디버그 로고를 제공합니다. 코드에 오류가 있는 정확한 위치를 정확하게 가리키지 않았기 때문에 문제를 찾기 어렵습니다.나는 장래에 더 좋은 도구가 helm chart의 개발에 사용되어 개발자의 생활을 더욱 가볍게 할 수 있기를 바란다.
Ryan Snaadt의 Unsplash 사진

당신의 도표 템플릿이 정확합니까?


앞에서 말한 바와 같이 Helm 그래프 템플릿은 go 템플릿을 사용하기 때문에 개발의 일부로서, 그래프를 발표할 때 마지막 순간에 의외의 사고가 발생하지 않도록 문법 오류를 확보해야 합니다.
Helm에서 lint 명령을 제공합니다. 이 명령은 템플릿과 관련된 모든 문제를 찾을 수 있고 보고할 수 있기 때문에 개발 과정에서 컴파일링 오류를 찾을 수 있습니다.
다음은 잘못된 키맵 배치 템플릿입니다.

Helm lint에서 다음 예상 질문을 보고합니다



➜ mychart helm lint .
==> Linting .
[INFO] Chart.yaml: icon is recommended

[ERROR] templates/: parse error at (mychart/templates/deployment.yaml:19): function “Values” not defined

[ERROR] templates/: template: mychart/templates/deployment.yaml:7:16: executing “mychart/templates/deployment.yaml” at <include “namespace” .>: error calling include: template: no template “namespace” associated with template “gotpl”

Error: 1 chart(s) linted, 1 chart(s) failed

이것은 매우 간단한 예라는 것을 알지만,lint의 작업 원리를 충분히 설명할 수 있습니다


Kubernetes 선창에 근거하여 검증하다


Helm template는 Helm 차트 템플릿에서 Kubernetes 목록/템플릿을 표시하거나 생성하는 명령입니다


Kubernetes 클러스터에 차트를 설치/배치하는 명령Helm install이 있습니다.내부에서 helm template 명령을 먼저 실행한 다음 생성된 템플릿 출력을 그룹에 배치합니다



helm template . > deployment.yaml

당신의 Kubernetes 선실은 유효합니까?


그래프를 개발할 때 오류가 발생하면, Kubernetes 그룹에 적용할 때 생성된 Kubernetes 목록에 오류가 발생할 수 있지만, 배치하기 전에 이 오류를 알고 싶습니다


Kubeval는 구조의 도구입니다.이것은 공식 Kubernetes 규범에 따라 생성된 목록을 검증하고 문제를 보고할 수 있는 도구입니다 (있을 경우)


당신은 이 배치 템플릿에서 어떤 문제를 발견할 수 있습니까





이 배치 목록에 대해kubeval을 실행하고 문제를 확인합니다



➜ mychart kubeval deployment.yaml

WARN — mychart/templates/deployment.yaml contains an invalid Deployment (myservice.nginx-deployment) — selector: selector is required

WARN — mychart/templates/deployment.yaml contains an invalid Deployment (myservice.nginx-deployment) — containerPort: containerPort is required

WARN — mychart/templates/deployment.yaml contains an invalid Deployment (myservice.nginx-deployment) — spec.replicas: Invalid type. Expected: [integer,null], given: string

##### This is the output if it was valid deployment #####
PASS — mychart/templates/deployment.yaml contains a valid Deployment (myservice.nginx-deployment)

이외에 옵션 * "-Kubernetes version v1.20.4"를 사용하여 템플릿을 생성할 Kubernetes 버전을 검증할 수 있습니다*


Custom Validations against Kubernetes Manifests


내가 다음과 같은 간단한 요구가 있다고 가정하면


  • 용기는 뿌리로 운행해서는 안 됩니다

  • Docker 이미지는 내 조직 라이브러리에서 왔어야 함


자원이 그룹에 배치되었을 때, Kubernetes에서 접근 컨트롤러를 통해 이 문제를 해결할 수 있습니다. 그러나 만약 우리가 배치하기 전에 이 맞춤형 검증을 적용할 수 있다면, 좋지 않을까요


ConftestOPA policies 규칙을 작성하고 Kubernetes 목록을 실행할 수 있는 프레임워크입니다





conftest를 사용하여 배치 목록에 대한 사용자 정의 규칙을 실행하면 conftest는 설정된 규칙에 따라 문제를 보고합니다



➜ mychart conftest test — policy . deployment.yaml

FAIL — deployment.yaml — main — Containers must not run as root
FAIL — deployment.yaml — main — image ‘nginx’ doesn’t come from myorg.com repository

2 tests, 0 passed, 0 warnings, 2 failures, 0 exceptions

모든 자원에 대한 사용자 정의 정책을 작성할 수 있습니다. 이 정책들은 배치하기 전에 Kubernetes 목록에서 실행할 수 있습니다.멋있어요


Schema Validations for Custom Values


설명한 바와 같이, Kubeval과 Conftest 도구를 사용하여 Kubernetes 목록을 검증할 수 있지만, helm 그래프를 만들 때, 이 그래프를 사용하는 사용자가 새로운 기능에 사용자 정의 값을 추가할 수 있도록 허용해야 합니다.이 사용자 정의 값의 형식이 정확한지 확인해야 합니다. 그렇지 않으면 그래프 렌더링이 실패합니다. 이것은 디버깅하기 매우 어려운 작업입니다.우리가 제공하는 사용자 정의 값의 형식이 정확한지 확인하기 위해 1급 방어를 어떻게 적용합니까? 그렇지 않으면 정확한 검증 메시지를 사용하여 오류가 발생합니다


Helm Chart는 Schema Validation 기능을 제공합니다. 모든 사용자 정의 값 규칙을 포함하는 도표에 패턴 파일을 제공해야 합니다.이 명령을 실행하기 전에 이 모드 검증을 먼저 검증합니다


  • 키잡이 린트
  • 키 템플릿
  • 키 설치
  • 투구 승급

다음은 사용자 정의 값을 사용하는 용례입니다


  • 사용자는 메모리와 cpu 요구를 지정할 수 있어야 합니다

  • 일부 사용자는 응용 프로그램 로그에 다른 로그 위치를 지정하기를 원합니다

  • 사용자가 응용 프로그램 용기에 환경* 변수를 제공하기를 원합니다*


사용자가 메모리와 cpu에 사용자 정의 값을 지정하면 다른 방식으로 기본값을 설정합니다





여기는 가치관입니다.패턴.사용자 정의 값에 따라 검증하는 json 파일





사용자 정의 값입니다.yaml 사용자가 도표를 사용할 때 어떤 정보를 제공할 수 있습니까





사용자가 잘못된 사용자 정의 값을 제공했기 때문에 실패할 것입니다



➜ mychart helm template . -f custom-values.yaml

Error: values don’t meet the specifications of the schema(s) in the following chart(s):
mychart:
- memory: Does not match pattern ‘^[0–9.]+[M|G]i$’
- cpu: Does not match pattern ‘^[0–9.]+m*$’

json 모드 규범이 지원된다면 모든 종류의 검증을 할 수 있지만, 유일한 조건은 파일 이름 값에 모든 json 모드 규칙을 제공해야 한다는 것입니다.패턴.당신의 도표에서


Unit Testing


는 다른 프로그래밍 언어와 마찬가지로 단원 테스트는 개발자가 개발 초기에 반드시 먼저 고려해야 한다.나는 Helm 도표에 사용할 수 있는 좋은 단원 테스트 프레임워크가 매우 적다는 것을 발견했다


단원 테스트 프레임워크helm-unittest가 있습니다.이것은 매우 좋은 단원 테스트 프레임워크이고 대량의 주동적인 배치를 진행하고 있기 때문에 우리는 그것을 명확하게 사용해야 한다


Helm 그래프를 테스트하는 또 다른 방법이 있습니다. 단원 테스트와 회귀 테스트의 혼합입니다


Idea is very simple. you need to add a binding file containing custom values for each new feature you are implementing in helm chart and generate fixture file out of it using helm template command. You need to commit binding and it’s fixture file in the repository. Now create a simple shell script to be executed in CI which will create a fixture file out of a binding file on the fly against your changes in chart and compare it with existing fixture file. you just fail the test if there is difference in fixture files then you need to either fix your helm chart or update the existing fixture file if it’s expected behavior.


fixture를 사용하여 테스트를 진행하는 것은 코드 재구성에 매우 유용하며, 새로운 특성을 작성할 때도 단원 테스트에 사용할 수 있습니다


Integration Tests using Kubetest


지금까지 helm 그래프 템플릿과 Kubernetes 목록을 다른 도구로 테스트했지만, Kubernetes 그룹에 Kubernetes 목록을 실제 배치해서 어떤 것도 검증하지 않았습니다


Why do we need integration tests ?


나는 이미 몇 가지 용례를 언급했는데, 그것들은 집단에 자원을 배치해서 검증할 수 밖에 없다


  • 볼륨을 쓰기 가능한 볼륨으로 마운트했습니다. 볼륨에 파일을 만들어서 이 볼륨을 검증하고 싶습니다

  • 사용자 정의 자원을 검증하고 싶습니다

  • Kubernetes 서비스로 만든 내부 부하 평형기의 운행 상태 검사를 검증하고 싶습니다


사용 가능한 도구가 많지만 정말 좋아해요Kubetest.pytest 플러그인입니다.Kubetest는 Kubernetes 클라이언트에 추상적인 정보를 제공하여 통합 테스트를 쉽게 작성할 수 있도록 합니다


는 많은 도움말 함수를 제공하기 때문에 절대적으로 필요하지 않으면 Kubernetes 클라이언트로 복잡한 코드를 작성할 필요가 없습니다


Kubetest를 사용하여 통합 테스트를 작성하는 것은 직관적이고 재미있습니다.나는 여기에 어떤 예시 코드도 넣고 싶지 않다. 왜냐하면 이 단락 example 코드를 보면, 그것은 자명하기 때문이다.p>

Summary


저는 이미 helm 도표의 기본 지식을 소개했고 개발부터 helm 도표를 발표하는 생명주기까지 다양한 유형의 테스트에 사용할 수 있는 각종 도구를 소개했습니다. 단원 테스트와 통합 테스트를 포함합니다


모르는 점이 있으면 놓치지 마세요github. 저는 이 글에서 그것을 예로 삼고 있습니다


마음에 드셨으면 좋겠어요.건배


References


좋은 웹페이지 즐겨찾기