您的位置:首頁 >聚焦 >

Free Arch: 將 IdentityServer 部署到 Okteto

2022-12-18 14:39:31    來源:程序員客棧
最終成果

部署了一個免費的 IdentityServer 實例: https://id6-jeff-tian.cloud.okteto.net/


(資料圖片僅供參考)

相關代碼提交

一共 3 個,以這個為主:

https://github.com/Jeff-Tian/IdentityServer/commit/b40e6c6f8e4193ef459ab558a102f84442b3cede

前情提要

早在《身份驗證哪家強?Identity Server 初體驗》中,就部署了一個免費的 IdentityServer 實例,托管在 Azure 上: https://id6.azurewebsites.net/。

后來,我宣稱 Free Arch 要狡兔三窟,多處部署:《Free Arch: 狡兔三窟,多處部署》。今天,就來給 IdentityServer 這個實例,添加一個分身,從此不局限于 Azure 平臺。就詳述一下部署將它部署到 Okteto 的步驟。由于采用了 OAM,不需要太多工作,就能參考前文,將它部署到 Napptive 等任何 Kubernetes 集群里。

第一步,容器化

這是一個 ASP.NET Core 項目,從官方的開源倉庫 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"]

第二步,構建鏡像并上傳至 Docker Registry

為了能夠自動在 github actions 的 cicd 過程中自動進行這一步,我們把手動執行的命令放在一個文件里: .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"

第三步,準備數據庫

本 IdentityServer 使用了 PostgreSQL 數據庫。如何擁有一個免費的 PostgreSQL 數據庫服務?如果喜歡自己部署,仍然可以利用 Okteto,參考:《Free Arch: 在 Okteto 上部署 backstage (第一部分: PostgreSQL)》。

當然,也可以使用別人部署好的免費 PostgreSQL 服務,比如 app.nhost.io 提供的服務就不錯。

為了驗證數據庫連接正常,本 IdenityServer 只是連接了數據庫,并且執行了一個空的 EF Migration,在本地使用 docker compose 驗證了成功執行了 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: ~

由于依賴了數據庫,在本地運行本 IdentityServer 實例,需要:

docker compose up -ddotnet run --project hosts/main/Host.Main.csproj

最終部署后,它會在線上的數據庫里也創建出一個 __EFMigrationHistory 表,如果是使用了 app.nhost.io 的服務,可以使用其提供的 Hasura 驗證:

第四步,加密敏感信息

這就是前面提到的主要的提交。再一次使用了 SOPS,對 SOPS 步驟的詳細介紹參考《[Free Arch: 在 Okteto 上部署 backstage(第二部分) - Jeff Tian的文章 - 知乎 ](https://zhuanlan.zhihu.com/p/590640020) 》。要使用它,需要在項目根目錄添加一個 .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添加數據庫連接信息:

apiVersion: v1kind: Secretmetadata:name: id6labels:branch: maintype: OpaquestringData:DatabaseHost: xxxDatabasePort: "5432"DatabaseUser: postgresDatabasePassword: yyyDatabaseName: zzz

第五步,添加 k8s 相關的描述文件

這一步,基本上和《[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

這一點在那篇文章有提及,但這次算是真的補上了這個公開示例。

相比上文,其他的改進點在 deployment.yaml 文件中添加了 replicas,并指定了 2,使得同時有 2 個 pod 運行。

其他文件略過,在此不表。最終需要在 .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

注意在這個文件里,依賴了多個環境變量,這需要添加在 github 代碼倉庫的 secrets 里:

第六步,沒有第六步了!

提交代碼,等待 Actions 跑完:

IdentityServer 的第二個分身上線了!

關鍵詞: 第二部分 狡兔三窟 可以使用

相關閱讀

欧美视频线路在线_欧美中文字幕在线中出观看_中年美女露比自慰交配a一级片免费播放_九九精品国中文字幕在线视频