- GitLab Runner オペレータへのプロパティの渡し方
- オペレータ プロパティ
- キャッシュプロパティ
- プロキシ環境の設定
- 設定テンプレートで
config.toml
をカスタマイズします。 - カスタムTLS証明書の設定
- RunnerポッドのCPUとメモリサイズの設定
- クラスターのリソースに基づくランナーごとのジョブの同時実行の設定
- トラブルシューティング
OpenShift での GitLab Runner の設定
OpenShift 上での GitLab Runner の設定方法を説明します。
GitLab Runner オペレータへのプロパティの渡し方
Runner
を作成する際には、そのspec
にプロパティを設定することで設定を行うことができます。例えば、登録する GitLab URL や、登録トークンを含むシークレットの名前を指定することができます:
apiVersion: apps.gitlab.com/v1beta2
kind: Runner
metadata:
name: dev
spec:
gitlabUrl: https://gitlab.example.com
token: gitlab-runner-secret # Name of the secret containing the Runner token
利用可能なプロパティについては、Operator propertiesをご覧ください。
オペレータ プロパティ
Operator に渡すことができるサポートされているプロパティのリストです。
一部のプロパティは、最近のバージョンの Operator でのみ使用できます。
設定 | オペレーション | 説明 |
---|---|---|
gitlabUrl | すべて | GitLabインスタンスの完全修飾ドメイン名、インスタンス、https://gitlab.example.com 。 |
token | すべて | ランナーの登録に使用されたrunner-registration-token キーを含むSecret の名前。 |
tags | すべて | ランナーに適用されるタグのコンマ区切りのリスト。 |
concurrent | すべて | 同時に実行できるジョブの数を制限します。最大数は定義されたすべてのRunnerです。0は無制限を意味しません。デフォルトは10 です。 |
interval | すべて | 新しいジョブをチェックする間隔を秒数で定義します。デフォルトは30 です。 |
locked | 1.8 | Runner をプロジェクトにロックするかどうかを定義します。デフォルトはfalse です。 |
runUntagged | 1.8 | タグのないジョブを実行するかどうかを定義します。タグが指定されていない場合のデフォルトはtrue です。それ以外の場合はfalse です。 |
protected | 1.8 | ランナーが保護されたブランチのみでジョブを実行するかどうかを定義します。デフォルトはfalse です。 |
cloneURL | すべて | GitLab インスタンスの URL を上書きします。Runner が GitLab URL に接続できない場合にのみ使用します。 |
env | すべて | Runner ポッドの環境変数として注入されるキーと値のペアを含むConfigMap の名前。 |
runnerImage | 1.7 | デフォルトの GitLab Runner イメージを上書きします。デフォルトは、オペレーターがバンドルされていた Runner イメージです。 |
helperImage | すべて | デフォルトの GitLab Runner ヘルパーイメージを上書きします。 |
buildImage | すべて | 指定がない場合にビルドに使用するデフォルトのDockerイメージ。 |
cacheType | すべて | Runnerアーティファクトに使用されるキャッシュのタイプ。のいずれか:gcs s3 ,azure . |
cachePath | すべて | ファイル・システム上のキャッシュ・パスを定義します。 |
cacheShared | すべて | ランナー間のキャッシュ共有を有効にします。 |
s3 | すべて | S3キャッシュの設定に使用するオプションです。キャッシュのプロパティを参照してください。 |
gcs | すべて | GCSキャッシュの設定に使用されるオプション。キャッシュのプロパティを参照してください。 |
azure | すべて | Azure キャッシュの設定に使用するオプションです。キャッシュのプロパティを参照してください。 |
ca | すべて | カスタム認証局(CA) 証明書を含む TLS 秘密の名前。 |
serviceaccount | すべて | Runner ポッドの実行に使用されるサービスアカウントを上書きします。 |
config | すべて | 設定テンプレートでカスタム設定マップを提供するために使用します。 |
キャッシュプロパティ
S3キャッシュ
設定 | オペレーション | 説明 |
---|---|---|
server | すべて | S3サーバーのアドレスです。 |
credentials | すべて | オブジェクトストレージへのアクセスに使用されるaccesskey とsecretkey プロパティを含むSecret の名前。 |
bucket | すべて | キャッシュが保存されるバケツの名前。 |
location | すべて | キャッシュが保存されるS3リージョンの名前。 |
insecure | すべて | 安全でない接続を使用するか、HTTP 。 |
GCS キャッシュ
設定 | オペレーション | 説明 |
---|---|---|
credentials | すべて | オブジェクトストレージへのアクセスに使用されるaccess-id とprivate-key プロパティを含むSecret の名前。 |
bucket | すべて | キャッシュが保存されるバケツの名前。 |
credentialsFile | すべて | GCS 認証情報ファイルを受け取り、keys.json . |
Azure キャッシュ
設定 | オペレーション | 説明 |
---|---|---|
credentials | すべて | オブジェクトストレージへのアクセスに使用されるaccountName とprivateKey プロパティを含むSecret の名前。 |
container | すべて | キャッシュが保存される Azure コンテナの名前。 |
storageDomain | すべて | Azure blobストレージのドメイン名。 |
プロキシ環境の設定
プロキシ環境を構築します:
-
custom-env.yaml
ファイルを編集します。例えばapiVersion: v1 data: HTTP_PROXY: example.com kind: ConfigMap metadata: name: custom-env
-
OpenShift を更新して変更を適用します。
oc apply -f custom-env.yaml
-
gitlab-runner.yml
ファイルを更新します。apiVersion: apps.gitlab.com/v1beta2 kind: Runner metadata: name: dev spec: gitlabUrl: https://gitlab.example.com token: gitlab-runner-secret # Name of the secret containing the Runner token env: custom-env
プロキシがKubernetes APIに到達できない場合、CI/CDジョブでエラーが表示される可能性があります:
ERROR: Job failed (system failure): prepare environment: setting up credentials: Post https://172.21.0.1:443/api/v1/namespaces/<KUBERNETES_NAMESPACE>/secrets: net/http: TLS handshake timeout. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information
このエラーを解決するには、custom-env.yaml
ファイルのNO_PROXY
設定に Kubernetes API の IP アドレスを追加します:
apiVersion: v1
data:
NO_PROXY: 172.21.0.1
HTTP_PROXY: example.com
kind: ConfigMap
metadata:
name: custom-env
を実行することで、Kubernetes APIのIPアドレスを確認できます:
oc get services --namespace default --field-selector='metadata.name=kubernetes' | grep -v NAME | awk '{print $3}'
設定テンプレートでconfig.toml
をカスタマイズします。
config.toml
をカスタマイズするための設定テンプレートの使用は、現在のところ、[runners.kubernetes.volumes]
の設定の指定に限定されています。他の設定に拡張するサポートはイconfig.toml
シュー49でconfig.toml
提案されています。設定テンプレートを使用することで、Runnerのconfig.toml
。
-
カスタム設定テンプレートファイルを作成します。例えば、
EmptyDir
ボリュームをマウントするように Runner に指示してみましょう。custom-config.toml
ファイルを作成します:[[runners]] [runners.kubernetes] [runners.kubernetes.volumes] [[runners.kubernetes.volumes.empty_dir]] name = "empty-dir" mount_path = "/path/to/empty_dir" medium = "Memory"
-
custom-config.toml
ファイルからcustom-config-toml
という名前のConfigMap
を作成します:oc create configmap custom-config-toml --from-file config.toml=custom-config.toml
-
Runner
のconfig
プロパティを設定します:apiVersion: apps.gitlab.com/v1beta2 kind: Runner metadata: name: dev spec: gitlabUrl: https://gitlab.example.com token: gitlab-runner-secret config: custom-config-toml
カスタムTLS証明書の設定
-
カスタムTLS証明書を設定するには、キー
tls.crt
でシークレットを作成します。この例では、ファイル名はcustom-tls-ca-secret.yaml
です:apiVersion: v1 kind: Secret metadata: name: custom-tls-ca type: Opaque stringData: tls.crt: | -----BEGIN CERTIFICATE----- MIIEczCCA1ugAwIBAgIBADANBgkqhkiG9w0BAQQFAD..AkGA1UEBhMCR0Ix ..... 7vQMfXdGsRrXNGRGnX+vWDZ3/zWI0joDtCkNnqEpVn..HoX -----END CERTIFICATE-----
-
シークレットを作成します:
oc apply -f custom-tls-ca-secret.yaml
-
runner.yaml
のca
キーをシークレットの名前と同じ名前に設定します:apiVersion: apps.gitlab.com/v1beta2 kind: Runner metadata: name: dev spec: gitlabUrl: https://gitlab.example.com token: gitlab-runner-secret ca: custom-tls-ca
RunnerポッドのCPUとメモリサイズの設定
カスタムconfig.toml
ファイルでCPU 制限と メモリ制限を設定するには、このトピックの説明に従ってください。
クラスターのリソースに基づくランナーごとのジョブの同時実行の設定
Runner
リソースのconcurrent
プロパティを設定します:
apiVersion: apps.gitlab.com/v1beta2
kind: Runner
metadata:
name: dev
spec:
gitlabUrl: https://gitlab.example.com
token: gitlab-runner-secret
concurrent: 2
ジョブの同時実行はプロジェクトの要件によって決まります。
- CIジョブを実行するために必要な計算リソースとメモリリソースを決定することから始めましょう。
- クラスターのリソースがあれば、そのジョブが何回実行できるかを計算します。
concurrencyの値を大きく設定しすぎると、Kubernetes Executorは可能な限り早くジョブを処理します。しかし、Kubernetesクラスタのスケジューラ容量によって、ジョブがいつスケジュールされるかが決まります。
トラブルシューティング
ルートと非ルート
GitLab Runner OperatorとGitLab Runnerポッドは非rootユーザーとして実行されます。そのため、ジョブで使用するビルドイメージは非 root ユーザーで実行しないと正常に完了しません。これは、ジョブが最小限の権限で正常に実行できるようにするためです。ただし、これが機能するためには、CIジョブに使用するビルドイメージも非rootで実行するようにビルドする必要があり、制限されたファイルシステムに書き込んではいけません。OpenShiftクラスター上のほとんどのコンテナファイルシステムは、マウントされたボリューム、/var/tmp
、/tmp
およびtmpfs
としてルートファイルシステムにマウントされた他のボリュームを除いて、読み取り専用になることに留意してください。
HOME
環境変数のオーバーライド
カスタムビルドイメージを作成したり、環境変数を上書きしたりする場合は、HOME環境変数が読み取り専用になる/
に設定されていないことを確認してください。特に、ジョブがホームディレクトリにファイルを書き込む必要がある場合は注意が必要です。例えば/home
の下に/home/ci
のようなディレクトリを作成し、Dockerfile
にENV HOME=/home/ci
を設定することができます。
HOME
/home/gitlab-runner
この変数が変更された場合、新しい場所には適切な権限が必要です。これらのガイドラインは、Red Hat Container Platform Docs > Creating Images > Support arbitrary user idsにも記載されています。
SCC に注意してください。
デフォルトでは、新しい OpenShift プロジェクトにインストールすると、GitLab Runner オペレータは非 root として実行されます。例外として、default
プロジェクトのように、プロジェクト内のすべてのサービスアカウントにanyuid
アクセス権が付与されている場合があります。その場合、イメージのユーザーはroot
となります。これは、ジョブなどのコンテナシェル内部でwhoami
を実行することで簡単に確認できます。SCC については、Red Hat Container Platform Docs > Managing security contextconstraints を参照してください。
anyuid として実行 SCC
推奨されませんが、CIジョブがrootユーザーとして実行されたり、rootファイルシステムに書き込まれたりすることがどうしても必要なイベントの場合、GitLab Runnerコンテナで使用されるGitLab Runnerサービスアカウントgitlab-runner-sa
、anyuid
SCCを設定する必要があります。
OpenShift 4.3.8以前のバージョンでは:
oc adm policy add-scc-to-user anyuid -z gitlab-runner-sa -n <runner_namespace>
# Check that the anyiud SCC is set:
oc get scc anyuid -o yaml
OpenShift 4.3.8 以降の場合:
oc create -f - <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: scc-anyuid
namespace: <runner_namespace>
rules:
- apiGroups:
- security.openshift.io
resourceNames:
- anyuid
resources:
- securitycontextconstraints
verbs:
- use
EOF
oc create -f - <<EOF
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: sa-to-scc-anyuid
namespace: <runner_namespace>
subjects:
- kind: ServiceAccount
name: gitlab-runner-sa
roleRef:
kind: Role
name: scc-anyuid
apiGroup: rbac.authorization.k8s.io
EOF
SETFCAPの設定
Red Hat OpenShift Container Platform(RHOCP) 4.11 以降を使用している場合、以下のエラーメッセージが表示されることがあります:
error reading allowed ID mappings:error reading subuid mappings for user
一部のジョブ (例えば、buildah) を正しく実行するには、SETFCAP
機能の付与が必要です。このイシューを修正するには、以下の手順に従ってください:
-
GitLab Runner が使用している SCC に SETFCAP ケーパビリティを追加します(
gitlab-scc
を GitLab Runner のポッドに割り当てられている SCC に置き換えてください):oc patch scc gitlab-scc --type merge -p '{"allowedCapabilities":["SETFCAP"]}'
-
config.toml
を更新し、kubernetes
セクションの下にSETFCAP
ケーパビリティを追加します:[[runners]] [runners.kubernetes] [runners.kubernetes.pod_security_context] [runners.kubernetes.build_container_security_context] [runners.kubernetes.build_container_security_context.capabilities] add = ["SETFCAP"]
-
GitLab Runnerがデプロイされているネームスペースに、この
config.toml
を使用してconfigmapを作成します:oc create configmap custom-config-toml --from-file config.toml=config.toml
-
修正したいランナーを修正し、
config:
パラメーターを追加して、最近作成したコンフィグマップを指すようにします(my-runner を正しいランナーのポッド名に置き換えてください)。oc patch runner my-runner --type merge -p '{"spec": {"config": "custom-config-toml"}}'
詳細については、Red Hat のドキュメントを参照してください。
FIPS 準拠の GitLab Runner の使用法
FIPSに準拠したGitLab Runner Helperを使用するには、以下のようにヘルパーイメージを変更してください:
apiVersion: apps.gitlab.com/v1beta2
kind: Runner
metadata:
name: dev
spec:
gitlabUrl: https://gitlab.example.com
token: gitlab-runner-secret
helperImage: gitlab/gitlab-runner-helper:ubi-fips
concurrent: 2
自己署名証明書を使用して GitLab Runner を登録します。
GitLab の自己管理インストールで自己署名証明書を使用する場合は、非公開証明書に署名するために使用する CA 証明書を含むシークレットを作成する必要があります。
そのシークレットの名前を Runner spec セクションの CA として指定します:
KIND: Runner
VERSION: apps.gitlab.com/v1beta2
FIELD: ca <string>
DESCRIPTION:
Name of tls secret containing the custom certificate authority (CA)
certificates
シークレットは次のコマンドで作成できます:
oc create secret generic mySecret --from-file=tls.crt=myCert.pem -o yaml
IP アドレスを指す外部 URL で GitLab Runner を登録します。
Runnerが自己署名証明書とホスト名を照合できない場合、エラーメッセージが表示されることがあります。これは、GitLabセルフマネージドインスタンスがホスト名ではなくIPアドレスからアクセスするように設定されている場合に起こる可能性があります(###.##.##.##はGitLabサーバーのIPアドレスです):
[31;1mERROR: Registering runner... failed [0;m [31;1mrunner[0;m=A5abcdEF [31;1mstatus[0;m=couldn't execute POST against https://###.##.##.##/api/v4/runners:
Post https://###.##.##.##/api/v4/runners: x509: cannot validate certificate for ###.##.##.## because it doesn't contain any IP SANs
[31;1mPANIC: Failed to register the runner. You may be having network problems.[0;m
このイシューを修正するには
-
GitLabセルフマネージドサーバーで、
openssl
を修正し、subjectAltName
パラメーターに IP アドレスを追加します:# vim /etc/pki/tls/openssl.cnf [ v3_ca ] subjectAltName=IP:169.57.64.36 <---- Add this line. 169.57.64.36 is your GitLab server IP.
-
次に、以下のコマンドで自己署名 CA を生成し直します:
# cd /etc/gitlab/ssl # openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout /etc/gitlab/ssl/169.57.64.36.key -out /etc/gitlab/ssl/169.57.64.36.crt # openssl dhparam -out /etc/gitlab/ssl/dhparam.pem 4096 # gitlab-ctl restart
-
この新しい証明書を使って新しいシークレットを生成します。