openshift について
OpenShiftのデプロイとクラスター管理を扱うガイドです。oc CLIに加え、Routes、BuildConfigs、SCC、Operatorsなどの機能を紹介します。
主な機能
- 01oc CLIによるプロジェクト管理
- 02イメージ、ソース、テンプレートからのアプリデプロイ
- 03RoutesとBuildConfigsの設定
- 04ImageStreamsとデプロイ設定の管理
- 05ConfigMaps、Secrets、SCCの設定
- 06ログ、イベント、リソース使用量の確認
活用シーン
- 01OpenShiftクラスターへのアプリデプロイ
- 02S2IによるGitソースプロジェクトのビルド
- 03アプリのルートとアクセス方針の設定
- 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 を使用します
関連スキル
- kubernetes-ops - K8s の基本
- helm-charts - Helm によるデプロイ
- container-registries - イメージ管理
コメント
Markdown 対応