Контроллер доступа Kubernetes — это компонент, который перехватывает и проверяет запросы к серверу API Kubernetes перед их сохранением. Он помогает обеспечить безопасность, соответствие требованиям и настраиваемые политики, принимая решения о том, разрешать или отклонять запросы.
Контроллеры доступа реализованы как веб-перехватчики, зарегистрированные на сервере API Kubernetes. Когда делается запрос на создание, обновление или удаление ресурса Kubernetes, сервер API отправляет запрос зарегистрированным контроллерам доступа для проверки и обработки.
Вот несколько способов реализации контроллера доступа Kubernetes:
- Мутирующий контроллер допуска:
Этот тип контроллера допуска перехватывает запросы и изменяет входящий ресурс или его конфигурацию. Его можно использовать для автоматического внедрения дополнительных контейнеров, добавления меток или изменения других свойств ресурса. Вот пример изменяющегося контроллера доступа, использующего клиентскую библиотеку Kubernetes в Go:
// main.go
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"k8s.io/api/admission/v1beta1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func main() {
http.HandleFunc("/mutate", mutateHandler)
http.ListenAndServe(":8080", nil)
}
func mutateHandler(w http.ResponseWriter, r *http.Request) {
// Read the admission review request
body, err := ioutil.ReadAll(r.Body)
if err != nil {
http.Error(w, fmt.Sprintf("Failed to read request body: %v", err), http.StatusBadRequest)
return
}
// Parse the admission review request
admissionReview := v1beta1.AdmissionReview{}
if err := json.Unmarshal(body, &admissionReview); err != nil {
http.Error(w, fmt.Sprintf("Failed to parse admission review: %v", err), http.StatusBadRequest)
return
}
// Modify the incoming resource
pod := admissionReview.Request.Object.Object.(*corev1.Pod)
pod.ObjectMeta.Labels["my-label"] = "my-value"
// Prepare the admission response
admissionReview.Response = &v1beta1.AdmissionResponse{
Allowed: true,
Result: &metav1.Status{Message: "Mutation successful"},
}
// Write the admission response
responseBody, err := json.Marshal(admissionReview)
if err != nil {
http.Error(w, fmt.Sprintf("Failed to marshal admission response: %v", err), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(responseBody)
}
- Проверка контроллера допуска.
Этот тип контроллера допуска проверяет входящие запросы и решает, разрешить или отклонить их на основе пользовательских политик. Его можно использовать для обеспечения соблюдения правил безопасности, квот ресурсов или любых других желаемых ограничений. Вот пример проверяющего контроллера доступа с использованием клиентской библиотеки Kubernetes на Python:
# main.py
from kubernetes import client, config
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/validate", methods=["POST"])
def validate_handler():
admission_review = request.get_json()
request_object = admission_review["request"]["object"]
response = {"response": {"allowed": False}}
# Perform custom validation logic
if request_object["spec"]["replicas"] <= 5:
response["response"]["allowed"] = True
return jsonify(response)
if __name__ == "__main__":
config.load_kube_config()
app.run(host="0.0.0.0", port=8080)
Это всего лишь два примера реализации контроллеров допуска. Вы можете использовать различные другие методы и языки, например использование Java-клиента Kubernetes или написание контроллеров доступа на TypeScript.