メインコンテンツまでスキップ

インストール及び起動

  • 事前準備事項
    • agent インストール image ファイルを顧客企業環境の repository にアップロードする必要
      • (exem-k8s-agent, exem-container-agent, exem-gpu-sidecar*)
      • * exem-gpu-sidecar は GPU モニタリング使用時のみ 必要 — exem-container-agent とは別の独立したバージョン(tag)で管理される
    • インストールする namespace の作成
      • インストール時に namespace を自動で作成しない理由は、削除時に namespace に関連するすべてのリソースが削除される危険性があるため、直接作成した namespace で動作するようにする意図
備考

📌 GPU モニタリング使用時のデプロイ yaml は 4. yaml 詳細 > 4.1 GPU モニタリング使用時 (全体 yaml)、サイドカー詳細は exem-container-agent > GUIDE > 4. サイドカー を参照。

2.1 画面を通じたインストール​

  • exemONE の Setting ➝ Platform/Kubernetes の Install Agent を通じて生成された yaml を download
  • k8s cluster に yaml をデプロイ

1. 左下のアカウントで設定​

2. プラットフォーム > クバネティスをクリック​

3. YAML ファイルのエクスポート​

4. Agent 構成図​

5. 設定​

  • Description を参照

6. 内容確認​

7. YAML ファイル修正​

8. YAML ファイルダウンロード​

9. Cluster にデプロイ​

  • 例の画面のコマンドでクラスターにデプロイ

2.2 Helm を使用したインストール​

  1. Helm ドキュメントを参照

2.3 デプロイ後のバージョン確認​

下記のコマンドで Cluster にデプロイされた exem-container-agent と exem-k8s-agent Image のバージョンを確認できます。

kubectl get deployments -n exem-one exem-k8s-agent -o jsonpath="{..image}"

kubectl get daemonsets -n exem-one exem-container-agent -o jsonpath="{..image}"

GPU モニタリング使用時、DaemonSet の {..image} 出力に exem-gpu-sidecar イメージが併せて表示されます。

2.4 デプロイ時の例外状況対応​

2.4.1 顧客企業の Container Registry からの ImagePull に失敗する状況​

  • 担当者に顧客企業 Container Registry へのアクセス権限がなく、該当権限を要請する
    • アクセスできる secret のみを生成してもらう場合、下記コマンドで SECRET_NAME を確認 (kubectl get secret -n \<NAMESPACE> コマンドで secret 確認可能)
kubectl get secrets -n exemone
  • kubernetes の secret を受け取った場合、exemone インストール yaml ファイルに下記内容を追加設定
    • (\<SECRET_NAME>は上記の kubectl で確認可能な実際の secret 名)
  1. deployment.spec.template.spec に下記内容を追加
imagePullSecrets:
- name: <SECRET_NAME>
  1. daemonset.spec.template.spec に下記内容を追加
imagePullSecrets:
- name: <SECRET_NAME>
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: exem-k8s-agent
name: exem-k8s-agent
namespace: {{xm_conf.namespace}}
spec:
replicas: 1
selector:
matchLabels:
name: exem-k8s-agent
template:
metadata:
labels:
name: exem-k8s-agent
spec:
imagePullSecrets:
- name: <SECRET_NAME>
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: exem-container-agent
name: exem-container-agent
namespace: {{xm_conf.namespace}}
spec:
selector:
matchLabels:
app: exem-container-agent
template:
metadata:
labels:
app: exem-container-agent
spec:
imagePullSecrets:
- name: <SECRET_NAME>
  • 以後 kubernetes に agent をデプロイします。

2.4.2 Docker (Container Registry) 権限を K8S に適用する必要がある場合​

https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/ 上記の kubernetes 公式ドキュメントを参照して secret を直接作成

  • すでに docker が registry にログインされている場合
kubectl create secret -n <NAMESPACE> generic regcred \
--from-file=.dockerconfigjson=<path/to/.docker/config.json> \
--type=kubernetes.io/dockerconfigjson
  • docker-registry (container registry) の接続アカウントを受け取った場合
kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email> -n <NAMESPACE>
  • 以後 2.3.1 の過程を進めます。

2.4.3 Docker-registry に直接 image を push する必要がある場合​

  • デプロイされた image tar ファイルを docker コマンドを使用できるサーバーにアップロード
  • docker load -i \<IMAGE_NAME>.tar コマンドでローカル docker registry に load
    • docker images コマンドで load が正常にできたか image name と tag、image ID を確認
  • 上記で確認した Image ID を基に下記コマンドで docker-registry に push する経路を設定
    • docker tag \<IMAGE_ID> \<Docker-registry URL>/\<IMAGE_NAME>:\<IMAGE_TAG>
    • docker images コマンドで同一の IMAGE_ID で url 経路が入った image name があるか確認
  • 上記で準備した docker image を push
    • docker push \<Docker-registry URL>/\<IMAGE_NAME>:\<IMAGE_TAG>
  • 以後 kubernetes に agent をデプロイします。

2.4.4 OpenShift で Warning 文言が表示され、exem-container-agent がデプロイされない場合​

  • SecurityContextConstraints (SCC) 権限が、現在デプロイしようとしている exemone の serviceaccount にバインドされているか確認
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
metadata:
name: exem-one-hostpath-scc
allowHostDirVolumePlugin: true
runAsUser:
type: RunAsAny
seLinuxContext:
type: RunAsAny
fsGroup:
type: RunAsAny
volumes:
- hostPath
- configMap
- projected
- secret
users:
# system:serviceaccount:<NAMESPACE>:<SERVICEACCOUNT_NAME>
- system:serviceaccount:exemone:exemone

SCC 権限説明:

設定値用途
allowHostDirVolumePlugintruecontainer-agent が各ノードの cgroup、プロセス情報、ランタイムソケットを読み取り、コンテナ CPU/Memory/Network メトリックを収集する。この権限がないとコンテナメトリック収集が不可能
runAsUserRunAsAnycgroup ファイルとランタイムソケット(crio.sock など)が root 所有であるため、container-agent が root(uid 0)で実行されてこそ、コンテナ一覧の照会及びメトリック収集が可能。非 root 実行時は permission denied が発生
seLinuxContextRunAsAnyOpenShift ノードは SELinux がデフォルトで有効化されているため、一般コンテナはホストファイルアクセスが SELinux ポリシーによってブロックされる。spc_t タイプを設定してこそ、マウントされたホストファイルシステムとランタイムソケットを読み取ることができる
fsGroupRunAsAnyホストでマウントした cgroup、proc などのファイルのグループ所有権が多様であるため、特定グループに強制するとファイル読み取りに失敗する可能性がある

volumes 権限説明:

volume タイプ必須用途
hostPathOホストファイルシステム(/)をマウントして cgroup、プロセス情報を読み取り、ランタイムソケット(crio.sock, containerd.sock, docker.sock)でコンテナ一覧と状態を照会
configMapOConfigMap を envFrom として参照し、receiver アドレス、クラスター名などエージェント設定を環境変数として注入
projectedOServiceAccount トークンを Pod に自動マウントして K8s API Server 認証に使用。Informer で Pod/Node などのリソースを照会する際に必要
secret任意顧客企業の Container Registry からイメージを取得する際、imagePullSecrets 使用時に必要。公開レジストリまたは別の認証方式を使用する場合は不要

scc 主体(subject)一覧定義:

  • 定義した SCC を serviceAccount に( system:serviceaccount ) 付与するための一覧定義 ( <namespace>:<serviceaccount-name> )
users:
- system:serviceaccount:exemone:exemone
  • scc の場合は openshift client (oc) で作業を進める必要があり、権限関連の作業であるため、通常は顧客企業の担当者に依頼する必要があります。
  • 直接 scc を適用する必要がある場合は、上記の scc.yaml ファイルを作成した後、下記コマンドで scc を追加
oc apply -f scc.yaml
  • 以後 kubectl get scc -n \<NAMESPACE> コマンドで scc 生成を確認
exem-one-hostpath-scc             false   <no value>             RunAsAny    RunAsAny           RunAsAny    RunAsAny    <no value>   false            ["configMap","hostPath","projected","secret"]
  • scc.yaml 作成後、serviceaccount とバインディング

(exem-one-hostpath-scc は上記で作成した scc の名前であり、変更しても問題ありません。)

oc adm policy add-scc-to-user exem-one-hostpath-scc -z <SERVICEACCOUNT> -n <NAMESPACE>
  • 上記の scc 権限が適用された後、exem-container-agent (daemonset) yaml ファイルを修正

(daemonset.spec.template.spec.containers に下記 securityContext 内容を追加)

          securityContext:
runAsUser: 0
seLinuxOptions:
type: spc_t
capabilities:
drop: [ "ALL" ]
  • exem-container-agent 再デプロイ
kubectl delete -f exem-k8s-agent.yaml
kubectl apply -f exem-k8s-agent.yaml
  • GPU モニタリング使用時の SCC 追加権限は "9. FAQ > 9-4 > 6️⃣" ドキュメントを参照。