Prometheus와Grafana를 사용하여 Kubernetes 프로그램의 오픈 정책 프록시/게이트웨이 수위 제약 충돌 공개
그리고 이 박문에서 합작한다.
이 게시물은 최초로 here에 발표되었다
Prometheus와Grafana를 사용하여 Kubernetes 프로그램의 오픈 정책 프록시 / 게이트웨이 수위 제약 충돌 공개
처음에 Kubernetes를 사용한 응용 프로그램 팀은 Kubernetes가 조용하고 복잡한 대형 생태계이기 때문에 들어가기 어려울 수도 있다. (CNCF ecosystem landscape 참조)그 밖에 Kubernetes는 이미 성숙되기 시작했지만, 여전히 매우 적극적으로 개발 중이며, 다른 많은 기업의 소프트웨어보다 빠른 속도로 새로운 기능을 얻고 있다.이외에 통합 수요로 인해 Kubernetes 플랫폼은 회사 생태계에 배치된 다른 부분(인증, 권한 수여, 안전, 네트워크, 저장)은 각 회사를 위해 맞춤형으로 제작된 것이다.따라서 경험이 풍부한 Kubernetes 전문가라도 안전성, 탄력성, 성능 요구를 충족시키기 위해 프로그램을 배치할 때 많은 것을 고려해야 한다.Kubernetes에서 실행되는 프로그램이 이러한 요구를 충족시킬 수 있도록 어떻게 확보합니까?
OPA/골키퍼 입력
Open Policy Agent(OPA)과 Kubernetes 목표 구성 요소 Gatekeeper은 Kubernetes 그룹에서 정책을 실시하는 방법을 제공합니다.여기서 우리가 말한 정책은 규칙, 최상의 실천과 행위에 대한 공식적인 정의이다. 당신은 회사의 쿠베르네트스 집단에서 이러한 규칙, 최상의 실천과 행위를 보고 싶다.OPA를 사용할 때, Rego이라는 특정한 도메인 언어를 사용하여 정책을 작성할 수 있습니다.이렇게 함으로써, 만약 당신이 회사 내부의 위키에서 정책을 자유로운 텍스트로 해석하려고 한다면, 어떠한 오해의 공간도 남기지 않을 것이다.
또한 Gatekeeper를 사용할 때 정책에 따라 다른 실행 작업이 있을 수 있습니다.어떤 정책은 필수적인 정책으로 여겨지고, 다른 정책은 적당한 정책으로 여겨질 수도 있다.'필수' 정책은 Kubernetes 자원이 그룹에 들어갈 수 있도록 막고, '대기' 정책은 플랫폼 사용자가 알 수 있는 경고 메시지만 가져옵니다.
이 블로그에서 우리는 어떻게 해야 하는지를 토론할 것이다.
Kubernetes에서 정책을 강제로 실행하는 것에 대해 더 알고 싶으면 this article을 보십시오.
설계
우리가 통합한 시스템의 목표는 개발자와 플랫폼 사용자에게 OPA 제약에 대한 견해를 제공하는 것이다. 이런 제약은 그들의 응용 프로그램이 주어진 명칭 공간에서 위반한 것일 수도 있다.Grafana를 사용하여 예제 대시보드를 만듭니다.Grafana는 프로메테우스로부터 계기판을 만드는 데 필요한 데이터를 가져옵니다.위 그림에서 '제약 충돌 Prometheus Exporter' 로 설명된 작은 Go 프로그램을 작성했습니다. Kubernetes API의 제약 충돌을 조회하고 Prometheus 형식으로 데이터를 공개합니다.
우리의 설정은 Audit 모드에서 Gatekeeper/OPA를 사용했고 Gatekeeper의 기능을 이용하여 정책의 기대에 부합되지 않는 K8S 자원을 거부하지 않습니다.
OPA 제약 조건
회사마다 Kubernetes에서 실행되는 프로그램 요구 사항이 있습니다.생산 준비 검사표의 개념을 들어보셨을 수도 있습니다. (간단히 말하면 플랫폼 사용자가 생산 과정에서 응용 프로그램을 배치하기 전에 응용할 수 있도록 프로젝트 검사표를 만들고 싶습니다.)다음 링크는 Rego 기반 프로덕션 준비 상태 점검 테이블을 작성하는 데 유용한 출발점이 될 수 있습니다.
Google 블로그 글에서, 우리는 소스 오픈 프로젝트 gatekeeper-library을 사용할 것입니다. 이것은 좋은 예시 제약을 포함합니다.또한 프로젝트 구조는 회사를 위해 OPA 제약을 어떻게 관리하는지에 대한 예시를 제공하는 데 매우 유용하다. OPA 정책을 만드는 데 사용되는 Rego 언어는 철저한 단원 테스트를 거쳐야 한다. src folder에서 순수한 Rego 파일과 단원 테스트를 찾을 수 있다.The library folder은 최종적으로 src 폴더의 레고 파일에서 만든 Gatekeeper 제약 템플릿을 포함합니다.또한 모든 템플릿에는 예시적인 제약이 있고 일부 목표 데이터가 있기 때문에 제약의 긍정적인 결과와 부정적인 결과를 초래할 수 있다.Rego 기반 정책은 상당히 복잡해질 수 있기 때문에 우리가 보기에 즐거움과 불쾌함을 포함하는 경로를 포함하기 위해 Rego 단원 테스트를 해야 한다.우리는 전체 프로젝트 구조에 따라 귀사의 수요를 대표하는 전략을 삭제하고 추가하는 것을 통해 이 프로젝트를 계속 추진할 것을 건의합니다.이 방법을 사용하면 다양한 환경에 규정 준수를 코드로 손쉽게 적용할 수 있습니다.
앞에서 말한 바와 같이 귀하가 직접 강제로 집행하고 싶지 않은 제약이 존재할 수 있습니다. 예를 들어 개발 그룹에서 >1개의 복사본을 강제로 집행하고 싶지 않거나 특정한 제약을 강제로 집행하기 전에 플랫폼 사용자에게 필요한 예방 조치를 취할 수 있는 시간을 주기를 원할 수도 있습니다.이 동작을 제어하려면
enforcementAction
을 사용하십시오.기본적으로 enforcementAction
은 deny
으로 설정됩니다. 이것이 바로 우리가 말한 필수 조건입니다.우리의 예시에서 우리는 사용할 것이다
enforcementAction: dryrun
재산이는 K8S 클러스터에서 실행되는 워크로드에 직접적인 영향을 미치지 않도록 보장합니다(이 경우 enforcementAction: warn
도 사용할 수 있습니다).프로메테우스 수출상
우리는 제약 충돌의 도량을 수집하고 표시하기 위해 Prometheus과 Grafana을 사용하기로 결정했다. 왜냐하면 이것은 좋은 유행하는 소스 공급 도구이기 때문이다.
프로메테우스 도량을 내보내거나 발표하기 위해 Golang에서 prometheus golang library을 사용하는 작은 프로그램을 만들었습니다.이 프로그램은 Kubernetes API를 사용하여 클러스터에 적용되는 모든 구속조건을 검색하고 일부 메트릭을 내보냅니다.
다음은 샘플 지표입니다.
opa_scorecard_constraint_violations{kind="K8sAllowedRepos",name="repo-is-openpolicyagent",violating_kind="Pod",violating_name="utils",violating_namespace="default",violation_enforcement="dryrun",violation_msg="container <utils> has an invalid image repo <mcelep/swiss-army-knife>, allowed repos are [\"openpolicyagent\"]"} 1
레이블은 각 구속 위반을 나타내는 데 사용되며 나중에 Grafana 대시보드에서 이러한 레이블을 사용합니다.Prometheus exporter 모니터 tcp 포트
by default and exposes metrics on path
```/metrics```
. It can run locally on your development box as long as you have a valid Kubernetes configuration in your home folder (i.e. if you can run kubectl and have the right permissions). When running on the cluster a
```incluster```
parameter is passed in so that it knows where to look up for the cluster credentials. Exporter program connects to Kubernetes API every 10 seconds to scrape data from Kubernetes API.
We've used [this](https://medium.com/teamzerolabs/15-steps-to-write-an-application-prometheus-exporter-in-go-9746b4520e26) blog post as the base for the code.
## Demo
Let's go ahead and prepare our components so that we have a Grafana dashboard to show us which constraints have been violated and how the number of violations evolve over time.
### 0) Required tools
- [Git](https://git-scm.com/downloads): A git cli is required to checkout the repo and
- [Kubectl](https://kubernetes.io/docs/tasks/tools/) and a working K8S cluster
- [Ytt](https://carvel.dev/ytt/): This is a very powerful yaml templating tool, in our setup it's used for dynamically overlaying a key/value pair in all constraints. It's similar to Kustomize, it's more flexibel than Kustomize and heavily used in some [Tanzu](https://tanzu.vmware.com/tanzu) products.
- [Kustomize](https://kustomize.io/): Gatekeeper-library relies on Kustomize, so we need it too.
- [Helm](https://helm.sh/): We will install Prometheus and Grafana using helm
- Optional: [Docker](https://www.docker.com/products/docker-desktop): Docker is only optional as we already publish the required image on dockerhub.
### 1) Git submodule update
Run
```git submodule update --init```
to download gatekeeper-library dependency. This command will download the [gatekeeper-library](https://github.com/open-policy-agent/gatekeeper-library) dependency into folder
```gatekeeper-library/library```
.
### 2) Install OPA/Gatekeeper
If your K8S cluster does not come with Gatekeeper preinstalled, you can use install it as explained [here](https://open-policy-agent.github.io/gatekeeper/website/docs/install/). If you are familiar with helm, the easiest way to install is as follows:
```bash
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm install gatekeeper/gatekeeper --generate-name
우리는 이미 Tanzu Mission Control(TMC)을 사용하여 Kubernetes 테스트 그룹을 제공했고 TMC는 우리에게 Gatekeeper가 있는 그룹을 주었다. 우리는 스스로 Gatekeeper를 설치할 필요가 없다.3) 설치 네트워킹 예제 구속
스크립트 gatekeeper-library/apply_gatekeeper_constraints.shkustomize를 사용하여 제약 템플릿을 만들고 그룹에 적용합니다.따라서 k8s cli가 올바른 컨텍스트를 구성했는지 확인하십시오.이후 Ytt으로 주사
spec.enforcementAction: dryrun
dryrun의 법 집행을 진행하다.다음 명령을 사용하여 스크립트를 실행합니다.
cd gatekeeper-library && ./apply_gatekeeper_constraints.sh
4) 프로메테우스 수출상 설치
폴더에 프로그램의 원본 코드가 있습니다. 이 프로그램은 프로메테우스 데이터 형식으로 제약 위반에 대한 정보를 내보냅니다.같은 폴더에는 build_docker.sh이라는 스크립트가 포함되어 있으며, 이 스크립트는 용기를 구축하여 mcelep/opa_scorecard_exporter으로 전송합니다.그러나 컨테이너 이미지는 공개적으로 사용할 수 있기 때문에 폴더의 자원을 적용하기만 하면 됩니다.K8S 리소스를 배포하기 위해 선택한 대상 네임스페이스는 다음과 같습니다.
. The K8S resources we want to create have the following functionality:
-
```clusterrole.yaml```
&
```clusterrolebinding.yaml```
-> These resources create a clusterrole to access all resources of group
```constraints.gatekeeper.sh```
and a binding for that clusterrole
-
```deployment.yaml```
-> A deployment that will run the container image
```mcelep/opa_scorecard_exporter```
-
```service.yaml```
-> A service that has annotation
```prometheus.io/scrape-slow: "true"```
to make sure that this service gets picked up by Prometheus
To apply these K8S resources:
```bash
kubectl create namespace opa-exporter && kubectl -n opa-exporter apply -f exporter-k8s-resources
5) 쿠베프로메테우스 굴뚝 설치
프로메테우스와 그라파나를 설치하기 위해 우리는 kube-prometheus-stack이라는 키맵을 사용할 것이다.폴더에는 이 단계의 관련 파일이 들어 있습니다.
프로메테우스와 그라파나를 제외하고, 우리는 제약 위반에 관한 유용한 지표를 표시하는 맞춤형 그라파나 계기판을 설치하고 싶다.파일 kube-prometheus-stack/cm-custom-dashboard.yaml에는 설치하려는 대시보드 구성이 포함되어 있습니다. 레이블에 유의하십시오.
grafana_dashboard: "1"
이 파일에서이 레이블은 Grafana가 이 ConfigurationMap의 내용을 대시보드 소스로 사용하도록 지시하는 데 사용됩니다.파일 grafana-opa-dashboard.json은Grafana에서 내보낸 원본 JSON입니다. 이 파일의 내용을 키 아래configmap에 삽입합니다
.
The install script [kube-prometheus-stack/install.sh](kube-prometheus-stack/install.sh) creates a ConfigMap from file [cm-custom-dashboard.yaml](kube-prometheus-stack/cm-custom-dashboard.yaml) and then it uses helm to install kube-prometheus-stack chart into the namespace
```prometheus```
.
Run the following command to install Prometheus & Grafana:
```bash
cd kube-prometheus-stack && ./install.sh
몇 분 후, 모든 프로메테우스 부품과 그라파나가 작동하고 운행되어야 한다.6)Grafana 로그인
우리는 아직 입구나 서비스를 제공하지 않았다
type: LoadBalancer
우리의Grafana 설치에 대해Grafana 계기판에 접근하는 간단한 방법은kubectl의 포트를 사용하여 전송하는 것입니다.다음 명령을 실행하여 Grafana에 대한 포트 전달 세션을 시작합니다.
kubectl -n prometheus port-forward $(kubectl -n prometheus get pod -l app.kubernetes.io/name=grafana -o name | cut -d/ -f2) 3000:3000
다음 URL을 클릭할 수 있습니다.
with your browser and you should see a welcome screen that looks like the screenshot below.
![grafana_welcome](https://raw.githubusercontent.com/mcelep/opa-scorecard/master/grafana_welcome.png)
The username/password for Grafana as of this writing is
```admin / prom-operator```
. If these credentials do not work out you can also discover them via the following commands:
```bash
kubectl -n prometheus get secrets prometheus-grafana -o jsonpath='{.data.admin-user}' | base64 -d
kubectl -n prometheus get secrets prometheus-grafana -o jsonpath='{.data.admin-password}' | base64 -d
Grafana에 로그인하면 http://localhost:3000/d/YBgRZG6Mz/opa-violations?orgId=1을 통해 OPA Dasboard에 직접 들어갈 수 있습니다. (또는 이 링크를 통해 OPA 대시보드: http://localhost:3000/dashboards?query=opa) 를 검색할 수 있습니다.다음은 Grafana OPA 대시보드의 화면 캡처입니다.
대시보드 위쪽의 드롭다운 메뉴에서 대상 이름 공간을 선택할 수 있습니다.우리는 계기판을 매우 간단하게 만들었습니다. 분명히 당신은 무한한 방식으로 계기판을 확장할 수 있고, this repo에 끌어오기 요청을 보내서 계기판을 공유할 수 있습니다.
Reference
이 문제에 관하여(Prometheus와Grafana를 사용하여 Kubernetes 프로그램의 오픈 정책 프록시/게이트웨이 수위 제약 충돌 공개), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/mcelep/expose-open-policy-agent-gatekeeper-constraint-violations-for-kubernetes-applications-with-prometheus-and-grafana-1f2n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)