DevOps CI/CD with GitLab

架構

模擬情形

3個repository

Kubernetes 內部溝通拓樸

topology_kubernetes

裝置網路

Name Private IP Public IP
controller(DE) 192.168.2.10 45.146.254.130
worker1(DE) 192.168.2.11 None
worker2(DE) 192.168.2.12 None
jp2(JP) 10.0.0.159 151.145.70.150

其他相關伺服器

Kubernets 裝機

規格介紹

Name CPU Memery(GB) Storage(GB)
controller(DE) 2 6 32
worker1(DE) 8 8 100
worker2(DE) 4 4 100
jp2(JP) 1 1 100

套件介紹


裝機步驟

1. 安裝kubectl, kubelet, kubeadm

# 取得最新套件網址 sudo apt-get update # 安裝所需套件 sudo apt-get install -y apt-transport-https ca-certificates curl gnupg # 下載套件管理員的金鑰 curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg # 修改金鑰權限 sudo chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg # 建立套件清單 echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list # 修改套件清單權限 sudo chmod 644 /etc/apt/sources.list.d/kubernetes.list # 取得最新套件網址(已新增kubernetes的) sudo apt-get update # 安裝kubernetes服務 sudo apt-get install -y kubectl kubelet kubeadm # zsh的指令自動完成設定(選用) source <(kubectl completion zsh)

2. 安裝minikube

# 下載minikube的deb套件安裝檔 curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb # 安裝minikube套件 sudo dpkg -i minikube_latest_amd64.deb

3. 安裝cri-o

# 下載套件管理員的金鑰 curl -fsSL https://pkgs.k8s.io/addons:/cri-o:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg # 建立套件清單 echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://pkgs.k8s.io/addons:/cri-o:/stable:/v1.31/deb/ /" | sudo tee /etc/apt/sources.list.d/cri-o.list # 取得最新套件網址(已新增CRI-O的) sudo apt-get update # 安裝CRI-O sudo apt-get install -y cri-o

4. 建立叢集

在Controller的機器上執行以建立叢集
[在controller上執行]

# 將套件啟用 sudo systemctl enable crio --now sudo systemctl enable kubelet --now # 啟用IP轉發功能(IP Forwarding) sudo sysctl -w net.ipv4.ip_forward=1 echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf # 初始化叢集控制台 sudo kubeadm init --control-plane-endpoint "45.146.254.130:6443" --pod-network-cidr=10.244.0.0/16 # 允許非root使用者管理叢集 mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

Kubernetes初始化-1
Kubernetes初始化-2
Kubernetes初始化-3

5. 加入叢集

在worker上執行以加入叢集
DE的兩台worker: 使用Private IP加入叢集

sudo kubeadm join 192.168.2.10:6443 --token {token} --discovery-token-ca-cert-hash {sha256}

Kubernetes加入叢集-worker1
Kubernetes加入叢集-worker2

JP的worker: 使用Public IP加入叢集

sudo kubeadm join 45.146.254.130:6443 --token {token} --discovery-token-ca-cert-hash sha256:{sha256}

Kubernetes加入叢集-jp

6. 驗證安裝狀態

[在controller上執行]

kubectl get nodes

驗證節點狀態

7. 標記worker

由於這次的Demo需要分成de組(worker1和worker2)和jp組(jp2),因此需要執行標記指令
[在controller上執行]

kubectl label nodes worker1 location=de kubectl label nodes worker2 location=de kubectl label nodes jp2 location=jp

標記節點

8. 安裝MetalLB

由於本次專案jp節點並不需要負載平衡,因此必須修改官方的安裝檔
[在controller上執行]

# 下載原始安裝檔 wget https://raw.githubusercontent.com/metallb/metallb/v0.14.8/config/manifests/metallb-native.yaml # 修改speaker段使得只有DE worker才會安裝 # 安裝MetalLB kubectl apply -f metallb-native.yaml # 套用MetalLB設定檔 kubectl apply -f metallb-config.yaml #標記安裝metallb-speaker的node kubectl label nodes worker1 metallb-speaker=true kubectl label nodes worker2 metallb-speaker=true

MetalLB標記節點
安裝MetalLB

[metallb-config.yaml]

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
        - 193.23.126.13/32

這個檔案設定193.23.126.13作為負載平衡的IP

9. 安裝Calico

直接透過官方安裝檔安裝即可,不用額外設定
[在controller上執行]

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

安裝Calico

Kubernets與GitLab連結設定

由於稍後我們要利用GitLab部署到k8s,我們需要創造三個變數

產生連線帳號

  1. 建立一個名為 gitlab-deployer 的 Service Account
  2. [在controller上執行]
kubectl create serviceaccount gitlab-deployer -n kube-system
  1. 為這個 Service Account 賦予 cluster-admin 權限
    [在controller上執行]
kubectl create clusterrolebinding gitlab-deployer-binding --clusterrole=cluster-admin --serviceaccount=kube-system:gitlab-deployer

建立Kubernetes服務帳號
3.生成 token [KUBERNETES_TOKEN]

#(這個永久token在新版已經被拒絕發行了,請用下面的指令)
#kubectl -n kube-system create token gitlab-deployer --duration=0s

[在controller上執行]

kubectl -n kube-system create token gitlab-deployer --duration=8760h

產生Kubernetes服務帳號token
4. 取得 CA 憑證並將編碼成 base64 [KUBERNETES_CA_CERT]
[在controller上執行]

cat /etc/kubernetes/pki/ca.crt | base64 | tr -d '\n'

顯示Kubernetes自簽憑證
5. 檢查聆聽的port確認k8s api在6443監聽
[在controller上執行]

sudo lsof -iTCP -sTCP:LISTEN

驗證服務聆聽狀態
6. 將變數加入GitLab CI/CD Varables
記得使用Masked and hidden保護變數
測試Kubernetes連線API
7. (option) 測試是否可以成功連線(.gitlab-ci.yml)

test_k8s_access: stage: test image: name: bitnami/kubectl:latest entrypoint: [""] script: - echo $KUBERNETES_CA_CERT | base64 -d > ca.crt - kubectl config set-cluster k8s-cluster --server=$KUBERNETES_API_URL --certificate-authority=ca.crt - kubectl config set-credentials deployer --token=$KUBERNETES_TOKEN - kubectl config set-context k8s-context --cluster=k8s-cluster --user=deployer - kubectl config use-context k8s-context - kubectl get nodes # 測試訪問權限

圖片
上方這個結果就是成功透過API連線並顯示出了所有節點

專案部署

Android APP

部署流程: 當程式被PM merge到master branch時,程式碼被送到雲端進行unit test,通過後cloud build並直接簽章,最後再透過Google API將程式版本、說明、截圖等資料上傳到Google Play Store進行審核發布

設定 Play Console API

  1. 前往GCP啟用Google Play Android Developer API
    啟用Play Console API
  2. 前往IAM & Admin的Service Account選單點選"創建服務帳號"
    Play Console API創建服務帳號
  3. 將資料填寫完畢且服務帳號的Email複製起來,選擇"完成"
    Play Console API儲存相關資訊
  4. 在創建的帳號右側點選"行為"選單的三個點點,接著按一下"管理金鑰"
    Play Console API管理金鑰
  5. 選擇左下方的"新增金鑰",接著選擇"建立新的金鑰"
    Play Console API建立金鑰-1
  6. 我們選擇簡易的JSON的金鑰,選擇"建立"
    Play Console API建立金鑰-2
  7. 點擊後會開始下載,請將金鑰(私鑰)存在安全的地方
    Play Console API保存私鑰

綁訂到 Play Console

  1. 前往Play Console並選擇您的開發人員帳戶
    Play Console登入
  2. 選擇使用者和權限
    Play Console使用者設定頁面
  3. 選擇"邀請新的使用者"
    Play Console邀請使用者
  4. 填寫剛剛複製的帳號Email、勾選適當的權限(例如管理員)、選擇"邀請使用者"並"傳送邀請"
    Play Console設定使用者
    Play Console使用者邀請

自動部署工具–Fastlane

fastlane is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.

  1. 在需要執行Fastlane的裝置準備 Ruby
sudo apt-get install ruby-full
  1. 安裝 Fastlane
gem install fastlane
  1. 測試是否可以透過剛才產生的金鑰連線到Google Play Console
fastlane run validate_play_store_json_key json_key:/path/key.json
  1. 專案初始化
fastlane init

創建用來編譯的Docker

[在GitLab Runner上執行]
準備編譯用的Docker環境

docker build -t android-build .

[Dockerfile]

FROM gradle:7.5-jdk17 ENV ANDROID_SDK_ROOT /sdk ENV PATH $PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin ENV PATH $PATH:$ANDROID_SDK_ROOT/platform-tools # 安裝編譯Fastlane所需的編譯工具 RUN apt-get update && apt-get install -y wget unzip ruby-full build-essential make && apt-get clean RUN gem install bundler # 安裝Fastlane RUN gem install fastlane RUN mkdir -p /sdk/cmdline-tools # 下載並解壓縮Android SDK RUN wget https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip \ -O /sdk/cmdline-tools/tools.zip && \ unzip /sdk/cmdline-tools/tools.zip -d /sdk/cmdline-tools && \ mv /sdk/cmdline-tools/cmdline-tools /sdk/cmdline-tools/latest && \ rm /sdk/cmdline-tools/tools.zip # 安裝Android SDK RUN yes | sdkmanager --licenses && \ sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" RUN sdkmanager --list

自動化腳本設定

[Fastfile]

default_platform(:android) platform :android do desc "Runs all the tests" lane :test do gradle(task: "test") end desc "Deploy a new version to the Google Play internal" lane :deployInternal do previous_build_number = google_play_track_version_codes(track: "internal")[0] #previous_build_number = 2 current_build_number = previous_build_number + 1 #gradle(task: "clean bundleRelease") gradle( task: 'bundle', build_type: 'Release', print_command: true, properties: { "android.injected.signing.store.file" => ENV['ANDROID_KEYSTORE_PATH'], "android.injected.signing.store.password" => ENV['ANDROID_KEYSTORE_PASSWORD'], "android.injected.signing.key.alias" => ENV['ANDROID_KEY_ALIAS'], "android.injected.signing.key.password" => ENV['ANDROID_KEYSTORE_PASSWORD'], "android.injected.version.code" => current_build_number } ) upload_to_play_store( track: 'internal', skip_upload_apk: true, aab:"./app/build/outputs/bundle/release/app-release.aab", ) end end

stage test: 負責執行寫在專案中的unit test
stage deployInternal: 編譯和簽章,並將app bundle發佈到內部測試的區域

PC Application(Unity3D)

部署流程: 當程式被PM merge到master branch時,使用預先設定好Unity Licence的主機進行編譯windows standalone版本,編譯後利用docker執行Inno Setup 6進行安裝檔的建置,接著將產生後的安裝檔透過osslsigncode sign進行數位簽章,然後計算簽章後檔案的md5,並以此md5為檔名上傳到檔案伺服器,並將檔案資訊傳送到API,最後發送到Discord社群頻道

1. 安裝編譯環境

由於Unity3D編譯是需要授權,又我們期望使用cli指令處理,因此決定使用一些桌面套件

sudo apt update sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils -y wget -qO - https://hub.unity3d.com/linux/keys/public | gpg --dearmor | sudo tee /usr/share/keyrings/Unity_Technologies_ApS.gpg > /dev/null sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/Unity_Technologies_ApS.gpg] https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list' sudo apt update sudo apt install unityhub -y sudo apt install firefox-esr-l10n-zh-tw -y sudo apt install xvfb -y sudo apt install gitlab-runner -y sudo apt-get update sudo install -m 0755 -d /etc/apt/keyrings sudo apt-get install ca-certificates curl sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y sudo apt install osslsigncode -y

2. 註冊GitLab Runner到GitLab

  1. 使用Admin帳號登入並前往Admin Area進行進階設定
    GitLab Admin Area
  2. 將滑鼠放置於左方選單"CI/CD"上並選擇右方的"Runner"選單
    GitLab Runner設定頁面
  3. 選擇右上方的"New instance runner"來創建新的runner設定檔
    GitLab建立Runner
  4. 因為我們希望這台伺服器只接受Unity的工作,所以套用專用的Tag,例如UnityCI,然後點擊下方的"Create runner"
    設定GitLab Runner-1
    設定GitLab Runner-2
  5. 產看設定是否符合您的設定,沒問題的話就將畫面中的指令執行到我們的Runner主機內註冊,請注意這個產生的token是臨時的,因此請儘快到Runner主機上執行
    驗證GitLab Runner設定
    驗證GitLab Runner設定
gitlab-runner register --url https://gitlab.xiaowan.ch --token {token}
  1. 成功後就會看到"Status"的區域變成"Online"
    GitLab

3. 取得Discord頻道Webhook網址

  1. 到您要創建的頻道選擇"編輯頻道"
    Discord編輯頻道
  2. 選擇左側選單的"整合",然後選擇"Webhook"
    Discord整合設定
  3. 點擊"新Webhook"
    Discord Webhook建立
  4. 在產生的Captain Hook裡面點擊"複製Webhook網址"
    複製Discord Webhook URL
  5. 存到GitLab系統變數或直接寫在腳本內
    GitLab變數新增Discord Webhook URL

4. 準備.gitlab.yml

[.gitlab.yml]

stages: - build - deploy variables: VERSION_NUMBER_VAR: $CI_COMMIT_REF_SLUG-$CI_PIPELINE_ID-$CI_JOB_ID VERSION_BUILD_VAR: $CI_PIPELINE_ID UNITY_VERSION: "2022.3.24f1" .cache: &cache cache: key: "$CI_PROJECT_NAMESPACE-$CI_PROJECT_NAME-$CI_COMMIT_REF_SLUG-$TEST_PLATFORM" paths: - Library/ .unity_defaults: &unity_defaults <<: - *cache .build: &build stage: build script: - xvfb-run --auto-servernum --server-args='-screen 0 640x480x24' /home/xiaowan/Unity/Hub/Editor/2022.3.24f1/Editor/Unity -quit -batchmode -nographics -executeMethod BuildCommand.PerformBuild -customBuildTarget "$BUILD_TARGET" -customBuildName "$BUILD_NAME" tags: - UnityCI build-Windows: stage: build script: - ln ~/gitlab/win/Library . -s - ln ~/gitlab/win/Fallin . -s - xvfb-run --auto-servernum --server-args='-screen 0 640x480x24' /home/xiaowan/Unity/Hub/Editor/2022.3.24f1/Editor/Unity -quit -batchmode -nographics -executeMethod BuildCommand.PerformBuild -customBuildTarget "$BUILD_TARGET" -customBuildName "$BUILD_NAME" -customBuildPath "Fallin/" - for dir in Fallin/*DoNotShip*; do [ -e "$dir" ] && [ -d "$dir" ] && rm -r "$dir"; done 2>/dev/null - docker run --rm -i -v "/home/xiaowan/gitlab/win:/work" amake/innosetup installerBuilder.iss - osslsigncode sign -certs ~/gitlab/mycert.crt -key ~/gitlab/mycert.key -n "Fall in" -i "https://dev.xiaowan.tw" -t "http://timestamp.digicert.com" -in ~/gitlab/win/fallin-installer-0.1b.exe -out fallin-installer-$BUILD_VERSION.exe - checksum=$(md5sum fallin-installer-$BUILD_VERSION.exe | cut -d ' ' -f1) - rsync -avz --progress -e 'ssh -i ~/.ssh/id_rsa' fallin-installer-$BUILD_VERSION.exe [email protected]:"~/pCloudDrive/Public Folder/dev.xiaowan.tw/fallin/bin/${checksum}.exe" - rm Library Fallin - > curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "version=$BUILD_VERSION&url=https://filedn.com/lMOGk15WSIWLOqHwYRPgVS0/dev.xiaowan.tw/fallin/bin/${checksum}.exe&md5=${checksum}&key=$WINAPI_KEY" https://api.proj.xiaowan.ch/win_add.php - > curl -X POST -H "Content-Type: application/json" -d "{ \"username\": \"公告\", \"avatar_url\": \"https://filedn.com/lMOGk15WSIWLOqHwYRPgVS0/tmp/huohuoowo.png\", \"embeds\": [ { \"title\": \"最新更新!\", \"description\": \"版本: $BUILD_VERSION\", \"color\": 15258703, \"fields\": [ { \"name\": \"網址\", \"value\": \"https://de.proj.xiaowan.ch/\", \"inline\": false } ] } ] }" "$DISCORD_WEBHOOK_URL" variables: BUILD_NAME: Fallin BUILD_TARGET: StandaloneWindows64 tags: - UnityCI workflow: rules: - if: $CI_MERGE_REQUEST_ID when: never - if: $CI_COMMIT_TAG when: never - when: always

Website

部署流程: 當程式被PM merge到master branch時,使用Docker編譯成Image,將Image上傳至安全的registry,再部署到Kubernetes環境

1. 設定TLS金鑰到叢集

[在controller上執行]

kubectl create secret tls site-tls-secret --cert=cert.pem --key=key.pem

設定網站憑證

2. 設定Docker Registry的帳號密碼

[在controller上執行]

kubectl create secret docker-registry regcred --docker-server=registry.xiaowan.ch --docker-username=xxxxx --docker-password=xxxxx

3. 安裝ingress-nginx

用來處理Layer 7 Host-based的連線,LoadBalancer做在這裡,直接安裝套用即可

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

4. 編譯

  1. Dockerfile: 編譯產品Image,稍後用來部署的資源
  2. .gitlab-ci.yml: GitLab自動化腳本
  3. php-site-deployment-{ZONE}.yaml: 各區域要部署的資源設定
  4. php-site-service-{ZONE}.yaml: 各區域部署的服務社定
  5. php-site-ingress.yaml: 將HTTPS的連線導入內部Service的HTTP,提供TLS加密
    [Dockerfile]
FROM php:8.2-apache WORKDIR /var/www/html COPY ./www /var/www/html RUN chown -R www-data:www-data /var/www/html && chmod -R 755 /var/www/html RUN a2enmod rewrite EXPOSE 80 CMD ["apache2-foreground"]

[.gitlab-ci.yml]

stages: - build - deploy variables: DOCKER_IMAGE: "${DOCKER_REGISTRY}/php-site:${CI_COMMIT_SHORT_SHA}" DOCKER_HOST: "unix:///var/run/docker.sock" build_and_push_image: stage: build image: docker:latest services: [] script: - echo "$DOCKER_REGISTRY_PASSWORD" | docker login -u "$DOCKER_REGISTRY_USER" --password-stdin "$DOCKER_REGISTRY" - docker build -t "$DOCKER_IMAGE" . - docker push "$DOCKER_IMAGE" only: - main tags: - ispan deploy_to_k8s: stage: deploy image: name: bitnami/kubectl:latest entrypoint: [""] script: # 設定Kubernetes連線及驗證 - echo $KUBERNETES_CA_CERT | base64 -d > ca.crt - kubectl config set-cluster k8s-cluster --server=$KUBERNETES_API_URL --certificate-authority=ca.crt - kubectl config set-credentials gitlab-deployer --token=$KUBERNETES_TOKEN - kubectl config set-context k8s-context --cluster=k8s-cluster --user=gitlab-deployer - kubectl config use-context k8s-context # 將環境變數傳到設定檔的yaml中(用來設定Image版本號碼) - envsubst < php-site-deployment-de.yaml > php-site-deployment-de.yaml.tmp && mv php-site-deployment-de.yaml.tmp php-site-deployment-de.yaml - envsubst < php-site-deployment-jp.yaml > php-site-deployment-jp.yaml.tmp && mv php-site-deployment-jp.yaml.tmp php-site-deployment-jp.yaml # 套用部署環境 - kubectl get nodes - kubectl apply -f php-site-deployment-de.yaml - kubectl apply -f php-site-deployment-jp.yaml - kubectl apply -f php-site-service-de.yaml - kubectl apply -f php-site-service-jp.yaml - kubectl apply -f php-site-ingress.yaml only: - main tags: - ispan

網站建立Docker-1
網站建立Docker-2
網站推送-1
網站推送-2

其他相關安裝

GitLab Community Edition

GitLab Runner

Registry

git clone https://github.com/distribution/distribution.git wget https://go.dev/dl/go1.23.3.linux-amd64.tar.gz tar zxvf go1.23.3.linux-amd64.tar.gz sudo mv go /usr/local export PATH=$PATH:/usr/local/go/bin go version cd distribution ls bin/ sudo mv bin/registry /usr/local/bin/registry mkdir -p /usr/local/bin/registry mkdir -p /etc/docker/registry

MariaDB Server

  1. 安裝
sudo apt update && sudo apt upgrade -y
sudo apt install mariadb-server mariadb-client -y
  1. 匯入
-- MariaDB dump 10.19 Distrib 10.11.6-MariaDB, for debian-linux-gnu (x86_64) -- -- Host: localhost Database: ispan -- ------------------------------------------------------ -- Server version 10.11.6-MariaDB-0+deb12u1-log /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; /*!40103 SET TIME_ZONE='+00:00' */; /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; -- -- Table structure for table `win_app` -- DROP TABLE IF EXISTS `win_app`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `win_app` ( `id` int(11) NOT NULL AUTO_INCREMENT, `version` varchar(45) DEFAULT NULL, `url` varchar(255) DEFAULT NULL, `time` datetime DEFAULT current_timestamp(), `md5` char(32) DEFAULT NULL, `virustotal` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */;
  1. 設定
    執行
sudo mysql
CREATE USER 'username'@'%' IDENTIFIED BY 'password'; GRANT privileges ON ispan.win_app TO 'username'@'%';

常用kubectl指令

# 驗證服務狀況 kubectl get nodes -o wide kubectl get deployment kubectl get pods -o wide kubectl get services kubectl get ingress # 驗證所有狀況 kubectl get all --all-namespaces # 創建測試pod kubectl run debug --rm -it --image=busybox --restart=Never -- /bin/sh wget -qO- http:// # 重啟服務 kubectl -n metallb-system rollout restart daemonset speaker kubectl -n metallb-system rollout restart deployment controller # 顯示pod目前狀況 kubectl describe pods -n metallb-system # 取得endpoints狀況 kubectl get endpoints php-site-service-de kubectl get endpoints php-site-service-jp # 套用設定檔 kubectl apply -f {filename}.yaml # 移除設定檔 kubectl delete -f {filename}.yaml # 移除服務 kubectl delete svc ingress-nginx-controller # 取得所有服務 kubectl get svc -A