יצירת צינור לעיבוד נתונים של CI/CD באמצעות Azure Pipelines ו-Google Kubernetes Engine

Last reviewed 2022-11-29 UTC

במדריך הזה מוסבר איך להשתמש ב-Azure Pipelines, ב-Google Kubernetes Engine‏ (GKE) וב-Google Container Registry כדי ליצור פייפליין של אינטגרציה רציפה (CI) ופריסה רציפה (CD) לאפליקציית אינטרנט של ASP.NET MVC. לצורך המדריך הזה, אפשר לבחור בין שתי אפליקציות לדוגמה:

  • אפליקציית אינטרנט ב-ASP.NET Core שמשתמשת ב-‎ .NET 6.0 ופועלת ב-Linux
  • אפליקציית אינטרנט של ASP.NET MVC שמשתמשת ב-‎ .NET Framework 4 ופועלת ב-Windows

צינור עיבוד הנתונים של CI/CD משתמש בשני אשכולות GKE נפרדים, אחד לפיתוח ואחד לייצור, כמו שמוצג בתרשים הבא.

תרשים קונספטואלי של צינור עיבוד נתונים של CI/CD שמראה איך מפתחים ומשתמשי קצה מקיימים אינטראקציה עם האפליקציה

בתחילת הצינור, מפתחים מבצעים קומיט של שינויים בבסיס הקוד לדוגמה. הפעולה הזו מפעילה את צינור העברת הנתונים כדי ליצור גרסה ולהטמיע אותה באשכול הפיתוח. מנהל ההפצה יכול לקדם את הגרסה כך שהיא תיפרס באשכול הייצור.

המדריך הזה מיועד למפתחים ולמהנדסי DevOps. ההנחה היא שיש לכם ידע בסיסי ב-Microsoft .NET, ב-Azure Pipelines וב-GKE. בנוסף, כדי לבצע את ההדרכה, צריכה להיות לכם הרשאת אדמין בחשבון Azure DevOps.

מטרות

  • חיבור של Google Container Registry ל-Azure Pipelines לפרסום קובצי אימג' של Docker.
  • הכנת אפליקציה לדוגמה ב-‎.NET לפריסה ב-GKE.
  • אימות מאובטח מול GKE בלי להשתמש באימות מדור קודם.
  • משתמשים בניהול פריסות של Azure Pipelines כדי לתזמר פריסות של GKE.

נכסים מוסתרים

במדריך הזה לא מוסבר איך לחבר את Azure Pipelines לאשכול GKE פרטי, או איך להתחבר לרשתות פרטיות מורשות.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.

כדאי לעיין בדף התמחור של Azure DevOps כדי לבדוק אם יש עמלות שחלות על השימוש ב-Azure DevOps.

לפני שמתחילים

בדרך כלל מומלץ להשתמש בפרויקטים נפרדים לעומסי עבודה של פיתוח וייצור, כדי שאפשר יהיה להעניק תפקידים והרשאות בניהול זהויות והרשאות גישה (IAM) בנפרד. כדי לפשט את המדריך הזה, נשתמש בפרויקט אחד לשני אשכולות GKE, אחד לפיתוח ואחד לייצור.

  1. בדף לבחירת הפרויקט במסוף Google Cloud , בוחרים פרויקט ב- Google Cloud או יוצרים אותו.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים

    כניסה לדף לבחירת הפרויקט

  2. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  3. מוודאים שיש לכם חשבון Azure DevOps ושיש לכם הרשאת אדמין בו. אם עדיין אין לכם חשבון ב-Azure DevOps, אתם יכולים להירשם בדף הבית של Azure DevOps.

יצירת פרויקט ב-Azure DevOps

אתם משתמשים ב-Azure DevOps כדי לנהל את קוד המקור, להריץ בנייה ובדיקות ולתזמן את הפריסה ב-GKE. כדי להתחיל, יוצרים פרויקט בחשבון Azure DevOps.

  1. עוברים לדף הבית של Azure DevOps ‏(https://dev.azure.com/YOUR_AZURE_DEVOPS_ACCOUNT_NAME).
  2. לוחצים על פרויקט חדש.
  3. מזינים שם לפרויקט, למשל CloudDemo.
  4. מגדירים את Visibility (חשיפה) למצב Private (פרטי) ולוחצים על Create (יצירה).
  5. אחרי שיוצרים את הפרויקט, בתפריט שמימין לוחצים על Repos (מאגרי מידע).
  6. לוחצים על Import (ייבוא) כדי ליצור הסתעפות של מאגר dotnet-docs-samples מ-GitHub, ואז מגדירים את הערכים הבאים:
    • סוג המאגר: Git
    • כתובת ה-URL של השיבוט: https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
  7. לוחצים על Import.

    בסיום תהליך הייבוא, קוד המקור של מאגר dotnet-docs-samples מוצג.

קישור של Azure Pipelines ל-Google Container Registry

כדי להגדיר שילוב רציף של אפליקציית CloudDemo, צריך לחבר את Azure Pipelines ל-Container Registry. החיבור הזה מאפשר ל-Azure Pipelines לפרסם קובצי אימג' של קונטיינרים ב-Container Registry.

הגדרת חשבון שירות לפרסום תמונות

יוצרים Google Cloud חשבון שירות בפרויקט:

  1. פותחים את מסוף Google Cloud .

  2. במסוף Google Cloud , מפעילים את Cloud Shell.

    הפעלת Cloud Shell

  3. כדי לחסוך זמן בהקלדת מזהה הפרויקט ואפשרויות האזור של Compute Engine, מריצים את הפקודות הבאות כדי להגדיר ערכי ברירת מחדל להגדרות:

    gcloud config set project PROJECT_ID
    gcloud config set compute/zone us-central1-a
    

    מחליפים את הערך PROJECT_ID במזהה הפרויקט.

  4. מפעילים את Container Registry API בפרויקט:

    gcloud services enable containerregistry.googleapis.com
    
  5. יוצרים חשבון שירות ש-Azure Pipelines משתמש בו כדי לפרסם תמונות Docker:

    gcloud iam service-accounts create azure-pipelines-publisher \
        --display-name="Azure Pipelines Publisher"
    
  6. מקצים לחשבון השירות את תפקיד האדמין ב-IAM של Artifact Registry (roles/artifactregistry.admin) כדי לאפשר ל-Azure Pipelines לבצע פעולת push ל-Container Registry:

    AZURE_PIPELINES_PUBLISHER=azure-pipelines-publisher@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
    
    gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT \
        --member serviceAccount:$AZURE_PIPELINES_PUBLISHER \
        --role roles/artifactregistry.admin
    
  7. יוצרים מפתח לחשבון השירות:

    gcloud iam service-accounts keys create azure-pipelines-publisher.json \
        --iam-account $AZURE_PIPELINES_PUBLISHER
    
    tr -d '\n' < azure-pipelines-publisher.json > azure-pipelines-publisher-oneline.json
    
  8. צופים בתוכן של קובץ המפתח של חשבון השירות:

    echo $(<azure-pipelines-publisher-oneline.json)
    

    תצטרכו את המפתח של חשבון השירות באחד מהשלבים הבאים.

יצירת חיבור שירות ל-Google Container Registry

ב-Azure Pipelines, יוצרים חיבור שירות חדש ל-Container Registry:

  1. בתפריט DevOps של Azure, בוחרים באפשרות Project settings (הגדרות הפרויקט), ואז בוחרים באפשרות Pipelines (צינורות) > Service connections (חיבורי שירות).
  2. לוחצים על יצירת קישור לשירות.
  3. מהרשימה, בוחרים באפשרות Docker Registry ולוחצים על Next (הבא).
  4. בתיבת הדו-שיח, מזינים ערכים בשדות הבאים:
    • סוג המרשם: אחרים
    • Docker Registry: https://gcr.io/PROJECT_ID, מחליפים את PROJECT_ID בשם הפרויקט (לדוגמה, https://gcr.io/azure-pipelines-test-project-12345).
    • מזהה Docker: _json_key
    • סיסמה: מדביקים את התוכן של azure-pipelines-publisher-oneline.json.
    • שם חיבור השירות: gcr-tutorial
  5. לוחצים על שמירה כדי ליצור את הקישור.

בנייה רציפה

עכשיו אפשר להשתמש ב-Azure Pipelines כדי להגדיר אינטגרציה רציפה (CI). לכל קומיט שמועבר בדחיפה למאגר Git, ‏ Azure Pipelines יוצר את הקוד ואורז את תוצרי הבנייה במאגר Docker. הקונטיינר מתפרסם ב-Container Registry.

המאגר כבר מכיל את קובץ ה-Dockerfile הבא:

‎.NET/Linux

#
# Copyright 2020 Google LLC
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

FROM mcr.microsoft.com/dotnet/aspnet:6.0
EXPOSE 8080

#------------------------------------------------------------------------------
# Copy publishing artifacts.
#------------------------------------------------------------------------------

WORKDIR /app
COPY CloudDemo.MvcCore/bin/Release/net6.0/publish/ /app/

ENV ASPNETCORE_URLS=http://0.0.0.0:8080

#------------------------------------------------------------------------------
# Run application in Kestrel.
#------------------------------------------------------------------------------

ENTRYPOINT ["dotnet", "CloudDemo.MvcCore.dll"]

‫‎.NET Framework/Windows

#
# Copyright 2020 Google LLC
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

FROM mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019
EXPOSE 80
SHELL ["powershell", "-command"]

#------------------------------------------------------------------------------
# Add LogMonitor so that IIS and Windows logs are emitted to STDOUT and can be 
# picked up by Docker/Kubernetes.
#
# See https://github.com/microsoft/windows-container-tools/wiki/Authoring-a-Config-File
# for details.
#------------------------------------------------------------------------------

ADD https://github.com/microsoft/windows-container-tools/releases/download/v1.1/LogMonitor.exe LogMonitor/
ADD LogMonitorConfig.json LogMonitor/

#------------------------------------------------------------------------------
# Copy publishing artifacts to webroot.
#------------------------------------------------------------------------------

ADD CloudDemo.Mvc/bin/Release/PublishOutput/ c:/inetpub/wwwroot/

#------------------------------------------------------------------------------
# Configure IIS using the helper functions from deployment.ps1.
#------------------------------------------------------------------------------

ADD deployment.ps1 /
RUN . /deployment.ps1; \
	Install-Iis; \
	Register-WebApplication -AppName "CloudDemo"; \
	Remove-Item /deployment.ps1

#------------------------------------------------------------------------------
# Run IIS, wrapped by LogMonitor.
#------------------------------------------------------------------------------

ENTRYPOINT ["C:\\LogMonitor\\LogMonitor.exe", "C:\\ServiceMonitor.exe", "w3svc"]

עכשיו יוצרים צינור חדש שמשתמש בתחביר YAML:

  1. באמצעות Visual Studio או לקוח git של שורת פקודה, משכפלים את ה-repository החדש של Git ומבצעים checkout של הענף main.
  2. בשורש המאגר, יוצרים קובץ בשם azure-pipelines.yml.
  3. מעתיקים את הקוד הבא לקובץ:

    ‎.NET/Linux

    resources:
    - repo: self
      fetchDepth: 1
    pool:
      vmImage: ubuntu-20.04
    trigger:
    - main
    variables:
      TargetFramework: 'net6.0'
      BuildConfiguration: 'Release'
      DockerImageName: 'PROJECT_ID/clouddemo'
    steps:
    - task: DotNetCoreCLI@2
      displayName: Publish
      inputs:
        projects: 'applications/clouddemo/netcore/CloudDemo.MvcCore.sln'
        publishWebProjects: false
        command: publish
        arguments: '--configuration $(BuildConfiguration) --framework=$(TargetFramework)'
        zipAfterPublish: false
        modifyOutputPath: false
    - task: CmdLine@1
      displayName: 'Lock image version in deployment.yaml'
      inputs:
        filename: /bin/bash
        arguments: '-c "awk ''{gsub(\"CLOUDDEMO_IMAGE\", \"gcr.io/$(DockerImageName):$(Build.BuildId)\", $0); print}'' applications/clouddemo/netcore/deployment.yaml > $(build.artifactstagingdirectory)/deployment.yaml"'
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact'
      inputs:
        PathtoPublish: '$(build.artifactstagingdirectory)'
    - task: Docker@2
      displayName: 'Login to Artifact Registry'
      inputs:
        command: login
        containerRegistry: 'gcr-tutorial'
    - task: Docker@2
      displayName: 'Build and push image'
      inputs:
        Dockerfile: 'applications/clouddemo/netcore/Dockerfile'
        command: buildAndPush
        repository: '$(DockerImageName)'

    ‫‎.NET Framework/Windows

    resources:
    - repo: self
      fetchDepth: 1
    pool:
      vmImage: windows-2019     # Matches WINDOWS_LTSC in GKE
      demands:
      - msbuild
      - visualstudio
    trigger:
    - master
    variables:
      Solution: 'applications/clouddemo/net4/CloudDemo.Mvc.sln'
      BuildPlatform: 'Any CPU'
      BuildConfiguration: 'Release'
      DockerImageName: 'PROJECT_ID/clouddemo'
    steps:
    - task: NuGetCommand@2
      displayName: 'NuGet restore'
      inputs:
        restoreSolution: '$(Solution)'
    - task: VSBuild@1
      displayName: 'Build solution'
      inputs:
        solution: '$(Solution)'
        msbuildArgs: '/p:DeployOnBuild=true /p:PublishProfile=FolderProfile'
        platform: '$(BuildPlatform)'
        configuration: '$(BuildConfiguration)'
    - task: PowerShell@2
      displayName: 'Lock image version in deployment.yaml'
      inputs:
        targetType: 'inline'
        script: '(Get-Content applications\clouddemo\net4\deployment.yaml) -replace "CLOUDDEMO_IMAGE","gcr.io/$(DockerImageName):$(Build.BuildId)" | Out-File -Encoding ASCII $(build.artifactstagingdirectory)\deployment.yaml'
    - task: PublishBuildArtifacts@1
      displayName: 'Publish Artifact'
      inputs:
        PathtoPublish: '$(build.artifactstagingdirectory)'
    - task: Docker@2
      displayName: 'Login to Artifact Registry'
      inputs:
        command: login
        containerRegistry: 'gcr-tutorial'
    - task: Docker@2
      displayName: 'Build and push image'
      inputs:
        Dockerfile: 'applications/clouddemo/net4/Dockerfile'
        command: buildAndPush
        repository: '$(DockerImageName)'

    מחליפים את PROJECT_ID בשם הפרויקט ושומרים את הקובץ.

  4. שומרים את השינויים ודוחפים אותם אל Azure Pipelines.

    Visual Studio

    1. פותחים את Team Explorer ולוחצים על סמל דף הבית.
    2. לוחצים על שינויים.
    3. מזינים הודעת קומיט כמו Add pipeline definition.
    4. לוחצים על Commit All and Push (ביצוע Commit של הכול והעלאה).

    שורת הפקודה

    1. העברת כל הקבצים ששונו אל אזור ההכנה:

      git add -A
      
    2. שומרים את השינויים במאגר המקומי:

      git commit -m "Add pipeline definition"
      
    3. שולחים את השינויים ל-Azure DevOps:

      git push
      
  5. בתפריט Azure DevOps, בוחרים באפשרות Pipelines ואז לוחצים על Create Pipeline.

  6. בוחרים באפשרות Azure Repos Git.

  7. בוחרים את המאגר.

  8. בדף Review your pipeline YAML (בדיקת קובץ ה-YAML של צינור הנתונים), לוחצים על Run (הפעלה).

    מופעלת בנייה חדשה. יכול להיות שיחלפו כ-6 דקות עד שהגרסה תהיה מוכנה.

  9. כדי לוודא שהתמונה פורסמה ב-Container Registry, עוברים לפרויקט במסוף Google Cloud , בוחרים באפשרות Container Registry > Images ואז לוחצים על clouddemo.

    מוצגת תמונה אחת והתג שלה. התג תואם למזהה המספרי של ה-Build שהופעל ב-Azure Pipelines.

פריסה רציפה

מערכת Azure Pipelines בונה את הקוד שלכם באופן אוטומטי ומפרסמת תמונות Docker לכל פעולת commit, כך שאתם יכולים להתפנות לפריסה.

בניגוד למערכות אחרות של אינטגרציה רציפה (CI), ב-Azure Pipelines יש הבחנה בין בנייה לפריסה, והיא מספקת קבוצה מיוחדת של כלים שנקראת Release Management לכל המשימות שקשורות לפריסה.

הכלי Azure Pipelines Release Management מבוסס על המושגים הבאים:

  • גרסה היא קבוצה של פריטי מידע שמרכיבים גרסה ספציפית של האפליקציה, ובדרך כלל הם תוצאה של תהליך בנייה.
  • פריסה היא התהליך של לקיחת גרסה ופריסתה בסביבה ספציפית.
  • פריסה מבצעת קבוצה של משימות, שאפשר לקבץ אותן בעבודות.
  • שלבים מאפשרים לפלח את צינור הנתונים, ואפשר להשתמש בהם כדי לתזמן פריסות בסביבות שונות – למשל, סביבות פיתוח ובדיקה.

הארטיפקט העיקרי שנוצר בתהליך build של CloudDemo הוא קובץ האימג' של Docker. עם זאת, מכיוון שקובץ האימג' של Docker מתפרסם ב-Container Registry, הוא לא נכלל בהיקף של Azure Pipelines. לכן התמונה לא מתאימה להגדרת פריט תוכן.

כדי לבצע פריסה ב-Kubernetes, צריך גם מניפסט, שדומה לרשימת חומרים. קובץ המניפסט לא רק מגדיר את המשאבים ש-Kubernetes אמורה ליצור ולנהל, אלא גם מציין את הגרסה המדויקת של קובץ אימג' של Docker שבה צריך להשתמש. מניפסט Kubernetes מתאים מאוד לשמש כארטיפקט שמגדיר את הגרסה ב-Azure Pipelines Release Management.

הגדרת הפריסה של Kubernetes

כדי להפעיל את CloudDemo ב-Kubernetes, אתם צריכים את המשאבים הבאים:

  • פריסה שמגדירה פוד יחיד שמריץ את קובץ האימג' של Docker שנוצר על ידי ה-build.
  • שירות NodePort שמאפשר למאזן עומסים לגשת ל-Pod.
  • Ingress שחושף את האפליקציה לאינטרנט הציבורי באמצעות מאזן עומסים מסוג Cloud HTTP(S).

המאגר כבר מכיל את מניפסט Kubernetes הבא שמגדיר את המשאבים האלה:

‎.NET/Linux

#
# Copyright 2020 Google LLC
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

apiVersion: v1
kind: Service
metadata:
  name: clouddemo-netcore
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: clouddemo-netcore
  type: NodePort

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: clouddemo-netcore
spec:
  defaultBackend:
    service:
      name: clouddemo-netcore
      port:
        number: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: clouddemo-netcore
spec:
  replicas: 2
  selector:
    matchLabels:
      app: clouddemo-netcore
  template:
    metadata:
      labels:
        app: clouddemo-netcore
    spec:
      containers:
      - name: clouddemo-netcore
        image: CLOUDDEMO_IMAGE
        ports:
          - containerPort: 8080
        livenessProbe:      # Used by deployment controller
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
        readinessProbe:     # Used by Ingress/GCLB
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 3
          periodSeconds: 5
        resources:
          limits:
            memory: 1024Mi
          requests:
            memory: 256Mi

‫‎.NET Framework/Windows

#
# Copyright 2020 Google LLC
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

apiVersion: v1
kind: Service
metadata:
  name: clouddemo-net4
  annotations:
    cloud.google.com/neg: '{"ingress": false}' # Disable NEG

spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: clouddemo-net4
  type: NodePort

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: clouddemo-net4
spec:
  defaultBackend:
    service:
      name: clouddemo-net4
      port:
        number: 80

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: clouddemo-net4
spec:
  replicas: 2
  selector:
    matchLabels:
      app: clouddemo-net4
  template:
    metadata:
      labels:
        app: clouddemo-net4
    spec:
      nodeSelector:
        kubernetes.io/os: windows
      containers:
      - name: clouddemo-net4
        image: CLOUDDEMO_IMAGE
        ports:
          - containerPort: 80
        livenessProbe:      # Used by deployment controller
          httpGet:
            path: /health
            port: 80
          initialDelaySeconds: 120
          periodSeconds: 5
        readinessProbe:     # Used by Ingress/GCLB
          httpGet:
            path: /health
            port: 80
          initialDelaySeconds: 10
          periodSeconds: 5
        resources:
          limits:
            memory: 1024Mi
          requests:
            memory: 256Mi

הגדרת סביבות הפיתוח והייצור

לפני שחוזרים אל Azure Pipelines Release Management, צריך ליצור את אשכולות GKE.

יצירת אשכולות GKE

  1. חוזרים למופע Cloud Shell.

  2. מפעילים את GKE API בפרויקט:

    gcloud services enable container.googleapis.com
  3. יוצרים את אשכול הפיתוח באמצעות הפקודה הבאה. שימו לב: יכול להיות שיעברו כמה דקות עד שהתהליך יסתיים:

    ‎.NET/Linux

    gcloud container clusters create azure-pipelines-cicd-dev --enable-ip-alias
    

    ‫‎.NET Framework/Windows

    gcloud container clusters create azure-pipelines-cicd-dev --enable-ip-alias
    
    gcloud container node-pools create azure-pipelines-cicd-dev-win \
        --cluster=azure-pipelines-cicd-dev \
        --image-type=WINDOWS_LTSC \
        --no-enable-autoupgrade \
        --machine-type=n1-standard-2
    
  4. יוצרים את אשכול הייצור באמצעות הפקודה הבאה. הערה: יכול להיות שהתהליך יימשך כמה דקות:

    ‎.NET/Linux

    gcloud container clusters create azure-pipelines-cicd-prod --enable-ip-alias
    

    ‫‎.NET Framework/Windows

    gcloud container clusters create azure-pipelines-cicd-prod --enable-ip-alias
    
    gcloud container node-pools create azure-pipelines-cicd-prod-win \
        --cluster=azure-pipelines-cicd-prod \
        --image-type=WINDOWS_LTSC \
        --no-enable-autoupgrade \
        --machine-type=n1-standard-2
    

חיבור Azure Pipelines לאשכול הפיתוח

בדומה לשימוש ב-Azure Pipelines כדי להתחבר למאגר Docker חיצוני כמו Container Registry, ‏ Azure Pipelines תומך בשילוב של אשכולות Kubernetes חיצוניים.

אפשר לבצע אימות ב-Container Registry באמצעותGoogle Cloud חשבון שירות, אבל השימוש בחשבונות שירות Google Cloud לא נתמך ב-Azure Pipelines לצורך אימות ב-GKE. במקום זאת, צריך להשתמש בחשבון שירות ב-Kubernetes.

לכן, כדי לחבר את Azure Pipelines לאשכול הפיתוח, צריך קודם ליצור חשבון שירות של Kubernetes.

  1. ב-Cloud Shell, מתחברים לאשכול הפיתוח:

    gcloud container clusters get-credentials azure-pipelines-cicd-dev
  2. יוצרים חשבון שירות ב-Kubernetes עבור Azure Pipelines:

    kubectl create serviceaccount azure-pipelines-deploy
  3. יוצרים סוד ב-Kubernetes שמכיל פרטי כניסה לאסימון עבור Azure Pipelines:

    kubectl create secret generic azure-pipelines-deploy-token --type=kubernetes.io/service-account-token --dry-run -o yaml \
      | kubectl annotate --local -o yaml -f - kubernetes.io/service-account.name=azure-pipelines-deploy \
      | kubectl apply -f -
    
  4. מקצים את התפקיד cluster-admin לחשבון השירות על ידי יצירת קישור תפקיד ברמת האשכול:

    kubectl create clusterrolebinding azure-pipelines-deploy --clusterrole=cluster-admin --serviceaccount=default:azure-pipelines-deploy
  5. קובעים את כתובת ה-IP של האשכול:

    gcloud container clusters describe azure-pipelines-cicd-dev --format=value\(endpoint\)
    

    תצטרכו את הכתובת הזו בהמשך.

  6. בתפריט Azure DevOps, בוחרים באפשרות Project settings (הגדרות הפרויקט) ואז באפשרות Pipelines (צינורות) > Service connections (חיבורי שירות).

  7. לוחצים על New service connection (חיבור שירות חדש).

  8. בוחרים באפשרות Kubernetes ולוחצים על הבא.

  9. מגדירים את ההגדרות הבאות.

    • שיטת אימות: חשבון שירות.
    • כתובת ה-URL של השרת: https://PRIMARY_IP. מחליפים את PRIMARY_IP בכתובת ה-IP שקבעתם קודם.
    • Secret: הסוד של Kubernetes שיצרתם קודם. כדי לקבל את הסוד, מריצים את הפקודה הבאה, מעתיקים את הסוד ומעתיקים אותו לדף Azure.
      kubectl get secret azure-pipelines-deploy-token -o yaml
    • שם חיבור השירות: azure-pipelines-cicd-dev.
  10. לוחצים על Save.

חיבור Azure Pipelines לאשכול הייצור

כדי לחבר את Azure Pipelines לאשכול הייצור, אפשר לפעול באותו אופן.

  1. ב-Cloud Shell, מתחברים לאשכול הייצור:

    gcloud container clusters get-credentials azure-pipelines-cicd-prod
  2. יוצרים חשבון שירות ב-Kubernetes עבור Azure Pipelines:

    kubectl create serviceaccount azure-pipelines-deploy
  3. מקצים את התפקיד cluster-admin לחשבון השירות על ידי יצירת קישור תפקיד ברמת האשכול:

    kubectl create clusterrolebinding azure-pipelines-deploy --clusterrole=cluster-admin --serviceaccount=default:azure-pipelines-deploy
  4. קובעים את כתובת ה-IP של האשכול:

    gcloud container clusters describe azure-pipelines-cicd-prod --format=value\(endpoint\)
    

    תצטרכו את הכתובת הזו בהמשך.

  5. בתפריט Azure DevOps, בוחרים באפשרות Project settings (הגדרות הפרויקט) ואז באפשרות Pipelines (צינורות) > Service connections (חיבורי שירות).

  6. לוחצים על New service connection (חיבור שירות חדש).

  7. בוחרים באפשרות Kubernetes ולוחצים על הבא.

  8. מגדירים את ההגדרות הבאות:

    • שיטת אימות: חשבון שירות.
    • כתובת ה-URL של השרת: https://PRIMARY_IP. מחליפים את PRIMARY_IP בכתובת ה-IP שקבעתם קודם.
    • סוד: מריצים את הפקודה הבאה ב-Cloud Shell ומעתיקים את הפלט:
      kubectl get secret $(kubectl get serviceaccounts azure-pipelines-deploy -o custom-columns=":secrets[0].name") -o yaml
    • שם חיבור השירות: azure-pipelines-cicd-prod.
  9. לוחצים על Save.

הגדרת צינור עיבוד הנתונים להפצה

אחרי שמגדירים את התשתית של GKE, חוזרים אל Azure Pipelines כדי להפוך את הפריסה לאוטומטית, כולל הפעולות הבאות:

  • פריסה בסביבת הפיתוח.
  • בקשת אישור ידני לפני הפעלת פריסה בסביבת הייצור.
  • פריסה בסביבת הייצור.

יצירת הגדרת גרסה

קודם כל, צריך ליצור הגדרה חדשה של גרסה.

  1. בתפריט Azure DevOps, בוחרים באפשרות Pipelines (צינורות) > Releases (גרסאות).
  2. לוחצים על New pipeline (צינור חדש).
  3. ברשימת התבניות, בוחרים באפשרות Empty job (משימה ריקה).
  4. כשמתבקשים להזין שם לשלב, מזינים Development.
  5. בחלק העליון של המסך, נותנים שם למהדורה CloudDemo-KubernetesEngine.
  6. בתרשים של צינור הנתונים, לצד Artifacts (פריטי מידע), לוחצים על Add (הוספה).
  7. לוחצים על Build (בנייה) ומוסיפים את ההגדרות הבאות:

    • סוג המקור: Build
    • מקור (צינור עיבוד נתונים לבנייה): בוחרים את הגדרת הבנייה (אמורה להיות רק אפשרות אחת)
    • גרסת ברירת מחדל: Latest
    • כינוי המקור: manifest
  8. לוחצים על הוספה.

  9. בתיבה Artifact (ארטיפקט), לוחצים על Continuous deployment trigger (הסמל של חץ ברק) כדי להוסיף טריגר לפריסה.

  10. בקטע Continuous deployment trigger (טריגר לפריסה רציפה), מעבירים את המתג למצב Enabled (מופעל).

  11. לוחצים על Save.

  12. אם רוצים, כותבים תגובה ומאשרים בלחיצה על אישור.

    צינור העיבוד ייראה כך:

    צילום מסך של צינור העיבוד המעודכן ב-Azure Pipelines

פריסה באשכול הפיתוח

אחרי שיוצרים את הגדרת הפריסה, אפשר להגדיר את הפריסה לאשכול הפיתוח של GKE.

  1. בתפריט, עוברים לכרטיסייה משימות.
  2. לוחצים על Agent job ומגדירים את ההגדרות הבאות:

    • מאגר סוכנים: Azure Pipelines
    • Agent specification: ubuntu-18.04
  3. לצד Agent job, לוחצים על Add a task to agent job כדי להוסיף שלב לשלב.

  4. בוחרים את המשימה Deploy to Kubernetes (פריסה ב-Kubernetes) ולוחצים על Add (הוספה).

  5. לוחצים על המשימה שנוספה ומגדירים את ההגדרות הבאות:

    • שם לתצוגה: Deploy
    • פעולה: פריסה
    • חיבור לשירות Kubernetes: azure-pipelines-cicd-dev
    • Namespace: default
    • שיטת הבידינג: ללא
    • קובצי מניפסט: manifest/drop/deployment.yaml
  6. לוחצים על Save.

  7. אם רוצים, כותבים תגובה ומאשרים בלחיצה על אישור.

פריסה באשכול הייצור

לבסוף, מגדירים את הפריסה באשכול הייצור של GKE.

  1. בתפריט, עוברים לכרטיסייה Pipeline.
  2. בתיבה 'שלבים', בוחרים באפשרות הוספה > שלב חדש.
  3. ברשימת התבניות, בוחרים באפשרות Empty job (משימה ריקה).
  4. כשמתבקשים להזין שם לשלב, מזינים Production.
  5. לוחצים על סמל הברק של השלב החדש שנוצר.
  6. מגדירים את ההגדרות הבאות:

    • Select trigger (בחירת טריגר): After stage (אחרי שלב)
    • שלבים: פיתוח
    • אישורים לפני פריסה: (מופעל)
    • גורמים מאשרים: בוחרים את שם המשתמש שלכם.

    עכשיו צינור המכירות נראה כך:

    צילום מסך של צינור העיבוד המעודכן ב-Azure Pipelines

  7. עוברים לכרטיסייה משימות.

  8. מעבירים את העכבר מעל הכרטיסייה משימות ובוחרים באפשרות משימות > הפקה.

  9. לוחצים על Agent job ומגדירים את ההגדרות הבאות:

    • מאגר סוכנים: Azure Pipelines
    • Agent specification: ubuntu-18.04
  10. לוחצים על הוספת משימה לעבודת הסוכן כדי להוסיף שלב לשלב.

  11. בוחרים את המשימה Deploy to Kubernetes (פריסה ב-Kubernetes) ולוחצים על Add (הוספה).

  12. לוחצים על המשימה שנוספה ומגדירים את ההגדרות הבאות:

    • שם לתצוגה: Deploy
    • פעולה: פריסה
    • חיבור שירות Kubernetes: azure-pipelines-cicd-prod
    • Namespace: default
    • שיטת הבידינג: ללא
    • קובצי מניפסט: manifest/drop/deployment.yaml
  13. לוחצים על Save.

  14. אם רוצים, כותבים תגובה ומאשרים בלחיצה על אישור.

הרצת צינור עיבוד הנתונים

אחרי שהגדרתם את כל צינור העיבוד, אתם יכולים לבדוק אותו על ידי ביצוע שינוי בקוד המקור:

  1. במחשב המקומי, פותחים את הקובץ Index.cshtml ממאגר Git ששיבטתם קודם:

    ‎.NET/Linux

    הקובץ נמצא במיקום applications\clouddemo\netcore\CloudDemo.MvcCore\Views\Home\

    ‫‎.NET Framework/Windows

    הקובץ נמצא במיקום applications\clouddemo\net4\CloudDemo.Mvc\Views\Home\

  2. בשורה 26, משנים את הערך של ViewBag.Title מ-Home Page ל-This app runs on GKE.

  3. שומרים את השינויים ודוחפים אותם אל Azure Pipelines.

    Visual Studio

    1. פותחים את Team Explorer ולוחצים על סמל דף הבית.
    2. לוחצים על שינויים.
    3. מזינים הודעת קומיט כמו Change site title.
    4. לוחצים על Commit All and Push (ביצוע Commit של הכול והעלאה).

    שורת הפקודה

    1. העברת כל הקבצים ששונו אל אזור ההכנה:

      git add -A
      
    2. שומרים את השינויים במאגר המקומי:

      git commit -m "Change site title"
      
    3. שליחת השינויים אל Azure Pipelines:

      git push
      
  4. בתפריט Azure DevOps, בוחרים באפשרות Pipelines (צינורות). מופעל build.

  5. אחרי שהבנייה מסתיימת, בוחרים באפשרות Pipelines (צינורות) > Releases (גרסאות). A מתחיל תהליך פרסום.

  6. לוחצים על Release-1 כדי לפתוח את דף הפרטים, ומחכים שהסטטוס של שלב הפיתוח ישתנה להצלחה.

  7. במסוף Google Cloud , בוחרים באפשרות Kubernetes Engine > Services & Ingress > Ingress.

  8. מחפשים את שירות הכניסה (Ingress) של אשכול azure-pipelines-cicd-dev ומחכים שהסטטוס שלו ישתנה לOk. הפעולה עשויה להימשך כמה דקות.

  9. פותחים את הקישור בעמודה Frontends באותה שורה. יכול להיות שתופיע שגיאה בהתחלה, כי לוקח כמה דקות עד שמאזן העומסים הופך לזמין. כשהוא מוכן, אפשר לראות ש-CloudDemo נפרס ומשתמש בכותרת המותאמת אישית.

  10. ב-Azure Pipelines, לוחצים על הלחצן Approve (אישור) שנמצא מתחת לשלב Prod (ייצור) כדי להעביר את הפריסה לסביבת הייצור.

    אם הלחצן לא מופיע, יכול להיות שצריך קודם לאשר או לדחות גרסה קודמת.

  11. אם רוצים, כותבים תגובה ואז לוחצים על אישור.

  12. מחכים שהסטטוס של סביבת הייצור ישתנה להצלחה. יכול להיות שתצטרכו לרענן את הדף בדפדפן באופן ידני.

  13. במסוף Google Cloud , מרעננים את הדף Services & Ingress.

  14. מחפשים את שירות ה-Ingress של אשכול azure-pipelines-cicd-prod ומחכים שהסטטוס שלו ישתנה לOk. הפעולה עשויה להימשך כמה דקות.

  15. פותחים את הקישור בעמודה Frontends באותה שורה. שוב, יכול להיות שתראו שגיאה בהתחלה כי לוקח כמה דקות עד שמאזן העומסים יהיה זמין. כשהיא מוכנה, אפליקציית CloudDemo מופיעה שוב עם הכותרת המותאמת אישית, והפעם היא פועלת באשכול הייצור.

הסרת המשאבים

כדי להימנע מחיובים נוספים אחרי שתסיימו את המדריך הזה, מומלץ למחוק את הישויות שיצרתם.

מחיקת הפרויקט ב-Azure Pipelines

כדי למחוק את פרויקט Azure Pipelines, אפשר לעיין במסמכי Azure DevOps Services. מחיקת הפרויקט ב-Azure Pipelines תגרום לאובדן של כל השינויים בקוד המקור.

מחיקת הפיתוח והפרויקטים Google Cloud

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

המאמרים הבאים