본문 바로가기
Infra/Kubernetes

kube-apiserver 설정 기본 구조

by TrendPilot 2025. 5. 20.

kube-apiserver 설정 기본 구조

kube-apiserver는 일반적으로 다음 두 방식으로 설정할 수 있습니다.

  • kubeadm 설치 환경 → /etc/kubernetes/manifests/kube-apiserver.yaml 수정
kubeadm은 Kubernetes를 간편하게 설치하는 도구입니다.
kubeadm으로 k8s를 설치하게 되면 kube-apiserver는 "Static Pod" 방식으로 실행됩니다.

  • Static Pod이란?
    특정 경로(/etc/kubernetes/manifests/)에 있는 YAML 파일을 kubelet이 자동으로 감지해서 실행하는 방식입니다.
  • 설정 위치:
    /etc/kubernetes/manifests/kube-apiserver.yaml
    → 이 파일을 수정하면 kube-apiserver의 설정이 바뀌고, kubelet이 자동으로 재시작해줍니다.
  • 예시: 이 파일에서 --secure-port=6443, --advertise-address=... 같은 옵션들을 바꿀 수 있습니다.
  • 직접 운영 환경 (static pod, systemd 등) → 실행 스크립트 또는 systemd unit 수정
kubeadm을 쓰지 않고, 직접 Kubernetes 컴포넌트를 설치하거나 시스템을 구성한 경우입니다.
이럴 땐 보통 systemd나 수동 스크립트로 kube-apiserver를 실행합니다.

  • systemd 방식이면:
    설정 파일은 /etc/systemd/system/kube-apiserver.service 또는 이와 비슷한 위치.
    여기서 ExecStart=... 라인에 실행 옵션들이 들어갑니다.
  • 스크립트 방식이면:
    그냥 셸 스크립트(start-apiserver.sh 같은)로 실행될 수도 있습니다. 이 스크립트 안에 실행 옵션이 적혀 있습니다.

주요 설정 항목 예시 (kube-apiserver.yaml)

spec:
  containers:
  - name: kube-apiserver
    command:
    - kube-apiserver
    - --advertise-address=192.168.0.10
    - --secure-port=6443
    - --authorization-mode=Node,RBAC
    - --authentication-token-webhook-config-file=/etc/kubernetes/webhook-auth-config.yaml
    - --enable-admission-plugins=NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook
    - --audit-log-path=/var/log/apiserver-audit.log
    - --etcd-servers=https://127.0.0.1:2379
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
 

1. Webhook 인증(Authentication Webhook) 실습

목표

외부 HTTP 서버에서 토큰을 검증해주는 Webhook 인증 서버 구성

webhook 설정 파일 작성

# /etc/kubernetes/webhook-auth-config.yaml
apiVersion: v1
kind: Config
clusters:
- name: innoverse
  cluster:
    server: https://webhook-auth-server.default.svc:443
    certificate-authority: /etc/kubernetes/pki/ca.crt
users:
- name: authn
contexts:
- context:
    cluster: innoverse
    user: innoverse
  name: webhook
current-context: webhook

이 파일을 --authentication-token-webhook-config-file로 지정


Webhook 인증 서버 샘플 코드 (Python)

from flask import Flask, request, jsonify
app = Flask(__name__)

@app.route('/', methods=['POST'])
def auth():
    token = request.json.get('spec', {}).get('token')
    if token == "valid-token":
        return jsonify({
            "apiVersion": "authentication.k8s.io/v1beta1",
            "kind": "TokenReview",
            "status": {
                "authenticated": True,
                "user": {
                    "username": "external-user",
                    "uid": "1234",
                    "groups": ["system:authenticated"]
                }
            }
        })
    return jsonify({"status": {"authenticated": False}})

app.run(host='0.0.0.0', port=443, ssl_context=('cert.pem', 'key.pem'))

2. Webhook 인가(Authorization Webhook) 실습

비슷한 방식으로 사용자에게 권한이 있는지 여부를 판단하는 webhook도 가능:

  • 설정 플래그: --authorization-mode=Webhook
  • 인증 서버는 SubjectAccessReview 요청을 받고, 허용 여부를 리턴해야 함

3. Admission Webhook 실습 (Mutating / Validating)

목표

Pod 생성 시 라벨을 자동 추가하거나, 특정 네임스페이스에선 금지하는 정책 적용


Mutating Webhook 예시 (Pod 라벨 강제 추가)

@app.route('/mutate', methods=['POST'])
def mutate():
    admission_request = request.json['request']
    patch = [
        {
            "op": "add",
            "path": "/metadata/labels/env",
            "value": "dev"
        }
    ]
    return jsonify({
        "response": {
            "uid": admission_request["uid"],
            "allowed": True,
            "patchType": "JSONPatch",
            "patch": base64.b64encode(json.dumps(patch).encode()).decode()
        }
    })

Webhook 설정 리소스 (MutatingWebhookConfiguration)

 
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: add-label
webhooks:
- name: addlabel.example.com
  rules:
  - apiGroups: [""]
    apiVersions: ["v1"]
    operations: ["CREATE"]
    resources: ["pods"]
  clientConfig:
    service:
      name: webhook-server
      namespace: default
      path: /mutate
    caBundle: <CA 바이트코드>
  admissionReviewVersions: ["v1"]
  sideEffects: None

마무리

실습설명

Audit 로그 설정 요청 흐름 디버깅에 필수
Admission Webhook 서버 만들기 정책 자동화, 보안 강화
Webhook 인증/인가 외부 시스템과 연동된 인증 체계 구축
OpenAPI spec 보기 kubectl get --raw /openapi/v2
kube-apiserver 로그 레벨 증가 --v=6 이상 설정

'Infra > Kubernetes' 카테고리의 다른 글

NFS 와 CSI  (1) 2025.06.05
애플리케이션 배포 전략  (3) 2025.06.04
Kube-ApiServer 요청 처리 흐름  (0) 2025.04.25
RBAC  (0) 2025.04.25
StorageClass  (0) 2025.03.26