# OPA Gatekeeper for Kubernetes Admission Control ## 甚麼是 Open Policy Agent (OPA)? 和 OPA Gatekeeper 有什麼差別? 在開發服務的時候,我們會需要注意到服務的 驗證 (Authentication) 和 授權 (Authorization) 這兩套機制要怎麼實作,區別如下: * Authentication(驗證):確認使用者是否存在於系統當中,比方你在登入公司系統,系統會先確認你是否是這家公司的員工。 * Authorization(授權):根據使用者的角色來授予應有的權限,成功登入公司系統後,系統會根據你的職等,決定你可以看什麼資料、做什麼事情。 而 OPA 的概念就是要 把 授權(Authorization) 的概念從服務中獨立出來,讓不同的服務都能夠呼叫同一個 OPA Server 做 授權 (Authorization) 這件事,概念圖如下: ![image](https://hackmd.io/_uploads/r1kL0TnDkl.png) 比方說 API Server 接收到了一個 Request,在已經確認這個 Request 是由合法的使用者發出的請求後,API Server 會再發出一個請求到 OPA Server,確認這個 Request 要做的事情和不合乎規範,若合乎系統規範,回傳成功,反之則回傳失敗。 那 OPA Gatekeeper 又是什麼? Gatekeeper 是專為 OPA 的 Kubernetes Admission Control 使用個案所建立。OPA Gatekeeper 封裝了 OPA 的程式碼,讓 OPA 可以以 Webhook Server 的方式運作在 Kubernetes 裡面,解決了 Kubernetes 各種部署的審核問題。 ## 開始實作 ### 目標 : 限制 Deployment 的 Replicas 數量 ```! # 1. 安裝 OPA Gatekeeper $ kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/v3.18.2/deploy/gatekeeper.yaml # 2. 建立 replicalimits 的 ConstraintTemplate ## ConstraintTemplate 定義了用於強制執行約束的政策,以及約束的一般模式。 $ kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper-library/master/library/general/replicalimits/template.yaml # 3. 設定 Replica 數量只能在 3 到 5 之間 $ cat <<EOF | kubectl apply -f - apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sReplicaLimits metadata: name: replica-limits spec: match: kinds: - apiGroups: ["apps"] kinds: ["Deployment"] # 以下為限制 kubectl scale 的時候也會阻擋,如果不設定,就只有 Create 的時候會阻擋 - apiGroups: ["autoscaling"] # add kinds: ["Scale"] # add parameters: ranges: - min_replicas: 3 max_replicas: 5 EOF # 4. 建立 test namespace $ kubectl create ns test namespace/test created # 5. 建立 6 個 replicas 的 deployment $ kubectl -n test create deployment nginx --image=nginx --replicas=6 error: failed to create deployment: admission webhook "validation.gatekeeper.sh" denied the request: [replica-limits] The provided number of replicas is not allowed for Deployment: nginx. Allowed ranges: {"ranges": [{"max_replicas": 5, "min_replicas": 3}]} # 6. 建立符合規則的 deployment $ kubectl -n test create deployment nginx --image=nginx --replicas=5 # 7. 檢視 pod 運作狀態 $ kubectl -n test get pod NAME READY STATUS RESTARTS AGE nginx-676b6c5bbc-crdj5 1/1 Running 0 5m50s nginx-676b6c5bbc-j6dlq 1/1 Running 0 5m50s nginx-676b6c5bbc-r42nr 1/1 Running 0 5m50s nginx-676b6c5bbc-wkbtw 1/1 Running 0 5m50s nginx-676b6c5bbc-z54w5 1/1 Running 0 5m50s # 8. 測試將 nginx deployment 的 replica scale 到 999 $ kubectl -n test scale deployment nginx --replicas 999 --dry-run=server Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [replica-limits] The provided number of replicas is not allowed for Scale: nginx. Allowed ranges: {"ranges": [{"max_replicas": 5, "min_replicas": 3}]} # 成功阻擋,收工! ``` ## 參考文件 - [Installation - Gatekeeper Docs](https://open-policy-agent.github.io/gatekeeper/website/docs/install) - [Replica Limits - Gatekeeper Docs](https://open-policy-agent.github.io/gatekeeper-library/website/validation/replicalimits/) - [OPA Gatekeeper 筆記整理 - I](https://hazel.style/2022/03/13/OPA-Gatekeeper-Note-I/) - [OPA Gatekeeper is not enforcing deployment replicas using oc or kubectl scale - RedHat kb](https://access.redhat.com/solutions/6958776)