607 字
3 分鐘
Azure DevOps 部署到 GKE (9) — php 部署範例
2023-03-27
無標籤

本篇將說明如何將一個跑在docker-compose的php專案,部署到GKE上。


程式碼範例#

我這裡有php slim的範例,其中docker compose長這樣

version: "3.9"
services:
slim:
build: ./slim
ports:
- "80:80"

slim資料夾內的Dockerfile是這樣的,會先把composer需要的套件安裝起來,並打包成image

Terminal window
FROM composer as builder
WORKDIR /app/
COPY composer.* ./
RUN composer install
FROM php:8.2-apache
COPY . /var/www/
COPY --from=builder /app/vendor /var/www/vendor
RUN rm -rf /var/www/html && ln -s /var/www/public /var/www/html

這個範例比較單純,沒有使用資料庫、volume、environment variable,之後可以再舉例比較複雜的案例。


Azure Pipelines Library#

這個範例我們來練習使用自己的SSL憑證,而非Google提供的憑證,因此除了上傳GCP的secret外,還要上傳SSL的公鑰與私鑰,如下圖。


Azure pipelines#

接下來看一下azure-pipelines.yml,步驟為:

  1. 載入剛剛上傳的三個 Secure File
  2. 使用 GCP secret登入gcloud,並取得docker push權限
  3. 將docker進行打包與上傳
  4. 安裝kubectl用的相關套件
  5. 用kubectl產生secret包含SSL公鑰與私鑰,再部署kubernetes.yml
trigger:
- main
resources:
- repo: self
variables:
image: 'asia-east1-docker.pkg.dev/it-production-377006/nginx/slim'
tag: '$(Build.BuildNumber)'
domain: 'slim.twcanhelp.me'
stages:
- stage: Build
displayName: Build image
jobs:
- job: Build
displayName: Build
pool:
vmImage: ubuntu-latest
steps:
- task: DownloadSecureFile@1
name: GCPsecret
displayName: 'Download GCP secret'
inputs:
secureFile: 'gcp.json'
- task: DownloadSecureFile@1
name: SSLcert
displayName: 'Download ssl cert'
inputs:
secureFile: 'cert.pem'
- task: DownloadSecureFile@1
name: SSLkey
displayName: 'Download ssl key'
inputs:
secureFile: 'cert.key'
- script: |
gcloud auth login --cred-file $(GCPsecret.secureFilePath)
gcloud auth configure-docker --quiet asia-east1-docker.pkg.dev
displayName: Gcloud login & Get docker token
- task: Docker@2
displayName: Build & Push image
inputs:
command: buildAndPush
dockerfile: '$(Build.SourcesDirectory)/slim/Dockerfile'
repository: $(image)
tags: |
$(tag)
- script: |
echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | sudo tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
sudo apt-get update && sudo apt-get install -y google-cloud-sdk-gke-gcloud-auth-plugin
gcloud container clusters get-credentials autopilot-cluster-1 --region asia-east1 --project it-production-377006
displayName: Install dependency packages # https://cloud.google.com/blog/products/containers-kubernetes/kubectl-auth-changes-in-gke
- script: |
export image=$(image)
export tag=$(tag)
export domain=$(domain)
kubectl create secret tls cert-slim --cert=$(SSLcert.secureFilePath) --key=$(SSLkey.secureFilePath) \
--dry-run=client -o yaml | kubectl apply -f -
envsubst < kubernetes.yml | kubectl apply -f -
displayName: Deploy to K8s

kubernetes.yml則是這樣,透過envsubst將參數放入

apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-slim
spec:
replicas: 1
selector:
matchLabels:
app: pod-slim
template:
metadata:
labels:
app: pod-slim
spec:
containers:
- name: slim
image: $image:$tag
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: service-slim
spec:
type: ClusterIP
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: pod-slim
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-slim
spec:
tls:
- secretName: cert-slim
rules:
- host: $domain
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-slim
port:
number: 80

上DNS#

再來到GCP後台等待ingress IP出現把他加到dns就完成了


結語#

這次DevOps展示了自動打包php為image,並部署為K8s,另外SSL憑證也可以透過DevOps流程整合進去。