世界動(dòng)態(tài):【免費(fèi)架構(gòu)】Heroku 不免費(fèi)了,何去何從之 Keycloak 的容器化部署之路
好幾年前,我 fork 了一個(gè)項(xiàng)目(https://github.com/Jeff-Tian/keycloak-heroku)并做了一些修改,將 Keycloak 適配到了 Heroku 的免費(fèi) Dyno 上,并添加了一鍵部署按鈕。但是,如《Free Arch: Bye-bye to Heroku》所述,Heroku 不再免費(fèi)。現(xiàn)在這個(gè)倉庫,仍然可以一鍵部署到 Heroku 上,但是,可能產(chǎn)生費(fèi)用。做為免費(fèi)架構(gòu)的擁躉,我必須找一個(gè)替代方案。
如果你看過我前面的文章,沒錯(cuò),是熟悉的味道:《免費(fèi)架構(gòu):Heroku 不免費(fèi)了,何去何從之 eggjs 的容器化部署之路》。
(資料圖片僅供參考)
本文將參考上文,對(duì) jeff-tian/keycloak-heroku 項(xiàng)目做一個(gè)改造,將它部署到 Okteto。
在線演示原來的 Heroku 站點(diǎn)是: https://keycloak.jiwai.win ,本來這個(gè)站點(diǎn)可以一直訪問,Heroku 取消免費(fèi)之后,我就將 Free Dyno 改成了最便宜的共享 Dyno,一個(gè)月 5 美元,但是每月有訪問限額。如今只在月初可以訪問,這個(gè)額度一旦用完就訪問不了了。
替代方案部署在 Okteto,域名是: https://keycloak-jeff-tian.cloud.okteto.net/。
容器化要部署到 Okteto 以及任何一個(gè) k8s 集群,第一步是需要將應(yīng)用容器化。我看了一下,原來我已經(jīng)將 keycloak-heroku 項(xiàng)目容器化了,只是一直沒有部署到 k8s 環(huán)境里。
本地運(yùn)行之前容器化后,只在本地以 docker compose up的方式運(yùn)行,然后打開 http://localhost:8080 。
如今要部署到集群,正好可以重用。
Dockerfile項(xiàng)目里已經(jīng)寫好了 Dockerfile,只是文件名叫 Dockerfile.test:
FROM quay.io/keycloak/keycloak:latestCOPY idps/wechat-mobile/keycloak-services-social-weixin.jar \/opt/keycloak/providers/COPY idps/wechat-mobile/templates/realm-identity-provider-weixin-ext.html \/opt/keycloak/themes/base/admin/resources/partialsCOPY idps/wechat-mobile/templates/realm-identity-provider-weixin.html \/opt/keycloak/themes/base/admin/resources/partialsCOPY idps/wecom/keycloak-services-social-wechat-work.jar \/opt/keycloak/providers/COPY idps/wecom/templates/realm-identity-provider-wechat-work.html \/opt/keycloak/themes/base/admin/resources/partialsCOPY idps/wecom/templates/realm-identity-provider-wechat-work-ext.html \/opt/keycloak/themes/base/admin/resources/partialsCMD ["start-dev", "--hostname-strict=false"]打包腳本
要容器化打包,可以寫個(gè)腳本來完成:
docker build -f Dockerfile.test -t jefftian/keycloak:"$1" .docker imagesdocker run --network host -e CI=true -d -p 127.0.0.1:8080:8080 --name keycloak:"$1" jefftian/keycloakdocker ps | grep -q keycloakdocker ps -aqf "name=keycloak$"docker push jefftian/keycloak:"$1"docker logs $(docker ps -aqf name=keycloak$)curl localhost:8080 || docker logs $(docker ps -aqf name=keycloak$)docker kill keycloak || echo "keycloak killed"docker rm keycloak || echo "keycloak removed"
注意它接收一個(gè)參數(shù),用來做容器的標(biāo)記:
SOPS由于要將項(xiàng)目跑起來,需要一些秘密數(shù)據(jù),想將它們納入代碼管理,但又不想明文展示出來,那就可以利用 SOPS 了。詳情可以參考上文《免費(fèi)架構(gòu):Heroku 不免費(fèi)了,何去何從之 eggjs 的容器化部署之路》,以及《加密 Kubernetes 集群中的敏感信息》。
配置 GitHub Action Secrets參考上文,在最終的 CICD 腳本中需要用到一些密碼數(shù)據(jù):
配置 CICD 流水線先準(zhǔn)備一些 k8s 聲明文件詳見項(xiàng)目的 k8s 文件夾,有 secrets.yaml、deployments.yaml、service.yaml 以及 kustomization.yaml 文件。
準(zhǔn)備 github workflow這個(gè)文件內(nèi)容如下:
# This workflow will do a clean installation of node dependencies, build the source code and run tests across different versions of node# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actionsname: CICDon:push:branches: [ master ]pull_request:branches: [ master ]schedule:- cron: "0 */12 * * *"jobs:build-docker-image:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v3- run: echo "${{secrets.DOCKER_PASSWORD}}" | docker login -u "${{secrets.DOCKER_USERNAME}}" --password-stdin- run: git_hash=$(git rev-parse ${{ github.sha }})- run: sh .github/dockerize.sh ${{ github.sha }}deploy-okteto:runs-on: ubuntu-latestneeds: build-docker-imagesteps:- uses: actions/checkout@v3- run: mkdir ${HOME}/.aws- 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: 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- run: npm i -g k8ss- run: echo -e "machine github.com\n login ${{secrets.GH_TOKEN}}" > ~/.netrc- 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/secrets.yaml --aws-profile lambda-doc-rotary | kubectl apply -f -- run: kubectl apply -k k8s- run: kubectl set image deployment keycloak keycloak=jefftian/keycloak:${{ github.sha }}
這個(gè)流水線的效果如下圖:
完成: 部署到 Okteto部署到 Okteto 后:
打開自動(dòng)分配的網(wǎng)址:
總結(jié)耶!我們又重新?lián)碛辛藢儆谧约旱拿赓M(fèi)的 Keycloak 實(shí)例!
關(guān)鍵詞: