607 字
3 分鐘
Azure DevOps 部署到 GKE (9) — php 部署範例
本篇將說明如何將一個跑在docker-compose的php專案,部署到GKE上。
程式碼範例
我這裡有php slim的範例,其中docker compose長這樣
version: "3.9"services: slim: build: ./slim ports: - "80:80"slim資料夾內的Dockerfile是這樣的,會先把composer需要的套件安裝起來,並打包成image
FROM composer as builderWORKDIR /app/COPY composer.* ./RUN composer install
FROM php:8.2-apacheCOPY . /var/www/COPY --from=builder /app/vendor /var/www/vendorRUN 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,步驟為:
- 載入剛剛上傳的三個 Secure File
- 使用 GCP secret登入gcloud,並取得docker push權限
- 將docker進行打包與上傳
- 安裝kubectl用的相關套件
- 用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 K8skubernetes.yml則是這樣,透過envsubst將參數放入
apiVersion: apps/v1kind: Deploymentmetadata: name: deployment-slimspec: replicas: 1 selector: matchLabels: app: pod-slim template: metadata: labels: app: pod-slim spec: containers: - name: slim image: $image:$tag ports: - containerPort: 80
---apiVersion: v1kind: Servicemetadata: name: service-slimspec: type: ClusterIP ports: - port: 80 protocol: TCP targetPort: 80 selector: app: pod-slim
---apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: ingress-slimspec: 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流程整合進去。