專案管理

預設範本

在 OKD 內有預設的範本,當你使用 Web Console 或是 oc 建立專案的時候,就會套用這個預設範本,你可以匯出這個範本,然後修改成你的設定,再匯入至 OKD 中。

匯出範本:

$ oc adm create-bootstrap-project-template -o yaml > template.yaml

打開範本後可以看到很多設定,包含預設的 RoleBinding 角色有哪些,你可以修改這些設定後匯入至 OKD:

$ oc create -f template.yaml -n default

接者在 master-config.yaml 中指定預設使用這個範本

...
projectConfig:
  projectRequestTemplate: "default/project-request"
...

範本中有以些變數,譬如 ${PROJECT_NAME},每當要建立專案時,API 就會把者幾個變數帶入範本中。

變數 描述
PROJECT_NAME (必要) 專案名稱
PROJECT_DISPLAYNAME 專案顯示的名稱,可以為空值。
PROJECT_DESCRIPTION 專案描述,可以為空值。
PROJECT_ADMIN_USER 專案管理員。
PROJECT_REQUESTING_USER 建立專案的使用者。

具備 叢集或專案的 self-provisioners 身分的開發者都可以透過 API 建立專案,預設通過驗證的使用者都有這權限。

禁止修改範本

如果您不想讓使用者修改 self-provisioners 的專案建立範本,您可以禁止他們修改範本。

  1. 登入 Cluster-admin
  2. 查看叢集的 self-provisioners 角色。可以使用下列命令,並查看 self-provisioners 的描述。
    $ oc  describe clusterrolebinding.rbac self-provisioners

    Name:       self-provisioners
    Labels:     <none>
    Annotations:    rbac.authorization.kubernetes.io/autoupdate=true
    Role:
    Kind:   ClusterRole
    Name:   self-provisioner
    Subjects:
    Kind    Name                Namespace
    ----    ----                ---------
    Group   system:authenticated:oauth
  1. 從 system:authenticated:oauth 移除 self_provisioner 叢集角色
    • 如果只有綁訂一個群組,執行以下指令:

    $ oc patch clusterrolebinding.rbac self-provisioners -p ‘{“subjects”: null}’

    • 如果有綁訂一個以上的群組、使用者或系統帳號,執行以下指令:

    $ oc adm policy remove-cluster-role-from-group self-provisioner system:authenticated:oauth

  2. 設定專案建立提示訊息,因為使用者無法自行建立專案,但我們可以在使用者從 Web Console 或 oc 要建立專案時,告訴他要跟誰聯絡或是需要填寫表單之類的。請編輯 master-cofig.yaml 設定檔,設定當中的 projectRequestMessage 訊息,直接設定您要告訴使用只的訊息即可,例:

    ...
    projectConfig:
      ProjectRequestMessage: "To create a new project, contact at projectname@example.com."
    ...
  1. 變更設定值,避免 self-provisioners 在自動更新時被覆蓋掉。自動更新會將整個叢集的角色回復到原始狀態,請執行以下命令:
    $ oc edit clusterrolebinding.rbac self-provisioners

編輯 rbac.authorization.kubernetes.io/autoupdate 的值為 false。

    apiVersion: authorization.openshift.io/v1
    kind: ClusterRoleBinding
    metadata:
        annotations:
        rbac.authorization.kubernetes.io/autoupdate: "false"
    ...

或是使用命令列的方式更新。

    $ oc patch clusterrolebinding.rbac self-provisioners -p '{ "metadata": { "annotations": { "rbac.authorization.kubernetes.io/autoupdate": "false" } } }'

Node 篩選器

設定預設的叢集 Node 篩選器

您可以設定 /etc/origin/master/master-config.yaml 中的 nodeSelector 變數來代表您常用的篩選器,可以設定為您常用的節點和 Pod 預設存放的節點,這樣所有新建立的 Pod 都會預設只存在這些節點,編輯 master-config.yaml:

...
projectConfig:
  defaultNodeSelector:“type = user-node,region = east”
... 

此變更需要重新啟動後才會生效。

# master-restart api
# master-restart controllers

設定專案的預設 Node 篩選器

如果您要建立個人專案,想要此專案下的 Pod 都只存放在特定的節點,又或者是你只想將專案存放在某些區 (譬如亞洲),你可以用 –node-selector 來指定節點。

以下的指令將會建立一個名為 myproject 的專案,並且此專案的 Pod 都只從放在特定的節點 (‘type=user-node,region=east’):

$ oc adm new-project myproject --node-selector='type=user-node,region=east'

注意!oc 與 oc adm 同樣都有 new-project 的參數,但是如果你要使用 –node-selector 的話,必須用 oc adm

您可以編輯設定中的 annotations 資訊來修改 –node-selector 的設定:

...
metadata:
  annotations:
    openshift.io/node-selector: type=user-node,region=east
...

可使用指令直接修改已存在的專案:

# oc patch namespace myproject -p '{"metadata":{"annotations":{"openshift.io/node-selector":"node-role.kubernetes.io/infra=true"}}}'

如果 openshift.io/node-selector 設定成空值 (oc adm new-project –node-selector=””),表示此專案沒有節點的限制,即使管理員已經設定了預設的值,也不會受到影響。換個說法,身為管理員,你可以先設定預設的 openshift.io/node-selector,然後清除特別專案設定,讓某一些專案擴展到整個叢集。

Pod 的 Node 篩選器

開發人員如果只要想要 Pod 存放在特定的節點,可以設定 Pod 的設定檔,設定 nodeSelector 這個變數:

apiVersion: v1
kind: Pod
spec:
  nodeSelector:
  disktype: ssd
...

但是設定在 Pod 設定檔中的篩選器,將不會複寫叢集或是專案的設定,而是附加在條件中。

例如你的專案一開始就設定了

`openshift.io/node-selector: type=user-node,region=east`

若你在 Pod 中又設定了 clearance=classified,則整個篩選條件會變成:

`penshift.io/node-selector: type=user-node,region=east,clearance=classified`

如果你重複設定了 region=west,篩選條件不會覆蓋舊的,而是附加上去,變成:

`openshift.io/node-selector: type=user-node,region=east,region=west`。

很有可能造成 Pod 無法運作,需要特別注意。

限制每個用戶可以建立的專案數量

你可以設定 ProjectRequestLimit 來限制每個用戶建立專案的數量。如果你使用 OKD 3.1 的範本建立專案,或是用更早之前的版本所建立的專案,並沒有這個設定值,你需要自行加入。

你需要修改 /etc/orgin/master/master-config.yaml 檔來加入設定,設定的條件是由上而下,符合規則就不在往下比對。沒有符合條件的用戶會套用全域設定,設定的範例如下:

admissionConfig:
pluginConfig:
  ProjectRequestLimit:
  configuration:
    apiVersion: v1
    kind: ProjectRequestLimitConfig
    limits:
    - selector:
        level: admin 
    - selector:
        level: advanced 
        maxProjects: 10
    - maxProjects: 2 

上述設定的結果是,level=amdin 的用戶沒有上限; level=advanced 的用戶最多只能建立 10 個專案; 而不在這兩個條件的用戶都只能建立 2 個專案。修改後需重新啟動 master:

# master-restart api
# master-restart controllers

啟用系統帳號 (Service Account) 建立專案

預設上,系統帳號 (Service Account) 不能建立專案,但是管理者可以額外開啟此設定,並且可以針對每一個系統帳號建立專案的數量進行限制。您必須使用使用 [admission control] 外掛的 ProjectRequestlimit 設定。步驟:

  1. 建立系統帳號 (如果需要的話)

    $ oc create sa

  2. 賦予權限

    $ oc adm policy \
    add-cluster-role-to-user self-provisioner \
    system:serviceaccount::

修改 /etc/origin/master/master-config.yaml 檔,設定 ProjectRequestLimit 中的 maxProjectsForServiceAccounts 參數來代表可建立專案的最大數量。範例:

admissionConfig:
pluginConfig:
    ProjectRequestLimit:
    configuration:
        apiVersion: v1
        kind: ProjectRequestLimitConfig
        maxProjectsForServiceAccounts: 3
  1. 重新啟動 OKD

完成後,您需要 重新啟動 OKD 後,變更才會生效。

# master-restart api
# master-restart controllers
文章資訊
slug:okd-manage-projects
title:OpenShift (OKD) 內的專案管理
tags:manage,projects,openshift,okd
categories:openshift
thumbnail:imagesopenshift-2.jpg
最後修改日期: 2019-09-18

作者