在 OCI DevOps 和 OKE 中的蓝绿部署

蓝绿环境

环境概览图

環境概要図

OCI DevOps中的蓝/绿部署是指初始部署是在蓝色命名空间,接下来的部署将在绿色命名空间中进行。之后,将会依次轮流在蓝色和绿色之间进行部署。

这一机制通过OCI DevOps更改Ingress的注释设置来实现。

当将namespaceA(此处为蓝色)部署时,namespaceB(此处为绿色)的canary-weight将变为0;而将namespaceB(此处为绿色)部署时,canary-weight将变为100。

将namespaceA(在此处为blue)部署

kubectl get ingress -o yaml -n green
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
      nginx.ingress.kubernetes.io/canary: "true"
      nginx.ingress.kubernetes.io/canary-by-header: redirect-to-namespaceB
      nginx.ingress.kubernetes.io/canary-weight: "0"
・
・<省略>
・

将B命名空间(在这里是绿色)部署

kubectl get ingress -o yaml -n green
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
      nginx.ingress.kubernetes.io/canary: "true"
      nginx.ingress.kubernetes.io/canary-by-header: redirect-to-namespaceB
      nginx.ingress.kubernetes.io/canary-weight: "100"
・
・<省略>
・
01.png
Shift Traffic
Shift Traffic

OKE 建立

请参考以下教程,构建Kubernetes集群。

在这本书中,我们将环境描述为3个节点。

让我们部署Oracle容器引擎用于Kubernetes(OKE)。

    1. 准备OKE集群的配置

 

    准备CLI执行环境(Cloud Shell)

OCIR 配置

参考以下教程,在OCIR中创建一个存储库。

Oracle云基础设施(OCI)DevOps入门-OKE编辑

    工艺品
    3-1. OCIRのセットアップ

<参数>
隔间:所针对的隔间
仓库名称:蓝绿
访问:公共

Ingress 控制器设置

获取示例代码。

git clone https://github.com/oracle-japan/devops-deploy-strategy.git

查看目录的内容。

ls devops-deploy-strategy
deploy-strategy-bg  deploy-strategy-canary  README.md

进入deploy-strategy-bg目录并设置Ingress控制器。

cd deploy-strategy-bg
kubectl apply -f ingress-controller.yaml 
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created

确认有三个ingress-nginx-controller的状态为Running。

kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-4jptb        0/1     Completed   0          43m
ingress-nginx-admission-patch-5pch2         0/1     Completed   1          43m
ingress-nginx-controller-8574b6d7c9-4nskl   1/1     Running     0          43m
ingress-nginx-controller-8574b6d7c9-6k5zp   1/1     Running     0          43m
ingress-nginx-controller-8574b6d7c9-hpf62   1/1     Running     0          43m

确认LoadBalancer ingress-nginx-controller的EXTERNAL-IP是否显示。

kubectl get services -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.96.107.235   132.xxx.xxx.xxx   80:32487/TCP,443:32238/TCP   44m
ingress-nginx-controller-admission   ClusterIP      10.96.101.214   <none>            443/TCP                      44m

命名空间创建

在指定的Kubernetes集群中,创建用于BLUE和GREEN的命名空间。

kubectl create ns blue
namespace/blue created
kubectl create ns green
namespace/green created

确认蓝色和绿色的命名空间已创建。

kubectl get ns
NAME              STATUS   AGE
blue              Active   11m
default           Active   5h58m
green             Active   11m
ingress-nginx     Active   153m
kube-node-lease   Active   5h58m
kube-public       Active   5h58m
kube-system       Active   5h58m

OCI DevOps设置

创建项目

请参考此处创建OCI DevOps环境的准备工作。

Oracle 云基础架构(OCI)DevOps准备工作

在这里,将以以下名称创建。

话题名称:DevOps部署策略
项目名称:蓝绿部署

2. 创造环境

选择已创建的项目,然后选择”环境”。
在左侧菜单中选择”环境”。

環境 作成

点击”创建环境”按钮。

環境 作成

进行以下设置,并点击“下一步”按钮。

    • 環境タイプ:Oracle Kubernetesエンジン

 

    名前:blue-green-cluster
環境 作成
環境 作成

进行以下配置后,点击“创建环境”按钮。

    • リージョン:対象クラスタのリージョン

 

    • コンパートメント:対象のコンパートメント

 

    クラスタ:対象のクラスタ(ここでは cluster1)
環境 作成
環境 作成

从面包屑列表中选择”蓝绿色”。

環境 作成

创建代码库

从左侧菜单选择“代码仓库”。

コード・リポジトリ 作成

点击“创建存储库”按钮。

コード・リポジトリ 作成

进行以下设置,然后点击“创建存储库”按钮。

    • リポジトリ名:strategy-blue-green

 

    デフォルト・ブランチ・オプション:main
コード・リポジトリ 作成
コード・リポジトリ 作成

点击「HTTPS」按钮,然后点击命令的「复制」文本,执行命令来克隆。

コード・リポジトリ 作成

将示例代码复制到克隆的目录中。

cp -pR devops-deploy-strategy/deploy-strategy-bg/* ./strategy-blue-green/
ls strategy-blue-green/
blue-green-app.yaml  build_spec.yaml  content.html  Dockerfile  ingress-controller.yaml

将示例代码推送到创建的存储库中。

cd strategy-blue-green
git add -A .
git commit -m "first commit"
[main 46179ca] first commit
 5 files changed, 785 insertions(+)
 create mode 100644 Dockerfile
 create mode 100644 blue-green-app.yaml
 create mode 100644 build_spec.yaml
 create mode 100644 content.html
 create mode 100644 ingress-controller.yaml
git branch -M main
git push -u origin main
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 2 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 3.79 KiB | 1.26 MiB/s, done.
Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
To https://devops.scmservice.uk-london-1.oci.oraclecloud.com/namespaces/orasejapan/projects/blue-green/repositories/strategy-blue-green
   dc00f99..46179ca  main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

查看存储库后,会显示示例代码。

コード・リポジトリ 作成

4. 制作手工艺品

在部署到Kubernetes集群之前,需要将所需的清单文件上传到构件注册表。首先,在构件注册表上创建一个仓库。

アップロードするマニフェストファイル内にある、コンテナイメージのパスを変更します。

cd strategy-blue-green
vim blue-green-app.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: helloworld
spec:
  selector:
    matchLabels:
      app: helloworld
  replicas: 3
  template:
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
        - name: helloworld
          # enter the path to your image, be sure to include the correct region prefix
          image: <your-region>.ocir.io/<your-object-storage-namespace>/blue-green/blue-green-app:${BUILDRUN_HASH} #対象となるパスに変更
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: helloworld
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: helloworld
---
# main-ingress.yaml with networking.k8s.io/v1 version
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: helloworld-ing
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules: 
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: helloworld
                port:
                  number: 80

ハンバーガーメニューから「開発者サービス」-「アーティファクト・レジストリ」を選択します。

アーティファクト 作成

点击“创建存储库”按钮。

アーティファクト 作成

进行以下设置,并点击“创建”按钮。

    • 名前:artifact-repository-bg

 

    • コンパートメント:対象となるコンパートメント

 

    不変アーティファクト:チェックを外す
アーティファクト 作成
アーティファクト 作成

点击“上传文件”按钮,上传清单文件。

アーティファクト 作成

进行以下设置,然后点击“复制”文本。

    • アーティファクト・パス:blue-green-app.yaml

 

    • バージョン:1

 

    Uplad method:Cloud Shell
アーティファクト 作成

将复制的内容粘贴,将“./”更改为“./blue-grenn-app.yaml”,然后执行命令。

oci artifacts generic artifact upload-by-path \
>   --repository-id ocid1.artifactrepository.oc1.uk-london-1.0.amaaaaaassl65iqaj6s4wnf3k5tvtanp3impmofawxr6k6ps3bc7upjlxfla \
>   --artifact-path blue-green-app.yaml \
>   --artifact-version 1 \
>   --content-body ./blue-green-app.yaml

如果返回以下结果,则表示上传完成。

{
  "data": {
    "artifact-path": "blue-green-app.yaml",
    "compartment-id": "ocid1.compartment.oc1..aaaaaaaagp3t6j5zjzg3hrau4i3rtcxvl64cxbcdgpid5smp6avpnfecegqa",
    "defined-tags": {},
    "display-name": "blue-green-app.yaml:1",
    "freeform-tags": {},
    "id": "ocid1.genericartifact.oc1.uk-london-1.0.amaaaaaassl65iqakquhxcpokv7k3sfdq53hx2dxyzhtnd6vaxgrkilrzxeq",
    "lifecycle-state": "AVAILABLE",
    "repository-id": "ocid1.artifactrepository.oc1.uk-london-1.0.amaaaaaassl65iqaj6s4wnf3k5tvtanp3impmofawxr6k6ps3bc7upjlxfla",
    "sha256": "de9f5af3b99b54c0aa05a473af504644972f9cb1a0ed0c283214e4debd7a930d",
    "size-in-bytes": 1167,
    "time-created": "2023-01-26T05:32:22.234000+00:00",
    "version": "1"
  }
}

点击“关闭”按钮。

アーティファクト 作成

更新浏览器后,您上传的艺术品将显示在列表中。

アーティファクト 作成

请返回OCI DevOps的“蓝绿部署”项目页面,并在Artifacts中注册目标OCIR和Artifacts Registry的存储库。

OCI DevOpsの左目メニューから「アーティファクト」を選択します。

アーティファクト 作成

点击”添加物品”按钮。

アーティファクト 作成

进行以下设置,并单击“添加”按钮。

    • 名前:ocir-repogitory-bg

 

    • タイプ:コンテナ・イメージ・リポジトリ

 

    コンテナ・レジストリのイメージへの完全修飾パスを入力してください:マニフェストファイルに指定したリポジトリを設定してください
アーティファクト 作成
アーティファクト 作成

「アーティファクトの追加」ボタンをクリックします。

アーティファクト 作成

以下の設定を行い、「選択」ボタンをクリックします。

    • 名前:artifact-repogitory-bg

 

    タイプ:Kubernetesマニフェスト
アーティファクト 作成

进行以下设置,然后点击“选择”按钮。

    • リージョン:対象となるリージョン

 

    • コンパートメント:対象となるコンパートメント

 

    アーティファクト・レジストリ・リポジトリ:artifact-repository-bg
アーティファクト 作成
26.png

「アーティファクト」の「選択」ボタンをクリックします。

アーティファクト 作成

勾选「蓝绿-app.yaml:v1」,然后点击「选择」按钮。

アーティファクト 作成
アーティファクト 作成

请最后点击“添加”按钮。

アーティファクト 作成

确认已经列出了已注册的OCIR和Artifact Registry的仓库。

アーティファクト 作成

パンくずリストから「blue-green」を選択します。

アーティファクト 作成

建立部署管道。

从左侧菜单中选择”部署管道”,创建部署管道。

デプロイメント・パイプライン 作成

点击“创建管道”按钮。

デプロイメント・パイプライン 作成

在进行以下配置后,点击“创建管道”按钮。

    パイプライン名:deploy-to-oke
デプロイメント・パイプライン 作成
デプロイメント・パイプライン 作成

点击「新增舞台」按钮。

デプロイメント・パイプライン 作成

选择“蓝/绿策略”,然后点击“下一步”按钮。

デプロイメント・パイプライン 作成
デプロイメント・パイプライン 作成

进行以下设置,然后点击”选择工件”按钮。

    • デプロイメント・タイプ:OKE

 

    • ステージ名:deploy-strategy-bg

 

    • 環境:blue-green-cluster

 

    • ネームスペースA:blue

 

    • ネームスペースB:green

 

    NGINXイングレス名:helloworld-ing
デプロイメント・パイプライン 作成

选择「artifact-repository-bg」,然后点击「保存更改」按钮。

デプロイメント・パイプライン 作成
デプロイメント・パイプライン 作成

点击“次”按钮。

デプロイメント・パイプライン 作成

进行以下设置,然后点击“添加”按钮。

    • 承認制御:有効

 

    ステージ名:confirm
デプロイメント・パイプライン 作成
デプロイメント・パイプライン 作成

请确保显示为“已完成”,然后点击“关闭”按钮。

デプロイメント・パイプライン 作成
デプロイメント・パイプライン 作成

从面包屑列表中选择“蓝绿色”。

デプロイメント・パイプライン 作成

6. 创建构建流程。

在左侧菜单中选择“构建流水线”,并创建构建流水线。

ビルド・パイプライン 作成

点击创建“构建管道”按钮。

ビルド・パイプライン 作成

进行以下设置,并点击“创建”按钮。

    名前:image-build-ship
ビルド・パイプライン 作成
ビルド・パイプライン 作成

点击“添加舞台”按钮。

ビルド・パイプライン 作成

选择“托管构建”,并点击“下一步”按钮。

ビルド・パイプライン 作成
ビルド・パイプライン 作成

进行以下设置,然后点击“选择”按钮。

    • ステージ名:container-image-build

 

    ビルド仕様ファイル・パス:build_spec.yaml
ビルド・パイプライン 作成

进行以下设置,并单击“选择”按钮。

    • ソース:接続タイプ:OCIコード・リポジトリ

 

    • strategy-blue-grenn にチェックを入れる

 

    ブランチの選択:main
ビルド・パイプライン 作成
ビルド・パイプライン 作成

点击“追加”按钮。

ビルド・パイプライン 作成

点击「+」,选择「添加舞台」。

ビルド・パイプライン 作成

选择「交付工件」,然后点击「下一步」按钮。

ビルド・パイプライン 作成
ビルド・パイプライン 作成

进行以下设置,然后点击“选择工件”按钮。

    ステージ名:container-image-ship
ビルド・パイプライン 作成

勾选「ocir-repository-bg」,然后点击「添加」按钮。

ビルド・パイプライン 作成
ビルド・パイプライン 作成

「ビルド構成/結果アーティファクト名」に「bg_image」と設定を行い、「追加」ボタンをクリックします。

ビルド・パイプライン 作成
ビルド・パイプライン 作成

「+」をクリックして、「ステージの追加」を選択します。

ビルド・パイプライン 作成

选择 “部署触发器”,然后点击 “下一步” 按钮。

ビルド・パイプライン 作成
ビルド・パイプライン 作成

以下の設定を行い、「デプロイメント・パイプラインの選択」ボタンをクリックします。

    ステージ名:connect-to-deployment-pipeline
ビルド・パイプライン 作成

勾选「部署到Oracle Kubernetes Engine」,然后点击「保存更改」按钮。

ビルド・パイプライン 作成
ビルド・パイプライン 作成

请最后点击“添加”按钮。

ビルド・パイプライン 作成

从面包屑列表中选择“蓝绿色”。

ビルド・パイプライン 作成

7. 创建触发器

选择左侧菜单中的”触发器”,来设置在源代码更新后推送触发蓝绿部署的配置。

トリガー 作成

点击”创建触发器”按钮。

トリガー 作成

进行以下设置,然后点击“选择”按钮。

    • 名前:deploy-strategy-bg

 

    ソース接続:OCIコード・リポジトリ
トリガー 作成

在「策略-蓝绿」选项前打勾,然后点击“保存更改”按钮。

トリガー 作成
トリガー 作成

点击“添加动作”按钮。

トリガー 作成

勾选“推送”,然后点击“选择”按钮。

トリガー 作成

在「图像构建船」上勾选并点击「选择」按钮。

トリガー 作成
トリガー 作成

点击“添加动作”按钮。

トリガー 作成

最后点击“创建”按钮。

トリガー 作成

完成于上述内容。

执行蓝色/绿色部署

为了实施蓝/绿部署,需要修改源代码。

cd strategy-blue-green

将显示文本”Hello, Blue deploy !!”更改为”Hello, Blue deploy first !!”。

vim content.html
<!DOCTYPE html>
<html lang="ja">
<head>

<meta charset="UTF-8">

<title>Blue-Green</title>

</head>
<body>

<h1>Hello, Blue deploy !!</h1> #「Blue deploy first!!」に変更

</body>
</html>

将代码存储库推送至远程。

git add -A .
git commit -m "first commit"
[main 03ffea8] first commit
 5 files changed, 785 insertions(+)
 create mode 100644 Dockerfile
 create mode 100644 blue-green-app.yaml
 create mode 100644 build_spec.yaml
 create mode 100644 content.html
 create mode 100644 ingress-controller.yaml
git branch -M main
git push -u origin main
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 2 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 3.79 KiB | 1.89 MiB/s, done.
Total 7 (delta 0), reused 0 (delta 0), pack-reused 0
To https://devops.scmservice.uk-london-1.oci.oraclecloud.com/namespaces/orasejapan/projects/blue-green/repositories/strategy-blue-green
   aca6740..03ffea8  main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

在触发推送操作时,将执行构建流程。
在构建流程成功后,将执行部署流程。

ブルー/グリーンデプロイ 実行

在部署管道中,需要进行承认处理。
点击汉堡菜单,选择”承认”。

ブルー/グリーンデプロイ 実行

在输入「好」后,点击「确认」按钮。

ブルー/グリーンデプロイ 実行

确认部署流水线成功。

ブルー/グリーンデプロイ 実行

我們要確認 Kubernetes 集群中的藍色 namespace 已被部署。

kubectl get pods -n blue
NAME                          READY   STATUS    RESTARTS   AGE
helloworld-5d66bf56f4-b69sz   1/1     Running   0          13m
helloworld-5d66bf56f4-hvvnk   1/1     Running   0          13m
helloworld-5d66bf56f4-pdfbb   1/1     Running   0          13m

我会确认分配给Ingress的EXTERNAL-IP。

kubectl get ingress -n blue
NAME             CLASS    HOSTS   ADDRESS           PORTS   AGE
helloworld-ing   <none>   *       132.xxx.xxx.xxx   80      14m

通过浏览器访问。

http://132.xxx.xxx.xxx/content.html
ブルー/グリーンデプロイ 実行

我们要执行再次部署,以确保部署到绿色命名空间。我们需要更改源代码。

vim content.html
<!DOCTYPE html>
<html lang="ja">
<head>

<meta charset="UTF-8">

<title>Blue-Green</title>

</head>
<body>

<h1>Hello, Green deploy first!!</h1> #「Green deploy first!!」に変更

</body>
</html>

将代码库推送到存储库中。

git add -A .
git commit -m "second commit"
[main db77643] second commit
 1 file changed, 1 insertion(+), 1 deletion(-)
git branch -M main
git push -u origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 2 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 292 bytes | 292.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2)
To https://devops.scmservice.uk-london-1.oci.oraclecloud.com/namespaces/orasejapan/projects/blue-green/repositories/strategy-blue-green
   5f6b809..db77643  main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

通过这个推送操作触发,将执行构建流水线和部署流水线,并进行部署。在部署流水线中,将手动执行与第一次相同的批准操作。

kubectl get pods -n green
NAME                          READY   STATUS    RESTARTS   AGE
helloworld-7cd5f9b688-g4sln   1/1     Running   0          5m24s
helloworld-7cd5f9b688-mphp7   1/1     Running   0          5m24s
helloworld-7cd5f9b688-xwfhv   1/1     Running   0          5m24s

我们将确认分配给Ingress的EXTERNAL-IP。
* 请注意,Ingress Controller将使用与blue命名空间相同的EXTERNAL-IP。

kubectl get ingress -n green
NAME             CLASS    HOSTS   ADDRESS           PORTS   AGE
helloworld-ing   <none>   *       132.xxx.xxx.xxx   80      14m

从浏览器访问。

http://132.xxx.xxx.xxx/content.html
ブルー/グリーンデプロイ 実行

已经完成了。

广告
将在 10 秒后关闭
bannerAds