2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OCIのDevOpsを使用してOKEへのDevOps実施

Last updated at Posted at 2024-01-26

概要

OCIのDevOpsを以下のリンクを参考に実施しました。

KubernetesでサンプルアプリケーションのデプロイとCI/CDを体験してみよう

構成

ソースコードリポジトリはGitHubを利用しています。
OCI DevOps PipelineにてBuildとコンテナレジストリへのPushとKubernetesのマニフェストを使用したdeployを行っています。

image.png

前提

  • Webコンテンツを作成してGitHubリポジトリにPush済み
  • OCI OKEクラスターを構築済み

ポリシー設定

ポリシーを適用するグループを定義します。
動的グループ:OCI_DevOps_Dynamic_Group
一致ルール:以下のいずれかに該当
   instance.compartment.id = ‘コンパートメントOCID’,
   resource.compartment.id = ‘コンパートメントOCID’

今回のDevOpsを行うために以下のポリシーを設定します。

  • OCI DevOpsが自身が持つ各機能を利用可能にするポリシー
    Allow dynamic-group OCI_DevOps_Dynamic_Group to manage devops-family in compartment ‘コンパートメント名’
  • OCI DevOpsがOCIRやアーティファクト・レジストリを管理可能とするポリシー
    Allow dynamic-group OCI_DevOps_Dynamic_Group to manage all-artifacts in compartment ‘コンパートメント名’
  • OCI DevOpsがOCI Notificationsサービス(後続の手順で作成予定)を利用可能とするポリシー
    Allow dynamic-group OCI_DevOps_Dynamic_Group to use ons-topics in compartment ‘コンパートメント名’
  • OCI DevOpsがOKEを管理するためのポリシー
    Allow dynamic-group OCI_DevOps_Dynamic_Group to manage cluster-family in compartment ‘コンパートメント名’

参考
KubernetesでサンプルアプリケーションのデプロイとCI/CDを体験してみよう 1.ポリシー作成

コンテンツ作成とGitHubへのPush

サンプルアプリケーションとしてNginxを使用しました。

 |--build_spec.yaml
 |--Dockerfile
 +--conf
 |  +--NGINX構成ファイル
 +--src
    +--コンテンツ
  • build_spec.yaml
build_spec.yaml
version: 0.1
component: build
timeoutInSeconds: 10000
shell: bash
env:
  variables:
    container_name: 【コンテナ名】
    container_version: 1.0
  exportedVariables:
    - tag

steps:
  - type: Command
    name: "Docker image build"
    timeoutInSeconds: 4000
    command: |
      docker build -t ${container_name} .
      tag=${container_version}
    onFailure:
      - type: Command
        command: |
          echo "Failure successfully handled"
        timeoutInSeconds: 60

outputArtifacts:
  - name: 【コンテナ名】
    type: DOCKER_IMAGE
    location: 【コンテナ名】:latest

コンテナ・レジストリ作成

コンテナイメージの格納先を作成します。

  • OCIナビゲーションメニューから開発者サービス>>コンテナとアーティファクト>>コンテナ・レジストリを選択して「リポジトリの作成」を押下
  • リポジトリ名に【コンテナ名】を入力して「作成」を押下

アーティファクト・レジストリでのリポジトリ作成

kubernetesマニフェストファイルを設定します。

  • deployment.yamlをローカルに準備
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: 【app名】-deployment # app名は任意
  labels:
    app: 【app名】
spec:
  replicas: 1   # テストなのでreplicaは1つ
  selector:
    matchLabels:
      app: 【app名】
  template:
    metadata:
      labels:
        app: 【app名】
    spec:
      containers:
      - name: 【コンテナ名】
        image: 【コンテナ・レジストリ】/【ネームスペース】/【コンテナ名】:1.0 #コンテナ・レジストリのイメージへの完全修飾パス
        imagePullPolicy: Always
        ports:
        - containerPort: 8080  # nginx confファイルで設定したnginxのlisten port
          protocol: TCP
      imagePullSecrets:
        - name: 【secret】 # 事前にOCIRのlogin情報をsecretとして登録要
---
apiVersion: v1
kind: Service
metadata:
  name: 【app名】-svc
spec:
  selector:
    app: 【app名】
  ports:
    - port: 8085         # ServiceのExpose port
      targetPort: 8080   # nginx confファイルで設定したnginxのlisten port
      nodePort: 30990    # nodeで公開するport
  type: NodePort
  • OCIナビゲーションメニューから開発者サービス>>コンテナとアーティファクト>>アーティファクト・レジストリを選択して「リポジトリの作成」を押下
  • 名前を設定して「作成」を押下
  • 「アーティファクトのアップロード」を押下
  • アーティファクト・パスにマニフェストファイル(deployment.yaml)、アーティファクトのバージョンを設定
  • 今回はマニフェストファイルをOCI CLI実行可能なLinuxからアップロードするのでCLIを選択すると投入コマンドが表示されるのでコピー
  • Linuxにてペーストしてマニフェストファイルを指定して実行
oci artifacts generic artifact upload-by-path \
  --repository-id ocid1.artifactrepository.oc1.***** \
  --artifact-path deployment.yaml \
  --artifact-version 1.0 \
  --content-body ./deployment.yaml  #アップロードするマニフェスト

トピック作成

DevOpsの通知先(メール等)としてのトピックを作成します。

トピックの作成

Vault作成

GitHub個人用アクセストークンを保管するためにVaultを作成します。

Vaultの作成
キーを管理するVaultを作成
Vaultの作成

マスター暗号化キーの作成
Vault配下でGitHub個人用アクセストークンを暗号化するキーの作成
マスター暗号化キーの作成

Vaultでのシークレットの作成
Vault配下でGitHub個人用アクセストークンを格納します。
アクセストークンは前述のマスター暗号化キーによって暗号化されます。
Vaultでのシークレットの作成

参考
OCI Vault 機能概要と特徴

DevOps作成

CI/CDパイプラインを設定します。

  • DevOpsプロジェクトの作成
    • OCIナビゲーションメニューから開発者サービス>>DevOps>>プロジェクトを選択して「DevOpsプロジェクトの作成」を押下
    • トピックの選択で作成したトピックを選択
    • 「DevOpsプロジェクトの作成」を押下
  • 外部接続
    GitHub接続設定を行います。
    • DevOpsプロジェクト・リソースから外部接続を選択し「外部接続の作成」を押下
    • 名前を設定
    • タイプはGitHubを設定
    • ボールト・シークレットはGitHub個人用アクセストークンを格納したVaultを選択
    • 「作成」を押下
  • コード・リポジトリ
    GitHubコード・リポジトリのクローン設定を行います。
    • DevOpsプロジェクト・リソースからコード・リポジトリを選択し「リポジトリのミラー化」を押下
    • 接続は外部接続で作成した接続を選択
    • リポジトリはGitHubのリポジトリが読み込まれるので該当のリポジトリを選択
    • 名前を設定
    • 「リポジトリのミラー化」を押下
    • ミラーリングが成功するとコードリポジトリ内容が表示される
  • 環境
     OKEクラスター情報を登録します。
    • DevOpsプロジェクト・リソースから環境を選択し「環境の作成」を押下
    • 環境タイプはOracle Kubernetesエンジンを選択
    • 名前を設定して「次」を押下
    • リージョンを選択
    • クラスタは対象のOKEクラスターを選択
    • 「環境の作成」を押下
  • アーティファクト (Dockerイメージ)
    DockerイメージPush先を設定します。
    • DevOpsプロジェクト・リソースからアーティファクトを選択し「アーティファクトの作成」を押下
    • 名前を設定
    • タイプはコンテナイメージレポジトリを選択
    • コンテナ・レジストリのイメージへの完全修飾パスでコンテナ・レジストリ作成で作成した内容を以下のように入力
      - 【コンテナ・レジストリ】/【ネームスペース】/【コンテナ名】:${tag}
      - コンテナ・レジストリは東京であればnrt.ocir.io
      - タグは${tag}を設定 (build_spec.yaml 環境変数tag) 
    • 「追加」を押下
  • アーティファクト (Kubernetesマニフェスト)
    Kubernetesマニフェストを指定します。
    • DevOpsプロジェクト・リソースからアーティファクトを選択し「アーティファクトの作成」を押下
    • 名前を設定
    • タイプはKubernetesマニフェストを選択
    • アーティファクト・ソースはアーティファクト・レジストリ・リポジトリを選択
    • アーティファクト・レジストリ・リポジトリは前述で作成したアーティファクト・レジストリ・リポジトリを選択
    • アーティファクト設定のアーティファクトパスはマニフェストファイル(deployment.yaml)を設定
    • アーティファクト設定のバージョンは${tag}を設定 (build_spec.yaml 環境変数tag)
    • 「追加」を押下
  • ビルド・パイプライン マネージドビルド
     コンテナイメージビルドを行うためのパイプラインを作成します。
    • DevOpsプロジェクト・リソースからビルド・パイプラインを選択し「ビルド・パイプラインの作成」を押下
    • 名前を設定して「作成」を押下
    • 「ステージの追加」を押下
    • ステージはマネージドビルドを選択して「次」を押下
    • ステージ名を設定
    • プライマリ・コード・リポジトリはコード・リポジトリで作成したリポジトリを選択
    • 「追加」を押下
  • ビルド・パイプライン アーティファクトの配信
     コンテナPushを行うためのパイプラインを追加します。
    • 作成したビルド・パイプラインの最後のステージの+マークをクリックしてステージの追加を選択
    • ステージはアーティファクトの配信を選択して「次」を押下
    • ステージ名を設定
    • アーティファクトは前述のDockerイメージを選択
    • ビルド構成/結果アーティファクト名は【コンテナ名】を設定
    • 「追加」を押下
  • トリガー
     GitHubコード・リポジトリのクローンを行った際にPushがあればビルドパイプラインを開始します。
    • DevOpsプロジェクト・リソースからトリガーを選択し「トリガーの作成」を押下
    • 任意の名前を設定
    • ソース接続はGitHubを選択
    • 「アクションの追加」を押下
    • ビルド・パイプラインは前述で作成したビルド・パイプラインを選択
    • イベントオプションはプッシュを選択
    • 「作成」を押下
  • CDパイプラインの構築
    Kubernetesマニフェストを使ったDeployを行うためのパイプラインを追加します。
    • DevOpsプロジェクト・リソースからデプロイメント・パイプラインを選択し「パイプラインの作成」を押下
    • パイプライン名を設定して「パイプラインの作成」を押下
    • 「ステージの追加」を押下
    • Kubernetesクラスタにマニフェストを適用を選択して「次」を押下
    • ステージ名を設定
    • OKE環境を前述の環境で作成したクラスターを選択
    • アーティファクトの選択で前述のアーティファクトで作成したKubernetesマニフェストを選択
    • 「追加」を押下
  • CIパイプラインへのCDパイプライン起動ステップの追加
    作成したCDパイプラインをCIパイプラインに追加します
    • DevOpsプロジェクト・リソースからビルド・パイプラインを選択し作成したパイプラインを選択
    • 作成した最後のステージの+マークをクリックしてステージの追加を選択
    • デプロイメントのトリガーを選択して「次」を押下
    • ステージ名を設定
    • 作成したデプロイメント・パイプラインの選択
      -「追加」を押下
  • ログ
     ビルド状況を保管するログを設定します
    • DevOpsプロジェクト・リソースからログを選択し作成しログの有効化を有効に変更

実行結果

  • 手動実行
    正常に実行するか確認するため手動実行します。
    • DevOpsプロジェクト・リソースからビルド・パイプラインを選択し作成したパイプラインを選択
    • 「手動実行の開始」を押下
    • 以下のようにビルド実行の進捗状況がすべて緑のチェックマークになると成功です。
  • Pod起動確認
    kubectlコマンドおよびcurlコマンドを実行して正常に起動できたことを確認します。
[user@linux]$ kubectl get po   
NAME                                           READY   STATUS    RESTARTS   AGE
pod/docker-nginx-deployment-5d44df6579-5mrqp   1/1     Running   0          43s

[user@linux]$ curl -I http://【node ip address】:30990
HTTP/1.1 200 OK

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?