#chiroito ’s blog

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

OpenShiftにデフォルトのストレージクラスを作成

Single Node OpenShiftを構築したら、ストレージが使えなくて困ったのでその時のYAMLをここに供養しておきます。

apiVersion: hostpathprovisioner.kubevirt.io/v1beta1
kind: HostPathProvisioner
metadata:
  name: hostpath-provisioner
spec:
  imagePullPolicy: IfNotPresent
  storagePools:
  - name: local-storage
    path: "/var/myvolumes"
workload:
  nodeSelector:
    kubernetes.io/os: linux
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: hostpath-storage-class
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubevirt.io.hostpath-provisioner
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
parameters:
  storagePool: local-storage

コードはGitHubで管理してます。

openshift-memo/sno-storage.yaml at main · chiroito/openshift-memo · GitHub

OpenShiftにイメージレジストリを構築

背景

QuarkusのOpenShiftエクステンションを使用して、Single Node OpenShiftへデプロイしようとしたらエラーが発生しました。

[INFO] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] Applied: BuildConfig wake-on-lan
[ERROR] Failed to upload archive file for the build: wake-on-lan
[ERROR] Please check cluster events via `oc get events` to see what could have possibly gone wrong
[WARNING] [io.quarkus.container.image.openshift.deployment.OpenshiftProcessor] An exception: 'Can't instantiate binary build, due to error reading/writing stream. Can be caused if the output stream was closed by the server.See if something's wrong in recent events in Cluster = InvalidOutput wake-on-lan-1.17d881cb2b5ed3fc Error starting build: an image stream cannot be used as build output because the integrated container image registry is not configured
BuildFailed wake-on-lan-1.17d881cb2d2462e0 Build home/wake-on-lan-1 failed
 ' occurred while instantiating the build, however the build has been started.

Error starting build: an image stream cannot be used as build output because the integrated container image registry is not configured と出力されていたのでイメージレジストリを構築したら無事にビルドができるようになりました。

環境

  • OpenShift 4.15
  • デフォルトの StorageClasses は構成済み

参考

access.redhat.com

イメージレジストリの構築

イメージレジストリを構築しましょう。 全体の流れは以下のとおりです。

  1. イメージレジストリの管理状態の変更
  2. イメージレジストリーストレージの設定

0. 事前確認

事前に以下の4つを確認します。

  • イメージレジストリのPodがいるかどうか
  • オペレータのステータス
  • インスタンスがあるかどうか
  • インスタンスの設定値

イメージレジストリのPodがいるかどうか

リソースがなければOKです。

> oc get pod -n openshift-image-registry -l docker-registry=default
No resources found in openshift-image-registry namespace

以下のようにリソースが表示されればイメージレジストリは設定されてます。そのため、作業は不要です。

NAME                             READY   STATUS    RESTARTS   AGE
image-registry-f79ccc88f-8sm2s   1/1     Running   0          15h

オペレータのステータス

オペレータのステータスでAVAILABLETrueになっているか確認します。

> oc get clusteroperator image-registry
NAME             VERSION              AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
image-registry   4.15                 True        False         False      15h

インスタンスがあるかどうか

デフォルトで作成されているclusterというインスタンスがあればOK。

oc get configs.imageregistry.operator.openshift.io
NAME      AGE
cluster   93d

インスタンスの設定値

spec.managementStateRemovedになっていればOK。

> oc get configs.imageregistry cluster -o=jsonpath='{.spec.managementState}{"\n"}'
Removed

1. イメージレジストリの管理状態の変更

oc patch configs.imageregistry.operator.openshift.io cluster --type merge --patch '{"spec":{"managementState":"Managed"}}'

2. イメージレジストリストレージの設定

2箇所換えます。

  • configs.imageregistry.operator.openshift.io
  • configs.imageregistry/cluster

configs.imageregistry.operator.openshift.io

oc edit configs.imageregistry.operator.openshift.io

こうなっているのを

spec:
  storage: {}

以下のように変えます。

spec:
  storage:
    pvc:
      claim:

configs.imageregistry/cluster

oc edit configs.imageregistry/cluster

以下のようにmanagementStateRemovedになっていたら

spec
  managementState: Removed

Managedに換える

spec
  managementState: Managed

確認

以下のようにイメージレジストリのPodが表示されればイメージレジストリが使えるようになります。

> oc get pod -n openshift-image-registry -l docker-registry=default
NAME                             READY   STATUS    RESTARTS   AGE
image-registry-f79ccc88f-8sm2s   1/1     Running   0          15h

Let's Encrypt で発行した証明書を OpenShift で使う

OpenShift で使う方法を紹介します。 cert-managerもありますが、ここでは手作業で行います。

環境

  • OpenShift 4.15

Let's Encrypt で証明書を発行

こちらを参照:

b.chiroito.dev

OpenShift に証明書を適用

証明書は/etc/letsencrypt/live/自分のドメインディレクトリにあります。 まずは、そこへ移動します。

その後、以下を実行するだけです。

oc create configmap letsencrypt-ca --from-file=ca-bundle.crt=./cert.pem -n openshift-config
oc patch proxy/cluster --type=merge --patch='{"spec":{"trustedCA":{"name":"letsencrypt-ca"}}}'

oc create secret tls letsencrypt --cert=./fullchain.pem --key=./privkey.pem -n openshift-ingress
oc patch ingresscontroller.operator default --type=merge -p '{"spec":{"defaultCertificate": {"name": "letsencrypt"}}}' -n openshift-ingress-operator

うまくいかなかったときは、以下のコマンドで元に戻せます。

oc delete configmap letsencrypt-ca -n openshift-config
oc patch proxy/cluster --type=merge --patch='{"spec":{"trustedCA":null}}'
oc delete secret letsencrypt -n openshift-ingress
oc patch ingresscontroller.operator default --type=merge -p '{"spec":{"defaultCertificate": null}}' -n openshift-ingress-operator