mcpField
O
openshift

openshift

github.com/bagelholeクラウド・DevOps1.2k351 回インストール23 週間前に更新
リポジトリ

openshift について

OpenShiftのデプロイとクラスター管理を扱うガイドです。oc CLIに加え、Routes、BuildConfigs、SCC、Operatorsなどの機能を紹介します。

主な機能

  1. 01oc CLIによるプロジェクト管理
  2. 02イメージ、ソース、テンプレートからのアプリデプロイ
  3. 03RoutesとBuildConfigsの設定
  4. 04ImageStreamsとデプロイ設定の管理
  5. 05ConfigMaps、Secrets、SCCの設定
  6. 06ログ、イベント、リソース使用量の確認

活用シーン

  1. 01OpenShiftクラスターへのアプリデプロイ
  2. 02S2IによるGitソースプロジェクトのビルド
  3. 03アプリのルートとアクセス方針の設定
  4. 04ビルド、Podセキュリティ、イメージ取得の問題調査

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/bagelhole/devops-security-agent-skills --skill openshift

インストール後、Claude Code で/openshiftを入力して読み込まれたか確認します。

詳細

OpenShift

Red Hat OpenShift Container Platform でアプリケーションをデプロイし、管理します。

このスキルを使用する場面

次の場合にこのスキルを使用します。

  • OpenShift クラスターにアプリケーションをデプロイする
  • OpenShift 固有の機能(Routes、BuildConfigs)を使用する
  • OpenShift でプロジェクトと RBAC を管理する
  • S2I(Source-to-Image)ビルドを実装する
  • OpenShift Operators を使用する

前提条件

  • OpenShift クラスターへのアクセス
  • oc CLI のインストール
  • Kubernetes の基本知識

CLI の基本

認証
# Login to cluster
oc login https://api.cluster.example.com:6443 -u admin -p password

# Login with token
oc login --token=sha256~xxxx --server=https://api.cluster.example.com:6443

# Check current context
oc whoami
oc whoami --show-server
oc whoami --show-context

# Logout
oc logout
プロジェクト管理
# Create project (namespace)
oc new-project myapp --display-name="My App" --description="My Application"

# Switch project
oc project myapp

# List projects
oc projects

# Delete project
oc delete project myapp

アプリケーションのデプロイ

イメージから
# Deploy from container image
oc new-app --image=nginx:latest --name=webserver

# Deploy from Docker Hub
oc new-app docker.io/library/nginx:latest

# Deploy with environment variables
oc new-app myimage:latest \
  -e DATABASE_URL=postgres://localhost/db \
  -e APP_ENV=production
ソースから(S2I)
# Deploy from Git repository
oc new-app https://github.com/org/myapp.git

# Specify builder image
oc new-app nodejs:18~https://github.com/org/nodejs-app.git

# With context directory
oc new-app https://github.com/org/monorepo.git \
  --context-dir=backend \
  --name=backend-api
テンプレートから
# List available templates
oc get templates -n openshift

# Deploy from template
oc new-app postgresql-persistent \
  -p POSTGRESQL_USER=user \
  -p POSTGRESQL_PASSWORD=secret \
  -p POSTGRESQL_DATABASE=mydb

Routes

Routes の作成
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: myapp
spec:
  host: myapp.apps.cluster.example.com
  to:
    kind: Service
    name: myapp
    weight: 100
  port:
    targetPort: 8080
  tls:
    termination: edge
    insecureEdgeTerminationPolicy: Redirect
# Create route via CLI
oc expose svc/myapp

# Create with custom hostname
oc create route edge myapp \
  --service=myapp \
  --hostname=myapp.apps.cluster.example.com

# Create passthrough route (TLS termination at pod)
oc create route passthrough myapp-secure --service=myapp
A/B テスト
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: myapp
spec:
  to:
    kind: Service
    name: myapp-v1
    weight: 90
  alternateBackends:
    - kind: Service
      name: myapp-v2
      weight: 10

ビルド設定

BuildConfig
apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
  name: myapp
spec:
  source:
    type: Git
    git:
      uri: https://github.com/org/myapp.git
      ref: main
  strategy:
    type: Docker
    dockerStrategy:
      dockerfilePath: Dockerfile
  output:
    to:
      kind: ImageStreamTag
      name: myapp:latest
  triggers:
    - type: ConfigChange
    - type: GitHub
      github:
        secret: webhook-secret
S2I ビルド
apiVersion: build.openshift.io/v1
kind: BuildConfig
metadata:
  name: myapp
spec:
  source:
    type: Git
    git:
      uri: https://github.com/org/myapp.git
  strategy:
    type: Source
    sourceStrategy:
      from:
        kind: ImageStreamTag
        namespace: openshift
        name: nodejs:18-ubi8
      env:
        - name: NPM_RUN
          value: start
  output:
    to:
      kind: ImageStreamTag
      name: myapp:latest
ビルドコマンド
# Start build
oc start-build myapp

# Start build from local source
oc start-build myapp --from-dir=.

# Follow build logs
oc start-build myapp --follow

# View build logs
oc logs -f bc/myapp

# Cancel build
oc cancel-build myapp-1

イメージストリーム

apiVersion: image.openshift.io/v1
kind: ImageStream
metadata:
  name: myapp
spec:
  lookupPolicy:
    local: true
  tags:
    - name: latest
      from:
        kind: DockerImage
        name: registry.example.com/myapp:latest
      importPolicy:
        scheduled: true
# Create image stream
oc create imagestream myapp

# Import image
oc import-image myapp:latest \
  --from=docker.io/library/nginx:latest \
  --confirm

# Tag image
oc tag myapp:latest myapp:production

デプロイ設定

apiVersion: apps.openshift.io/v1
kind: DeploymentConfig
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myapp:latest
          ports:
            - containerPort: 8080
          resources:
            requests:
              memory: "128Mi"
              cpu: "100m"
            limits:
              memory: "256Mi"
              cpu: "500m"
  triggers:
    - type: ConfigChange
    - type: ImageChange
      imageChangeParams:
        automatic: true
        containerNames:
          - myapp
        from:
          kind: ImageStreamTag
          name: myapp:latest
  strategy:
    type: Rolling
    rollingParams:
      maxSurge: 25%
      maxUnavailable: 25%

ConfigMaps と Secrets

# Create ConfigMap
oc create configmap myapp-config \
  --from-literal=APP_ENV=production \
  --from-file=config.yaml

# Create Secret
oc create secret generic myapp-secrets \
  --from-literal=password=secret123

# Mount as volume
oc set volume dc/myapp \
  --add --name=config \
  --type=configmap \
  --configmap-name=myapp-config \
  --mount-path=/etc/config

# Set as environment
oc set env dc/myapp --from=secret/myapp-secrets

セキュリティコンテキスト制約

# List SCCs
oc get scc

# View SCC details
oc describe scc restricted

# Grant SCC to service account
oc adm policy add-scc-to-user anyuid -z myapp-sa -n myproject

# Create service account
oc create serviceaccount myapp-sa
カスタム SCC
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
metadata:
  name: myapp-scc
allowPrivilegedContainer: false
runAsUser:
  type: MustRunAsNonRoot
seLinuxContext:
  type: MustRunAs
fsGroup:
  type: RunAsAny
volumes:
  - configMap
  - secret
  - persistentVolumeClaim
users:
  - system:serviceaccount:myproject:myapp-sa

Operators

# List available operators
oc get packagemanifests -n openshift-marketplace

# Subscribe to operator
cat <<EOF | oc apply -f -
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: prometheus
  namespace: openshift-operators
spec:
  channel: stable
  name: prometheus
  source: community-operators
  sourceNamespace: openshift-marketplace
EOF

# View installed operators
oc get csv -n openshift-operators

モニタリング

# View pod logs
oc logs -f pod/myapp-1-xyz

# View events
oc get events --sort-by='.lastTimestamp'

# Resource usage
oc adm top pods
oc adm top nodes

# Debug pod
oc debug pod/myapp-1-xyz

よくある問題

問題:ビルドに失敗する

問題:S2I ビルドで依存関係が見つからない 解決策:ビルダーイメージを確認し、ソースリポジトリにアクセスできることを確認します

問題:Pod のセキュリティ違反

問題:SCC が原因で Pod の起動に失敗する 解決策:適切な SCC を使用するか、コンテナーのセキュリティコンテキストを変更します

問題:Route が機能しない

問題:Route 経由でアプリケーションにアクセスできない 解決策:サービスセレクターを確認し、ルーターポッドを確認して、DNS を検証します

問題:イメージのプルエラー

問題:レジストリからイメージをプルできない 解決策:イメージプルシークレットを作成し、サービスアカウントにリンクします

oc create secret docker-registry regcred \
  --docker-server=registry.example.com \
  --docker-username=user \
  --docker-password=pass

oc secrets link default regcred --for=pull

ベストプラクティス

  • 分離には Project を使用します(単なる namespace ではなく)
  • イメージ管理には ImageStreams を活用します
  • CI/CD 統合には BuildConfigs を使用します
  • 適切な SCC を実装します(privileged は避けます)
  • Ingress ではなく Routes を使用します
  • 再現性のために OpenShift テンプレートを活用します
  • 組み込みの Prometheus で監視します
  • 複雑なアプリケーションには Operators を使用します

関連スキル

コメント