在 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"
・
・<省略>
・
OKE 建立
请参考以下教程,构建Kubernetes集群。
在这本书中,我们将环境描述为3个节点。
让我们部署Oracle容器引擎用于Kubernetes(OKE)。
-
- 准备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
「アーティファクト」の「選択」ボタンをクリックします。
勾选「蓝绿-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
已经完成了。