在 Oracle Cloud Native Environment 使用以角色為基礎的存取控制

簡介

隨著 Kubernetes 叢集的部署數目增加,您可能需要協助管理叢集。Kubernetes API 提供新增使用者及定義其叢集權限的功能。

使用者認證之後,Kubernetes 會驗證使用者有權執行的動作。Kubernetes 原生支援角色型存取控制 (RBAC) ,且預設會在 Oracle Cloud Native Environment (Oracle CNE) 中啟用。讓它成為常用的其中一個存取控制方法。RBAC 可讓您套用限制使用者對叢集資源存取權的規則,以管理對部署至 Kubernetes 環境之資源的存取權。這些規則可以是使用角色來限制命名空間,也可以是使用 ClusterRole 來限制叢集範圍。

您會發現瞭解 Kubernetes 中「以角色為基礎的存取控制 (RBAC)」的主要元件有幫助,其中包括:

另一種管理 Kubernetes 叢集存取的方式是以屬性為基礎的存取控制 (ABAC) ,與 RBAC 相比,原則的調整更精細。但這超出了本教學課程的範圍。

本教學課程涵蓋使用 RBAC 管理對 Kubernetes 叢集的存取並示範簡單使用案例的基本知識。

如需有關 Oracle Cloud Native Environment 2 的詳細資訊,請參閱目前的版本文件網站。

目標

在本教學課程中,您將學習到:

必要條件

設定 Oracle Cloud Native Environment

注意:如果是在您自己的租用戶中執行,請先閱讀 linux-virt-labs GitHub 專案 README.md 並完成先決條件,再部署實驗環境環境。

  1. 在 Luna Desktop 上開啟終端機。

  2. 複製 linux-virt-labs GitHub 專案。

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 變更至工作目錄。

    cd linux-virt-labs/ocne2
    
  4. 安裝必要的集合。

    ansible-galaxy collection install -r requirements.yml
    
  5. 部署實驗環境環境。

    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 叢集

  1. 開啟終端機,並透過 SSH 連線至 ocne 執行處理。

    ssh oracle@<ip_address_of_instance>
    
  2. 等待叢集穩定,以及讓所有 Pod 報告處於執行中狀態。

    watch kubectl get pods -A
    

    一旦所有 Pod 顯示 執行中STATUS ,請輸入 Ctrl-C 以結束 watch 指令。

  3. 確認有多少節點存在。

    kubectl get nodes
    

確認目前的 RBAC 組態

RBAC 會管理您在部署到 Kubernetes 叢集之資源上執行之動作的權限。您將檢查 RBAC 是否已啟用,並複查叢集中的預設角色。

  1. 已啟用確認 RBAC。

    如果可以看見 rbac.authorization.k8s.io API,則表示已設定 RBAC,並用來控制使用者或服務帳號在叢集資源上可採取的動作。

    kubectl api-versions | grep rbac
    

    輸出範例:

    [oracle@ocne ~]$ kubectl api-versions | grep rbac
    rbac.authorization.k8s.io/v1
    
  2. 顯示內建叢集角色。

    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
    

    一般使用者使用 admincluster-admin 角色,而 RBAC API 保留內部元件的 system: 角色。

  3. 列出 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 資源的權限。

建立命名空間和角色

  1. 建立「命名空間」。

    為此範例建立新的命名空間。

    kubectl create namespace rbac-example
    
  2. 建立角色。

    建立一個將唯讀存取權 (「get」和「list」權限) 授予 rbac-example 命名空間內 podsdeployments 的角色。

    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 命名空間中的部署。
  3. 套用檔案。

    kubectl apply -f pod-reader-role.yaml
    
  4. 檢查新建立之 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]
    

建立使用者並連結至角色

  1. 建立一個稱為 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 的服務帳號。
  2. 套用檔案。

    kubectl apply -f pod-reader-user.yaml
    

測試 RoleBinding

接著,建立新的 Pod 並使用新建立的 pod-reader-user 服務帳戶來存取 RoleBinding,以進行測試。

  1. 建立新的測試部署。

    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 服務帳戶的權限和證明資料。
  2. 套用檔案。

    kubectl apply -f testpod.yaml
    
  3. 現在,請嘗試使用 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 使用者帳戶身分執行命令,以驗證是否允許執行動作。

  4. 確認 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
    
  5. 嘗試使用 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?

  6. 嘗試使用 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 資源執行 getlist 動作。不允許任何其他動作 ( deletecreate)。

建立 ClusterRole

ClusterRoles 與「角色」類似,但它們會定義整個叢集之資源的允許權限。

注意:授與太廣泛的權限時請務必小心。請改用最少「最低權限原則」,只授予使用者和服務帳戶完成指派之工作所需的權限。

建立 ClusterRole 和 ClusterRoleBinding

上一個範例顯示如何建立命名空間特定的使用者與角色。下列步驟示範如何建立 ClusterRole 並將它連結至使用者,以授與他們整個叢集的管理員存取權。

  1. 建立新的 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: ["*"] - 指定規則授與資源上所有可能的動詞,包括 getlistcreatedelete 等。
  2. 套用檔案。

    kubectl apply -f cluster-admin-clusterrole.yaml
    
  3. 建立 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 服務帳號。
  4. 套用檔案。

    kubectl apply -f cluster-admin-user.yaml
    

測試 ClusterRoleBinding

  1. 嘗試存取其他命名空間中的資源來測試叢集角色。例如, default 命名空間。

    kubectl auth can-i list pods --as=system:serviceaccount:rbac-example:cluster-admin-user -n default
    

    您應該會看到 yes 作為輸出,表示 cluster-admin-user 具有 cluster-admin 存取權。

  2. 確認新建立的 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 來存取它。

  1. 建立新的測試部署。

    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 命名空間。

  2. 套用檔案。

    kubectl apply -f testpod2.yaml
    
  3. 確認已順利完成部署。

    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