kube-apiserver 설정 기본 구조
kube-apiserver는 일반적으로 다음 두 방식으로 설정할 수 있습니다.
- kubeadm 설치 환경 → /etc/kubernetes/manifests/kube-apiserver.yaml 수정
kubeadm은 Kubernetes를 간편하게 설치하는 도구입니다. kubeadm으로 k8s를 설치하게 되면 kube-apiserver는 "Static Pod" 방식으로 실행됩니다.
|
- 직접 운영 환경 (static pod, systemd 등) → 실행 스크립트 또는 systemd unit 수정
kubeadm을 쓰지 않고, 직접 Kubernetes 컴포넌트를 설치하거나 시스템을 구성한 경우입니다. 이럴 땐 보통 systemd나 수동 스크립트로 kube-apiserver를 실행합니다.
|
주요 설정 항목 예시 (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 |