Free Arch: 將 IdentityServer 部署到 Okteto
部署了一個免費(fèi)的 IdentityServer 實(shí)例: https://id6-jeff-tian.cloud.okteto.net/
(資料圖片僅供參考)
相關(guān)代碼提交一共 3 個,以這個為主:
https://github.com/Jeff-Tian/IdentityServer/commit/b40e6c6f8e4193ef459ab558a102f84442b3cede
前情提要早在《身份驗(yàn)證哪家強(qiáng)?Identity Server 初體驗(yàn)》中,就部署了一個免費(fèi)的 IdentityServer 實(shí)例,托管在 Azure 上: https://id6.azurewebsites.net/。
后來,我宣稱 Free Arch 要狡兔三窟,多處部署:《Free Arch: 狡兔三窟,多處部署》。今天,就來給 IdentityServer 這個實(shí)例,添加一個分身,從此不局限于 Azure 平臺。就詳述一下部署將它部署到 Okteto 的步驟。由于采用了 OAM,不需要太多工作,就能參考前文,將它部署到 Napptive 等任何 Kubernetes 集群里。
第一步,容器化這是一個 ASP.NET Core 項(xiàng)目,從官方的開源倉庫 fork 過來后做了一些魔改,源代碼在: https://github.com/Jeff-Tian/IdentityServer。其 Dockerfile 如下:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS baseWORKDIR /appEXPOSE 5000EXPOSE 5001FROM mcr.microsoft.com/dotnet/sdk:6.0 AS buildWORKDIR /srcCOPY . .RUN dotnet restore "hosts/main/Host.Main.csproj"RUN dotnet build hosts/main/Host.Main.csproj -c Release -o /app/buildFROM build AS publishRUN dotnet publish hosts/main/Host.Main.csproj -c Release -o /app/publishFROM base AS finalWORKDIR /appCOPY --from=publish /app/publish .ENTRYPOINT ["dotnet", "Host.Main.dll"]第二步,構(gòu)建鏡像并上傳至 Docker Registry
為了能夠自動在 github actions 的 cicd 過程中自動進(jìn)行這一步,我們把手動執(zhí)行的命令放在一個文件里: .github/ci.sh。這一步的提交見:
https://github.com/Jeff-Tian/IdentityServer/commit/3db4235f5e091cda1d2752a8f61df5a9fddbd2b4。
docker build -t jefftian/id6 .docker imagesdocker run --network host -e CI=true -d -p 127.0.0.1:5000:5000 --name id6 jefftian/id6docker ps | grep -q id6docker ps -aqf "name=id6"docker push jefftian/id6docker logs $(docker ps -aqf "name=id6$")curl localhost:5000 || docker logs $(docker ps -aqf "name=id6$")docker kill id6 || echo "id6 killed"docker rm id6 || echo "id6 removed"第三步,準(zhǔn)備數(shù)據(jù)庫
本 IdentityServer 使用了 PostgreSQL 數(shù)據(jù)庫。如何擁有一個免費(fèi)的 PostgreSQL 數(shù)據(jù)庫服務(wù)?如果喜歡自己部署,仍然可以利用 Okteto,參考:《Free Arch: 在 Okteto 上部署 backstage (第一部分: PostgreSQL)》。
當(dāng)然,也可以使用別人部署好的免費(fèi) PostgreSQL 服務(wù),比如 app.nhost.io 提供的服務(wù)就不錯。
為了驗(yàn)證數(shù)據(jù)庫連接正常,本 IdenityServer 只是連接了數(shù)據(jù)庫,并且執(zhí)行了一個空的 EF Migration,在本地使用 docker compose 驗(yàn)證了成功執(zhí)行了 Migration:
這個 docker compose 文件如下:
version: "3"services:postgres:image: "postgres"ports:- "5432:5432"environment:POSTGRES_DB: id6POSTGRES_USER: postgresPOSTGRES_PASSWORD: nopwdvolumes:- pg:/var/lib/postgresql/dataadminer:image: library/adminer:latestrestart: alwaysports:- 7777:8080volumes:pg: ~
由于依賴了數(shù)據(jù)庫,在本地運(yùn)行本 IdentityServer 實(shí)例,需要:
docker compose up -ddotnet run --project hosts/main/Host.Main.csproj
最終部署后,它會在線上的數(shù)據(jù)庫里也創(chuàng)建出一個 __EFMigrationHistory 表,如果是使用了 app.nhost.io 的服務(wù),可以使用其提供的 Hasura 驗(yàn)證:
第四步,加密敏感信息這就是前面提到的主要的提交。再一次使用了 SOPS,對 SOPS 步驟的詳細(xì)介紹參考《[Free Arch: 在 Okteto 上部署 backstage(第二部分) - Jeff Tian的文章 - 知乎 ](https://zhuanlan.zhihu.com/p/590640020) 》。要使用它,需要在項(xiàng)目根目錄添加一個 .sops.yaml文件:
creation_rules:# If assuming roles for another account use "arn+role_arn".# See Advanced usage- path_regex: k8s\/app\/secrets\.yaml$kms: "arn:aws:kms:us-east-1:443862765029:key/b1739688-ec15-407d-895d-d05ca1217a2f"aws_profile: lambda-doc-rotary
在 k8s/app/secrets.yaml添加數(shù)據(jù)庫連接信息:
apiVersion: v1kind: Secretmetadata:name: id6labels:branch: maintype: OpaquestringData:DatabaseHost: xxxDatabasePort: "5432"DatabaseUser: postgresDatabasePassword: yyyDatabaseName: zzz第五步,添加 k8s 相關(guān)的描述文件
這一步,基本上和《[Free Arch: 在 Okteto 上部署 backstage(第二部分) - Jeff Tian的文章 - 知乎](https://zhuanlan.zhihu.com/p/590640020) 》相同。一個顯著不同的是在開啟 Ingress 這里,這次沒有使用自動 Ingress,而是專門添加了一個 Ingress.yaml 描述文件:
apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: id6annotations:dev.okteto.com/generate-host: id6spec:rules:- http:paths:- backend:service:name: id6port:number: 80path: /pathType: ImplementationSpecific
這一點(diǎn)在那篇文章有提及,但這次算是真的補(bǔ)上了這個公開示例。
相比上文,其他的改進(jìn)點(diǎn)在 deployment.yaml 文件中添加了 replicas,并指定了 2,使得同時有 2 個 pod 運(yùn)行。
其他文件略過,在此不表。最終需要在 .github/workflows 文件夾下添加一個 cicd 的描述文件:
name: cicdon:push:branches: [ "main" ]pull_request:branches: [ "main" ]schedule:- cron: "0 */12 * * *"jobs:deploy-okteto:runs-on: ubuntu-latestneeds: buildsteps:- uses: actions/checkout@v3- run: curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl- run: chmod +x ./kubectl- run: sudo mv ./kubectl /usr/local/bin/kubectl- run: mkdir ${HOME}/.kube&&mkdir ${HOME}/.aws- run: npm i -g k8ss- run: echo -e "machine github.com\n login ${{secrets.GH_TOKEN}}" > ~/.netrc- run: echo -e "[lambda-doc-rotary]\naws_access_key_id = ${{secrets.AWS_ACCESS_KEY}}\naws_secret_access_key = ${{secrets.AWS_SECRET_KEY}}\n" > ~/.aws/config- run: wget https://github.com/mozilla/sops/releases/download/v3.7.3/sops-v3.7.3.linux.amd64- run: sudo cp sops-v3.7.3.linux.amd64 /usr/local/bin/sops- run: sudo chmod +x /usr/local/bin/sops- run: git clone https://github.com/Jeff-Tian/k8s-config.git ${HOME}/k8s-config- run: k8ss switch --cluster=okteto --namespace=jeff-tian- run: sops -d k8s/app/secrets.yaml --aws-profile lambda-doc-rotary | kubectl apply -f -- run: kubectl apply -k k8s/app&&kubectl rollout restart deploy id6build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- run: echo "${{secrets.DOCKER_PASSWORD}}" | docker login -u "${{secrets.DOCKER_USERNAME}}" --password-stdin- run: sh .github/ci.sh
注意在這個文件里,依賴了多個環(huán)境變量,這需要添加在 github 代碼倉庫的 secrets 里:
第六步,沒有第六步了!提交代碼,等待 Actions 跑完:
IdentityServer 的第二個分身上線了!
相關(guān)閱讀
-
Free Arch: 將 IdentityServer 部署到 Okteto
最終成果部署了一個免費(fèi)的IdentityServer實(shí)例:https: id6-jeff-... -
Copilot 與 ChatGPT,讓程序員如虎添...
Copilot來了,程序員會失業(yè)嗎?ChatGPT又來了,程序員會失業(yè)嗎?程... -
理想全面向矩陣式組織升級:播資訊
?李想和沈亞楠的內(nèi)部信,說了兩點(diǎn):1 沈亞楠逐漸淡出;2 理想從... -
世界熱訊:好的領(lǐng)域模型應(yīng)該是什么樣子?
?好的領(lǐng)域模型應(yīng)該長什么樣子?DDD說,領(lǐng)域模型應(yīng)該是可以準(zhǔn)確表達(dá)... -
今日觀點(diǎn)!業(yè)務(wù)流程建模,細(xì)到幾層?
?在我做的BDF框架中,業(yè)務(wù)建模是非常重要的一個能力之一。因?yàn)橛辛?.. -
5 年的前端成長計(jì)劃 - 僅剩 300 名...
早早聊5年天使票預(yù)售倒計(jì)時,還剩300名額~這次我們拿出了最大的誠...