#chiroito ’s blog

Java を中心とした趣味の技術について

OpenShift のクラスタモニタリングスタックを Infra ノードで動かす

OpenShift のクラスタモニタリングスタックの設定を変更するには、クラスタモニタリングの ConfigMap を変更する必要があります。この ConfigMap が存在しない場合は、参考の URL にあるマニュアルにある通り作成します。

設定をする前にまずはクラスタモニタリングスタックの設定を確認してみます。

$ oc -n openshift-monitoring get configmap cluster-monitoring-config -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: "2020-04-23T06:47:21Z"
  name: cluster-monitoring-config
  namespace: openshift-monitoring
  resourceVersion: "368857"
  selfLink: /api/v1/namespaces/openshift-monitoring/configmaps/cluster-monitoring-config
  uid: 619c4ac8-c623-4bbc-a47b-bc158b64e5d0

以下のコマンドを使用してクラウドモニタリングスタックの ConfigMap を編集します。

$ oc -n openshift-monitoring edit configmap cluster-monitoring-config

今回は、各スタックを Infra ノードで動かすため、以下を追加します。

data:
  config.yaml: |
    prometheusOperator:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    prometheusK8s:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    alertmanagerMain:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    kubeStateMetrics:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    grafana:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    auth:
      nodeSelector:
        node-role.kubernetes.io/infra: ""

以下の様になれば大丈夫です。

$ oc -n openshift-monitoring get configmap cluster-monitoring-config -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: "2020-04-23T06:47:21Z"
  name: cluster-monitoring-config
  namespace: openshift-monitoring
  resourceVersion: "368857"
  selfLink: /api/v1/namespaces/openshift-monitoring/configmaps/cluster-monitoring-config
  uid: 619c4ac8-c623-4bbc-a47b-bc158b64e5d0
data:
  config.yaml: |
    prometheusOperator:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    prometheusK8s:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    alertmanagerMain:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    kubeStateMetrics:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    grafana:
      nodeSelector:
        node-role.kubernetes.io/infra: ""
    auth:
      nodeSelector:
        node-role.kubernetes.io/infra: ""

参考

OpenShift の Router が Infra ノードで動くようにする

Infraノードを足しても OpenShift のインフラである Router が Infra ノードに移らなかったので、移るようにするメモです。

ノードは以下の様になっています。

$ oc get nodes -n openshift-machine-api
NAME                                         STATUS   ROLES          AGE   VERSION
ip-10-0-129-22.us-east-2.compute.internal    Ready    infra,worker   20h   v1.16.2
ip-10-0-132-220.us-east-2.compute.internal   Ready    master         21h   v1.16.2
ip-10-0-141-130.us-east-2.compute.internal   Ready    infra,worker   20h   v1.16.2
ip-10-0-145-141.us-east-2.compute.internal   Ready    master         21h   v1.16.2
ip-10-0-165-220.us-east-2.compute.internal   Ready    master         21h   v1.16.2
ip-10-0-166-143.us-east-2.compute.internal   Ready    worker         20h   v1.16.2
ip-10-0-169-180.us-east-2.compute.internal   Ready    worker         20h   v1.16.2

ルータのポッドを見てみます。worker ノードで動いているのが分かります。

$ oc get pods -o wide -n openshift-ingress | grep router
router-default-859fd5d9df-5vfdr  1/1   Running    0   20h   10.130.2.11   ip-10-0-166-143.us-east-2.compute.internal   <none>  <none>
router-default-859fd5d9df-8rpqs  1/1   Running    0   20h   10.129.2.12   ip-10-0-169-180.us-east-2.compute.internal   <none>  <none>

設定を見てみます。以下の様に replicas が 2 になっているため router が 2 行出力されていました。

$ oc get -n openshift-ingress-operator ingresscontrollers/default -o yaml
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
(略)
spec:
  replicas: 2
status:
  availableReplicas: 2
(略)

インフラノードで router が動くように、oc editでこの設定を変更します。

$ oc edit -n openshift-ingress-operator ingresscontrollers/default

spec に以下を足します。

  nodePlacement:
    nodeSelector:
      matchLabels:
        node-role.kubernetes.io/infra: ""

変更後の全体像は以下の感じです。

$ oc get -n openshift-ingress-operator ingresscontrollers/default -o yaml
apiVersion: operator.openshift.io/v1
kind: IngressController
metadata:
(略)
spec:
  nodePlacement:
    nodeSelector:
      matchLabels:
        node-role.kubernetes.io/infra: ""
  replicas: 2
status:
  availableReplicas: 2
(略)

Router が再起動するので、それが落ち着くと以下の様に Infra ノードで動くようになります

$ oc get pods -o wide -n openshift-ingress | grep router
router-default-859fd5d9df-5vfdr  1/1   Running    0   20h   10.130.2.11   ip-10-0-129-22.us-east-2.compute.internal   <none>  <none>
router-default-859fd5d9df-8rpqs  1/1   Running    0   20h   10.129.2.12   ip-10-0-141-130.us-east-2.compute.internal  <none>  <none>

OpenShift でプロジェクトのテンプレートを変更する

プロジェクト(名前空間)を作る時に最初からいろいろな制限など決まり切った内容を毎回行う場合があると思います。そのような作業を減らすため、テンプレートを使って最初から反映したプロジェクトを作れるようにしてみます。

テンプレートの変更

まずはテンプレートを取得します。

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

テンプレートの中身は以下の様になっています。

template.yaml

apiVersion: template.openshift.io/v1
kind: Template
metadata:
  creationTimestamp: null
  name: project-request
objects:
- apiVersion: project.openshift.io/v1
  kind: Project
  metadata:
    annotations:
      openshift.io/description: ${PROJECT_DESCRIPTION}
      openshift.io/display-name: ${PROJECT_DISPLAYNAME}
      openshift.io/requester: ${PROJECT_REQUESTING_USER}
    creationTimestamp: null
    name: ${PROJECT_NAME}
  spec: {}
  status: {}
- apiVersion: rbac.authorization.k8s.io/v1
  kind: RoleBinding
  metadata:
    creationTimestamp: null
    name: admin
    namespace: ${PROJECT_NAME}
  roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: admin
  subjects:
  - apiGroup: rbac.authorization.k8s.io
    kind: User
    name: ${PROJECT_ADMIN_USER}
parameters:
- name: PROJECT_NAME
- name: PROJECT_DISPLAYNAME
- name: PROJECT_DESCRIPTION
- name: PROJECT_ADMIN_USER
- name: PROJECT_REQUESTING_USER

このテンプレートを変更することで新しくプロジェクトを作った場合にその変更が適用されます。以下はネットワークポリシー(NetworkPolicy)、podごとのリソースの制限(LimitRange)、プロジェクトごとのリソースの制限(ResourceQuota)を設定した物です。

apiVersion: template.openshift.io/v1
kind: Template
(略)
objects:
- apiVersion: project.openshift.io/v1
  kind: Project
(略)
- apiVersion: rbac.authorization.k8s.io/v1
  kind: RoleBinding
(略)
- apiVersion: networking.k8s.io/v1
  kind: NetworkPolicy
(略)
- apiVersion: v1
  kind: LimitRange
(略)
- apiVersion: v1
  kind: ResourceQuota
(略)
parameters:
(略)

変更したテンプレートファイルからテンプレートを作成します。

$ oc create -f template.yaml -n openshift-config

テンプレートが読み込まれるように設定を変更します。

$ oc edit project.config.openshift.io/cluster

spec:に以下を足します。

  projectRequestTemplate:
    name: project-request

変更されることを確認

プロジェクトを作成してリソース制限などがきちんと掛かっていることを確認します。

$ oc new-project my-prj
$ oc project my-prj

$ oc describe quota
Name:             project-quota
Namespace:        my-prj
Resource          Used  Hard
--------          ----  ----
limits.cpu        0     6
limits.memory     0     16Gi
pods              0     10
requests.cpu      0     4
requests.memory   0     8Gi
requests.storage  0     20G

$ oc describe limits
Name:       project-limits
Namespace:  my-prj
Type        Resource  Min  Max  Default Request  Default Limit  Max Limit/Request Ratio
----        --------  ---  ---  ---------------  -------------  -----------------------
Container   memory    -    -    500Mi            1Gi            -
Container   cpu       -    -    500m             1              -

参考