DevOps CI/CD with GitLab
架構
模擬情形
3個repository
- Android App
- PC Application(Unity3D)
- Website (PHP)

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 |
- 兩台worker和controller同屬192.168.2.0/24網段,兩台worker使用Load Balancer IP進行服務,使用192.168.2.0/24網段進行溝通。
- jp2由於地點不同服務商也不同,使用Public IP和controller的Public IP進行溝通




其他相關伺服器
- GitLab
- GitLab Runner-ispan
- GitLab Runner-Unity3D
- Docker Registry
- Database Server
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 |
套件介紹
-
cri-o: 執行容器及管理容器的工具,作為符合OCI標準的容器運行時,cri-o提供輕量且高效的容器管理功能,專為Kubernetes設計,確保與CRI的整合
- Container Runtime Interface(CRI): Kubernetes 定義的一個標準化介面,用來讓Kubernetes的kubelet與容器運行時(Container Runtime)進行交互。主要目的是讓Kubernetes支援多種容器運行時,而不只限於Docker
- Open Container Initiative(OCI): CRI是Kubernetes的抽象層,用於與容器運行時交互
-
MetalLB: Layer 2與Layer 3的網路插件,由於地端伺服器模擬缺乏了雲端網路負載平衡工具,因此必須安裝才有辦法選擇LoadBalancer的網路類型
- Layer 2模式: MetalLB透過ARP將服務IP宣告給網路,適合在單一子網的環境(本次Demo採用的)
- Layer 3模式: MetalLB使用BGP與路由器交換路由資訊,適合於多子網或需要更高可擴展性的環境,路由器必須要支援BGP才能使用
-
Calico: Layer3的CNI(Container Network Interface)插件,負責container之間的網路連線,若沒有安裝將會導致容器間網路無法互通,使得Kubernetes的CoreDNS服務運作不正常,影響內部DNS的解析功能
裝機步驟
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



5. 加入叢集
在worker上執行以加入叢集
DE的兩台worker: 使用Private IP加入叢集
sudo kubeadm join 192.168.2.10:6443 --token {token} --discovery-token-ca-cert-hash {sha256}


JP的worker: 使用Public IP加入叢集
sudo kubeadm join 45.146.254.130:6443 --token {token} --discovery-token-ca-cert-hash sha256:{sha256}

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

由於本次專案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-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

Kubernets與GitLab連結設定
由於稍後我們要利用GitLab部署到k8s,我們需要創造三個變數
- KUBERNETES_API_URL: Kubernetes API 連線用的URL
- KUBERNETES_TOKEN: Cluster的access token
- KUBERNETES_CA_CERT: Kubernetes API的CA憑證內容(經過base64編碼)
產生連線帳號
- 建立一個名為 gitlab-deployer 的 Service Account
- [在controller上執行]
kubectl create serviceaccount gitlab-deployer -n kube-system
- 為這個 Service Account 賦予 cluster-admin 權限
[在controller上執行]
kubectl create clusterrolebinding gitlab-deployer-binding --clusterrole=cluster-admin --serviceaccount=kube-system:gitlab-deployer

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

4. 取得 CA 憑證並將編碼成 base64 [KUBERNETES_CA_CERT]
[在controller上執行]
cat /etc/kubernetes/pki/ca.crt | base64 | tr -d '\n'

5. 檢查聆聽的port確認k8s api在6443監聽
[在controller上執行]
sudo lsof -iTCP -sTCP:LISTEN

6. 將變數加入GitLab CI/CD Varables
記得使用Masked and hidden保護變數

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
- 前往GCP啟用Google Play Android Developer API

- 前往IAM & Admin的Service Account選單點選"創建服務帳號"

- 將資料填寫完畢且服務帳號的Email複製起來,選擇"完成"

- 在創建的帳號右側點選"行為"選單的三個點點,接著按一下"管理金鑰"

- 選擇左下方的"新增金鑰",接著選擇"建立新的金鑰"

- 我們選擇簡易的JSON的金鑰,選擇"建立"

- 點擊後會開始下載,請將金鑰(私鑰)存在安全的地方

綁訂到 Play Console
- 前往Play Console並選擇您的開發人員帳戶

- 選擇使用者和權限

- 選擇"邀請新的使用者"

- 填寫剛剛複製的帳號Email、勾選適當的權限(例如管理員)、選擇"邀請使用者"並"傳送邀請"


fastlane is a tool for iOS and Android developers to automate tedious tasks like generating screenshots, dealing with provisioning profiles, and releasing your application.
- 在需要執行Fastlane的裝置準備 Ruby
sudo apt-get install ruby-full
- 安裝 Fastlane
gem install fastlane
- 測試是否可以透過剛才產生的金鑰連線到Google Play Console
fastlane run validate_play_store_json_key json_key:/path/key.json
- 專案初始化
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
RUN apt-get update && apt-get install -y wget unzip ruby-full build-essential make && apt-get clean
RUN gem install bundler
RUN gem install fastlane
RUN mkdir -p /sdk/cmdline-tools
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
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]
current_build_number = previous_build_number + 1
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發佈到內部測試的區域
- 備註: 如果是第一次部署必須先手動上傳一份到alpha/beta/release區域給Google Play 做審查,審查後才有辦法執行自動部署到任一的區域,並從google play console取得App meta
fastlane supply init
PC Application(Unity3D)
部署流程: 當程式被PM merge到master branch時,使用預先設定好Unity Licence的主機進行編譯windows standalone版本,編譯後利用docker執行Inno Setup 6進行安裝檔的建置,接著將產生後的安裝檔透過osslsigncode sign進行數位簽章,然後計算簽章後檔案的md5,並以此md5為檔名上傳到檔案伺服器,並將檔案資訊傳送到API,最後發送到Discord社群頻道
1. 安裝編譯環境
由於Unity3D編譯是需要授權,又我們期望使用cli指令處理,因此決定使用一些桌面套件
- xface: 桌面版環境
- xrdp: 遠端rdp桌面
- unityhub: Unity3D安裝工具
- firefox: 登入Unity所需的瀏覽器
- xvfb: 以cli指令執行模擬桌面環境工具
- gitlab-runner: 用來連結GitLab的作為worker的客戶端
- docker: 執行Inno Setup 6用到的環境
- osslsigncode: 數位簽章的工具
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
- 使用Admin帳號登入並前往Admin Area進行進階設定

- 將滑鼠放置於左方選單"CI/CD"上並選擇右方的"Runner"選單

- 選擇右上方的"New instance runner"來創建新的runner設定檔

- 因為我們希望這台伺服器只接受Unity的工作,所以套用專用的Tag,例如UnityCI,然後點擊下方的"Create runner"


- 產看設定是否符合您的設定,沒問題的話就將畫面中的指令執行到我們的Runner主機內註冊,請注意這個產生的token是臨時的,因此請儘快到Runner主機上執行


gitlab-runner register --url https://gitlab.xiaowan.ch --token {token}
- 成功後就會看到"Status"的區域變成"Online"

3. 取得Discord頻道Webhook網址
- 到您要創建的頻道選擇"編輯頻道"

- 選擇左側選單的"整合",然後選擇"Webhook"

- 點擊"新Webhook"

- 在產生的Captain Hook裡面點擊"複製Webhook網址"

- 存到GitLab系統變數或直接寫在腳本內

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. 編譯
- Dockerfile: 編譯產品Image,稍後用來部署的資源
- .gitlab-ci.yml: GitLab自動化腳本
- php-site-deployment-{ZONE}.yaml: 各區域要部署的資源設定
- php-site-service-{ZONE}.yaml: 各區域部署的服務社定
- 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:
- 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
- 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




其他相關安裝
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
- 安裝
sudo apt update && sudo apt upgrade -y
sudo apt install mariadb-server mariadb-client -y
- 匯入
;
;
;
;
;
;
;
;
;
;
DROP TABLE IF EXISTS `win_app`;
;
;
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;
;
- 設定
執行
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
DevOps CI/CD with GitLab
架構
模擬情形
3個repository
Kubernetes 內部溝通拓樸
裝置網路
其他相關伺服器
Kubernets 裝機
規格介紹
套件介紹
cri-o: 執行容器及管理容器的工具,作為符合OCI標準的容器運行時,cri-o提供輕量且高效的容器管理功能,專為Kubernetes設計,確保與CRI的整合
MetalLB: Layer 2與Layer 3的網路插件,由於地端伺服器模擬缺乏了雲端網路負載平衡工具,因此必須安裝才有辦法選擇LoadBalancer的網路類型
Calico: Layer3的CNI(Container Network Interface)插件,負責container之間的網路連線,若沒有安裝將會導致容器間網路無法互通,使得Kubernetes的CoreDNS服務運作不正常,影響內部DNS的解析功能
裝機步驟
1. 安裝kubectl, kubelet, kubeadm
2. 安裝minikube
3. 安裝cri-o
4. 建立叢集
在Controller的機器上執行以建立叢集
[在controller上執行]
5. 加入叢集
在worker上執行以加入叢集
DE的兩台worker: 使用Private IP加入叢集
JP的worker: 使用Public IP加入叢集
6. 驗證安裝狀態
[在controller上執行]
7. 標記worker
由於這次的Demo需要分成de組(worker1和worker2)和jp組(jp2),因此需要執行標記指令
[在controller上執行]
8. 安裝MetalLB
由於本次專案jp節點並不需要負載平衡,因此必須修改官方的安裝檔
[在controller上執行]
[metallb-config.yaml]
這個檔案設定193.23.126.13作為負載平衡的IP
9. 安裝Calico
直接透過官方安裝檔安裝即可,不用額外設定
[在controller上執行]
Kubernets與GitLab連結設定
由於稍後我們要利用GitLab部署到k8s,我們需要創造三個變數
產生連線帳號
[在controller上執行]
3.生成 token [KUBERNETES_TOKEN]
[在controller上執行]
4. 取得 CA 憑證並將編碼成 base64 [KUBERNETES_CA_CERT]
[在controller上執行]
5. 檢查聆聽的port確認k8s api在6443監聽
[在controller上執行]
6. 將變數加入GitLab CI/CD Varables
記得使用Masked and hidden保護變數
7. (option) 測試是否可以成功連線(.gitlab-ci.yml)
上方這個結果就是成功透過API連線並顯示出了所有節點
專案部署
Android APP
部署流程: 當程式被PM merge到master branch時,程式碼被送到雲端進行unit test,通過後cloud build並直接簽章,最後再透過Google API將程式版本、說明、截圖等資料上傳到Google Play Store進行審核發布
設定 Play Console API
綁訂到 Play Console
自動部署工具–Fastlane
創建用來編譯的Docker
[在GitLab Runner上執行]
準備編譯用的Docker環境
[Dockerfile]
自動化腳本設定
[Fastfile]
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指令處理,因此決定使用一些桌面套件
2. 註冊GitLab Runner到GitLab
3. 取得Discord頻道Webhook網址
4. 準備.gitlab.yml
[.gitlab.yml]
Website
部署流程: 當程式被PM merge到master branch時,使用Docker編譯成Image,將Image上傳至安全的registry,再部署到Kubernetes環境
1. 設定TLS金鑰到叢集
[在controller上執行]
2. 設定Docker Registry的帳號密碼
[在controller上執行]
3. 安裝ingress-nginx
用來處理Layer 7 Host-based的連線,LoadBalancer做在這裡,直接安裝套用即可
4. 編譯
[Dockerfile]
[.gitlab-ci.yml]
其他相關安裝
GitLab Community Edition
GitLab Runner
Registry
MariaDB Server
執行
常用kubectl指令