在 Oracle Cloud Native Environment 使用以角色為基礎的存取控制
簡介
隨著 Kubernetes 叢集的部署數目增加,您可能需要協助管理叢集。Kubernetes API 提供新增使用者及定義其叢集權限的功能。
使用者認證之後,Kubernetes 會驗證使用者有權執行的動作。Kubernetes 原生支援角色型存取控制 (RBAC) ,且預設會在 Oracle Cloud Native Environment (Oracle CNE) 中啟用。讓它成為常用的其中一個存取控制方法。RBAC 可讓您套用限制使用者對叢集資源存取權的規則,以管理對部署至 Kubernetes 環境之資源的存取權。這些規則可以是使用角色來限制命名空間,也可以是使用 ClusterRole 來限制叢集範圍。
您會發現瞭解 Kubernetes 中「以角色為基礎的存取控制 (RBAC)」的主要元件有幫助,其中包括:
- 角色:定義命名空間內允許動作的一組已定義權限。
- RoleBindings:用來將角色連結至命名空間中的使用者或服務帳戶。
- ClusterRole:定義叢集中所有命名空間之允許動作的一組已定義權限。
- ClusterRoleBindings:用來將 ClusterRole 連結至叢集中所有命名空間的使用者或服務帳號。
- 主旨:這些是連結至角色或 ClusterRoles 的使用者、群組或服務帳戶。
- 權限:這些權限定義角色 (或 ClusterRole) 可對指定資源執行的允許動作。它們與角色和叢集角色相關聯,而非使用者或服務帳號。
另一種管理 Kubernetes 叢集存取的方式是以屬性為基礎的存取控制 (ABAC) ,與 RBAC 相比,原則的調整更精細。但這超出了本教學課程的範圍。
本教學課程涵蓋使用 RBAC 管理對 Kubernetes 叢集的存取並示範簡單使用案例的基本知識。
如需有關 Oracle Cloud Native Environment 2 的詳細資訊,請參閱目前的版本文件網站。
目標
在本教學課程中,您將學習到:
- 建立角色以示範依命名空間限制使用者權限。
- 建立 ClusterRole 以示範授與整個叢集的使用者權限。
必要條件
- Oracle Cloud Native Environment (Oracle CNE) 的安裝
- 單一控制節點與一個工作節點
設定 Oracle Cloud Native Environment
注意:如果是在您自己的租用戶中執行,請先閱讀 linux-virt-labs
GitHub 專案 README.md 並完成先決條件,再部署實驗環境環境。
-
在 Luna Desktop 上開啟終端機。
-
複製
linux-virt-labs
GitHub 專案。git clone https://github.com/oracle-devrel/linux-virt-labs.git
-
變更至工作目錄。
cd linux-virt-labs/ocne2
-
安裝必要的集合。
ansible-galaxy collection install -r requirements.yml
-
部署實驗環境環境。
ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e install_ocne_rpm=true -e create_ocne_cluster=true -e "ocne_cluster_node_options='-n 1 -w 1'"
自由實驗環境環境需要額外的變數
local_python_interpreter
,此變數會設定在 localhost 上執行的播放ansible_python_interpreter
。由於環境會安裝 Oracle Cloud Infrastructure SDK for Python 的 RPM 套件 (位於 python3.6 模組底下),因此需要此變數。預設部署資源配置使用 AMD CPU 和 Oracle Linux 8。若要使用 Intel CPU 或 Oracle Linux 9,請在部署命令中新增
-e instance_shape="VM.Standard3.Flex"
或-e os_version="9"
。重要事項: 請等待播放手冊順利執行,然後到達暫停工作。在手冊的這個階段,已完成 Oracle CNE 的安裝,且執行處理已就緒。記下先前的播放,此播放會列印其部署節點的公用和專用 IP 位址,以及執行實驗室時所需的任何其他部署資訊。
存取 Kubernetes 叢集
-
開啟終端機,並透過 SSH 連線至 ocne 執行處理。
ssh oracle@<ip_address_of_instance>
-
等待叢集穩定,以及讓所有 Pod 報告處於執行中狀態。
watch kubectl get pods -A
一旦所有 Pod 顯示 執行中的 STATUS ,請輸入
Ctrl-C
以結束watch
指令。 -
確認有多少節點存在。
kubectl get nodes
確認目前的 RBAC 組態
RBAC 會管理您在部署到 Kubernetes 叢集之資源上執行之動作的權限。您將檢查 RBAC 是否已啟用,並複查叢集中的預設角色。
-
已啟用確認 RBAC。
如果可以看見
rbac.authorization.k8s.io
API,則表示已設定 RBAC,並用來控制使用者或服務帳號在叢集資源上可採取的動作。kubectl api-versions | grep rbac
輸出範例:
[oracle@ocne ~]$ kubectl api-versions | grep rbac rbac.authorization.k8s.io/v1
-
顯示內建叢集角色。
kubectl get clusterroles | grep admin
輸出範例:
[oracle@ocne ~]$ kubectl get clusterroles | grep admin admin 2025-07-23T10:21:55Z cluster-admin 2025-07-23T10:21:55Z system:aggregate-to-admin 2025-07-23T10:21:55Z system:kubelet-api-admin 2025-07-23T10:21:55Z
一般使用者使用
admin
和cluster-admin
角色,而 RBAC API 保留內部元件的system:
角色。 -
列出
cluster-admin
的權限。kubectl describe clusterrole cluster-admin
輸出範例:
[oracle@ocne ~]$ kubectl describe clusterrole cluster-admin Name: cluster-admin Labels: kubernetes.io/bootstrapping=rbac-defaults Annotations: rbac.authorization.kubernetes.io/autoupdate: true PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- *.* [] [] [*] [*] [] [*]
動詞和資源資料欄中的星號表示
cluster-admin
角色可以執行任何動作。該發行版本的 API 總覽中提供了每個 Kubernetes 發行版本的作業 (動詞) 的高階清單。例如,在 Kubernetes v1.33.0 中。從命令行執行kubectl api-resources -o wide
,即可取得每個資源類型可用的有效作業 ( 動詞 ) 詳細清單。不過,由於您未登入
kubectl
,Kubernetes 如何知道執行命令的使用者是?生產系統通常使用 LDAP 伺服器進行認證。如果沒有外部認證系統,可以使用 ServiceAccount 。備註:ServiceAccounts 是由自動化工作負載 (例如 CI/CD 管線) 使用,但也可用於測試。
建立角色
「角色」是受命名空間限制的資源,定義在單一命名空間內存取 Kubernetes 資源的權限。
建立命名空間和角色
-
建立「命名空間」。
為此範例建立新的命名空間。
kubectl create namespace rbac-example
-
建立角色。
建立一個將唯讀存取權 (「get」和「list」權限) 授予 rbac-example 命名空間內 pods 和 deployments 的角色。
cat << EOF | tee pod-reader-role.yaml > /dev/null apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: pod-reader namespace: rbac-example rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"] - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "list"] EOF
其中:
rules:
- 定義授予角色的權限。此範例定義兩個規則 (請參閱下方)。apiGroups: [""]
- 允許連結至此規則的使用者或服務帳號擷取並列出rbac-example
命名空間中的 Pod。apiGroups: ["apps"]
- 允許連結至此規則的使用者或服務帳號,擷取並列出rbac-example
命名空間中的部署。
-
套用檔案。
kubectl apply -f pod-reader-role.yaml
-
檢查新建立之 pod-reader 角色的權限。
kubectl describe role/pod-reader -n rbac-example
輸出範例:
[oracle@ocne ~]$ kubectl describe role/pod-reader -n rbac-example Name: pod-reader Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods [] [] [get list] deployments.apps [] [] [get list]
建立使用者並連結至角色
-
建立一個稱為 pod-reader-user 的新 ServiceAccount 使用者,並將其連結至 pod-reader 角色。
cat << EOF | tee pod-reader-user.yaml > /dev/null apiVersion: v1 kind: ServiceAccount metadata: name: pod-reader-user namespace: rbac-example --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: pod-reader-binding namespace: rbac-example roleRef: name: pod-reader kind: Role subjects: - kind: ServiceAccount name: pod-reader-user namespace: rbac-example EOF
其中:
- ServiceAccount 會建立服務帳號。
name:
- 服務帳號使用者名稱 (pod-reader-user
)。namespace
- 建立它的命名空間 (rbac-example
)。
- RoleBinding 會將命名空間相關的權限授予服務帳號。
roleRef:
- 指定連結角色。在此範例中,它會參照名為pod-reader
的角色。subjects:
- 指定要授予權限的實體。在此範例中,名為pod-reader-user
的服務帳號。
- ServiceAccount 會建立服務帳號。
-
套用檔案。
kubectl apply -f pod-reader-user.yaml
測試 RoleBinding
接著,建立新的 Pod 並使用新建立的 pod-reader-user 服務帳戶來存取 RoleBinding,以進行測試。
-
建立新的測試部署。
cat << EOF | tee testpod.yaml > /dev/null apiVersion: v1 kind: Pod metadata: name: test-pod namespace: rbac-example spec: containers: - name: test-container image: ghcr.io/oracle/oraclelinux9-nginx:1.20 ports: - containerPort: 80 serviceAccountName: pod-reader-user EOF
其中:
spec:
會定義 Pod 的期望狀態。containers:
- 指定要在 Pod 中執行的容器清單。在此範例中,只有一個容器。name:
- 容器的名稱 (test-container
)。image:
- 要使用的影像 (ghcr.io/oracle/oraclelinux9-nginx:1.20
)。ports:
- 指定容器公開的連接埠。在此範例中,其為連接埠 80 (containerPort: 80
)。
serviceAccountName:
- 指定要用於 Pod 的服務帳號。在此組態中,Pod 會使用指派給pod-reader-user
服務帳戶的權限和證明資料。
-
套用檔案。
kubectl apply -f testpod.yaml
-
現在,請嘗試使用 pod-reader-user ServiceAccount 存取 Pod。
kubectl auth can-i get pod/test-pod --as=system:serviceaccount:rbac-example:pod-reader-user -n rbac-example
您應該會看到
yes
作為輸出,表示 pod-reader-user 具有存取 Pod 的權限。注意:使用
kubectl auth can-i
功能,以新建立的 ServiceAccount 使用者帳戶身分執行命令,以驗證是否允許執行動作。 -
確認 ServiceAccount 的運作方式如預期。
kubectl --as=system:serviceaccount:rbac-example:pod-reader-user get pods -n rbac-example
輸出範例:
[oracle@ocne ~]$ kubectl --as=system:serviceaccount:rbac-example:pod-reader-user get pods -n rbac-example NAME READY STATUS RESTARTS AGE test-pod 1/1 Running 0 109s
-
嘗試使用
pod-reader-user
角色刪除 Pod。kubectl --as=system:serviceaccount:rbac-example:pod-reader-user delete pod test-pod -n rbac-example
輸出範例:
[oracle@ocne ~]$ kubectl --as=system:serviceaccount:rbac-example:pod-reader-user delete pod test-pod -n rbac-example Error from server (Forbidden): pods "test-pod" is forbidden: User "system:serviceaccount:rbac-example:pod-reader-user" cannot delete resource "pods" in API group "" in the namespace "rbac-example"
pod-reader-user
角色無法刪除rbac-example
中的 Pod。也許他們可以啟動新的 Pod? -
嘗試使用
pod-reader-role
角色執行 Pod。kubectl run nginx1 --image=ghcr.io/oracle/oraclelinux9-nginx:1.20 --as=system:serviceaccount:default:my-serviceaccount -n rbac-example
輸出範例:
[oracle@ocne ~]$ kubectl run nginx1 --image=ghcr.io/oracle/oraclelinux9-nginx:1.20 --as=system:serviceaccount:rbac-example:pod-reader-user -n rbac-example Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:rbac-example:pod-reader-user" cannot create resource "pods" in API group "" in the namespace "rbac-example"
此錯誤正確,因為
pod-reader-user
角色只允許對叢集 rbac-example 命名空間中的 Pod 資源執行get
和list
動作。不允許任何其他動作 ( delete 或 create)。
建立 ClusterRole
ClusterRoles 與「角色」類似,但它們會定義整個叢集之資源的允許權限。
注意:授與太廣泛的權限時請務必小心。請改用最少「最低權限原則」,只授予使用者和服務帳戶完成指派之工作所需的權限。
建立 ClusterRole 和 ClusterRoleBinding
上一個範例顯示如何建立命名空間特定的使用者與角色。下列步驟示範如何建立 ClusterRole 並將它連結至使用者,以授與他們整個叢集的管理員存取權。
-
建立新的 ClusterRole。
此 ClusterRole 允許新增的使用者對叢集中的所有資源執行任何動作。
cat << EOF | tee cluster-admin-clusterrole.yaml > /dev/null apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-admin-cr rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"] EOF
其中:
rules:
- 定義授予 ClusterRole 的權限。此範例只有一個規則:apiGroups: ["*"]
- 指定規則會套用至所有 API 群組。resources: ["*"]
- 指定規則適用於 API 群組的所有資源。verbs: ["*"]
- 指定規則授與資源上所有可能的動詞,包括get
、list
、create
、delete
等。
-
套用檔案。
kubectl apply -f cluster-admin-clusterrole.yaml
-
建立 ClusterRoleBinding 以將 ClusterRole 連結至新使用者。
ClusterRoleBinding 與您先前建立的 RoleBinding 類似,但其為叢集範圍。
cat << EOF | tee cluster-admin-user.yaml > /dev/null apiVersion: v1 kind: ServiceAccount metadata: name: cluster-admin-user namespace: rbac-example --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cluster-admin-crb roleRef: name: cluster-admin-cr kind: ClusterRole subjects: - kind: ServiceAccount name: cluster-admin-user namespace: rbac-example EOF
其中:
subjects:
- 定義要在 ClusterRole 中授予權限的實體。在此範例中,它是cluster-admin-user
服務帳號。
-
套用檔案。
kubectl apply -f cluster-admin-user.yaml
測試 ClusterRoleBinding
-
嘗試存取其他命名空間中的資源來測試叢集角色。例如, default 命名空間。
kubectl auth can-i list pods --as=system:serviceaccount:rbac-example:cluster-admin-user -n default
您應該會看到
yes
作為輸出,表示 cluster-admin-user 具有 cluster-admin 存取權。 -
確認新建立的 ClusterRole 正常運作。
kubectl --as=system:serviceaccount:rbac-example:cluster-admin-user get pods -A
輸出範例:
[oracle@ocne ~]$ kubectl --as=system:serviceaccount:rbac-example:cluster-admin-user get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-flannel kube-flannel-ds-ptwkz 1/1 Running 0 6h58m kube-flannel kube-flannel-ds-wn2g6 1/1 Running 0 6h58m kube-system coredns-7cbdbfd99c-7xqkl 1/1 Running 0 6h59m kube-system coredns-7cbdbfd99c-k2ssb 1/1 Running 0 6h59m kube-system etcd-ocne-control-plane-1 1/1 Running 0 6h59m kube-system kube-apiserver-ocne-control-plane-1 1/1 Running 0 6h59m kube-system kube-controller-manager-ocne-control-plane-1 1/1 Running 0 6h59m kube-system kube-proxy-48rm5 1/1 Running 0 6h59m kube-system kube-proxy-h4kd2 1/1 Running 0 6h58m kube-system kube-scheduler-ocne-control-plane-1 1/1 Running 0 6h59m ocne-system ocne-catalog-577b7cd5f9-bnvtm 1/1 Running 0 6h58m ocne-system ui-846bddd4b-lnrwm 1/1 Running 0 6h58m rbac-example test-pod 1/1 Running 0 6h34m
此輸出會確認新建立的 ClusterRole 可以存取叢集中定義的所有命名空間。
確認 ClusterRole 使用者可以建立新部署
測試 ClusterRole 以查看是否允許指派的使用者建立新的部署。然後,嘗試使用新建立的 ClusterRole 來存取它。
-
建立新的測試部署。
cat << EOF | tee testpod2.yaml > /dev/null apiVersion: v1 kind: Pod metadata: name: test-pod2 namespace: default spec: containers: - name: test-container image: ghcr.io/oracle/oraclelinux9-nginx:1.20 ports: - containerPort: 8080 EOF
請注意,此部署會部署至 'default' 命名空間,而不是先前使用的 rbac-example 命名空間。
-
套用檔案。
kubectl apply -f testpod2.yaml
-
確認已順利完成部署。
kubectl --as=system:serviceaccount:rbac-example:cluster-admin-user get pods -A
輸出範例:
[oracle@ocne ~]$ kubectl --as=system:serviceaccount:rbac-example:cluster-admin-user get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE default test-pod2 1/1 Running 0 28s kube-flannel kube-flannel-ds-shgh7 1/1 Running 0 38m kube-flannel kube-flannel-ds-zzrgh 1/1 Running 0 38m kube-system coredns-7cbdbfd99c-jg6lz 1/1 Running 0 38m kube-system coredns-7cbdbfd99c-wh5g4 1/1 Running 0 38m kube-system etcd-ocne-control-plane-1 1/1 Running 0 38m kube-system kube-apiserver-ocne-control-plane-1 1/1 Running 0 38m kube-system kube-controller-manager-ocne-control-plane-1 1/1 Running 0 38m kube-system kube-proxy-5qngx 1/1 Running 0 38m kube-system kube-proxy-6fz2q 1/1 Running 0 38m kube-system kube-scheduler-ocne-control-plane-1 1/1 Running 0 38m ocne-system ocne-catalog-577b7cd5f9-vz782 1/1 Running 0 38m ocne-system ui-846bddd4b-bbhtj 1/1 Running 0 38m rbac-example test-pod 1/1 Running 0 21m
確認新 ClusterRole 允許新部署至其他命名空間。
接下來的步驟
本教學課程示範如何透過建立角色來管理對 Kubernetes 資源的存取,在 Kubernetes 設定及使用以角色為基礎的存取控制 (RBAC)。您可以透過定義角色和連結來控制命名空間內或叢集範圍內允許對資源執行哪些動作,來達到此目的。如此一來,精細控制 RBAC 對於保護您的 Kubernetes 環境至關重要,尤其是大型部署。查看 Oracle Linux 訓練站,瞭解其他教學課程和內容。
相關連結
其他學習資源
在 docs.oracle.com/learn 上探索其他實驗室,或在 Oracle Learning YouTube 頻道上存取更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。
如需產品文件,請造訪 Oracle Help Center 。
Use Role-Based Access Control with Oracle Cloud Native Environment
G40844-01