Polaris, k8s 리소스 설정 검사 툴 소개

개요

쿠버네티스는 강력한 s/w 배포 플랫폼이다. 유연성이 높아 어떤 유즈케이스도 이루어 낼 수 있다. fortune 500 기업중 절반이 k8s 를 도입한 이유! Dimensional Research and VMware 연구 ( https://k8s.vmware.com/state-of-kubernetes-2020/ ) 에 따르면 k8s 도입 증가율은 폭발적이다.

그러나 모든 툴들이 그렇듯. 강력함과 보안은 서로 상충한다. 수백만의 다양한 방식의 k8s 설정으로 실행중인데 99%는 위험하다. 보안과점, 효율적인 관점, 그리고 신뢰도 측면에서 쉽게 설명 가능하다. 간혹 YAML 설정의 일부를 누락하기 때문에

이 이슈에 대응하기 위해, 커뮤니티는 k8s 워크로드를 설정하는 best practice 를 생각해 냇다. 이 가이드라인은 항상 따라야 하고 따르지 않을 이유가 없다.  Fairwinds’ Polaris project 는 이것들을 돕고 강제하기 위해 만들어졌다.

예제

k8s deployment 예제다.

YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

뭐가 잘못되었는지 생각해 보세요, 아마도 못할 것입니다. 여기에는 심각한 문제를 야기할 수 있는 문제들이 있습니다.

CPU 와 메모리 설정

우선, k8s 에서는 얼마나 많은 메모리와 cpu 가 사용될 것인지 예측하는게 중요하다. 이것은 k8s 에게 어떤 worker node 에서 효율적으로 배치할 수 있게 해준다. 그리고 이는 어플리케이션의 비정상 작동에 대한 지침이 될 수 있다.

      containers:
      - name: nginx
        image: nginx:1.14.2
        resources:
          requests:
            memory: 512MB
            cpu: 500m
          limits:
            memory: 1GB
            cpu: 1000m

Health Probes

위의 예제는 또한 Liveness 와 Readness Probe 설정이 누락되엇다. 이 설정들은 k8s 가 어플리케이션이 요청을 받아들일 준비가 되어 있는지를 확인하는 방법에 대한 것이다. LivenessProbe 가 없다면, k8s 는 어플리케이션이 응답을 안 할 때 자동 회복하지 않을 것이다. ReadnessProbe 설정이 없다면 pods 이 완전히 제대로 기동 되었는지의 여부를 알 수 없다.

Liveness 와 Readiness Probes 는 어플리케이션 동장에 대한 지식이 있어야 한다. 그러나 특정한 HTTP endpoint 를 호출해 보거나 unix command 를 실행하는 것만으로 적절히 동작하는지를 테스트 해볼 수 있다.

      containers:
        livenessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
        readinessProbe:
          httpGet:
            path: /healthz
            port: 8080

보안 요소

많은 k8s 워크로드 설정은 기본적으로 보안 없이 설정된다. 어플리케이션이 필요할 지도 아닐지도 모르는 권한을 부여할 지도 모른다. 예를 들어 모든 컨테이너는 root 파일시스템을 수정할 수 있는 권한을 기본적으로 가진다. 이것은 공격자가 시스템의 바이너리를 수정하거나 설정을 수정할 수 있다

더 안전한 설정이라면 아래의 내용을 가져야 할 것이다.

      containers:
      - name: nginx
        image: nginx:1.14.2
        securityContext:
          allowPrivilegeEscalation: false
          privileged: false
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          capabilities:
            drop:
              - ALL

Polaris 가 돕는 방법

Polaris 는 위의 내용을 포함해서 더 많은 것들을 검사한다. 2021년 5월 기준 24가지의 종류를 체크하고 여러 커뮤니티의 피드백으로 검사 종류가 더 추가되고 있다.

각각의 체크는 JSON 스키마로 작성되었다. kubectl 명령 실행시마다 동작한다. 가장 간단한 예제는 아래와 같다.

successMessage: Host network is not configured
failureMessage: Host network should not be configured
category: Security
target: Pod
schema:
  '$schema': http://json-schema.org/draft-07/schema
  type: object
  properties:
    hostNetwork:
      not:
        const: true

JSON 스키마와 Go 템플릿으로 꽤 복잡한 문법을 체크한다.  the Polaris documentation 를 읽어보면 커스텀 Polaris checks 를 직접 만들 수도 있다. 이것은 당신의 조직의 내부 정책을 구현하여 best practice 를 강제하는데 도움이 될 것이다.

Polaris configuration 을 설정하고 나면 (기본 설정도 꽤 괜찮다.) Polaris 는 3가지 모드로 작동한다.

  • Dashboard – 클러스터내의 어떤 리소스가 개선되어야 하는지
  • Admission Controller – 문제가 많은 리소스는 클러스터에 배포 되는 것을 방지
  • CI/CD – 체크인 되기 전에 코드로서의 인프라 검사

자신있는 배포

k8s 는 강력하며, 강력함에는 큰 책임감도 따른다. 따라서 k8s 배포전에 best practice 를 따르는 것은 중요하다. 설정을 소홀히 하면 보안 결함과, 운영의 문제와, 클라우드인 경우에는 비용이 과다지출 될 수도 있다.

CI/CD 과정에, Admission Control 로서 또는 수정적으로 확인할 Dashboard 역할로 Polaris 를 당신의 workflow 에 넣게되면, 자신있게 위험수위를 체크하는데 도움이 될 것이다. 그리고 poliris 를 cluster 전반에서 활용하고자 할 때 Trivy 와 같은 이미지 스캐닝 도구나 Goldilocks 와 같은 메모리/ cpu 설정의 적정 사이즈를 제시하는 툴과 같은 역할을 하는 도구를 같이 써도 좋고 k8s 의 audinting 과 정책을 강제 하는 Fairwinds Insights 도 알아보라

너가 k8s 전문가일수도 있고 처음 클러스터를 설계할 수도 있을텐데 일종의 가드레일을 준비해야 한다. Fairwind 사의 Polaris 와 Insights 는 좋은 출발점이다.

refs.

댓글 남기기

이메일 주소는 공개되지 않습니다.