ansible-app2k8s
#1 介紹
- 使用 ansible 管理和部署服務到 kubernetes
- 適用于專案容器化,多套 k8s 環境的管理,可結合
CICD工具做DevOps - 來自于專案實踐,已部署多套 k8s 環境
- 自建 k8s
- 阿里云 ACK
- 騰訊云 TEK
- 華為云 CCE
- AWS EKS
- 微軟云 AKS
#2 主要功能
- 鏡像構建并推送到鏡像倉庫
- 環境初始化(創建 namespace、儲存卷、驅動等)
- 部署監控(prometheus、grafana、loki)
- 構建與部署服務到 k8s(主要用途)
#3 運行環境
- 系統 Ubuntu 20
- ansible 2.7 (高版本可能出現語法兼容性問題)
- kubenertes(能被
kubectl客戶端連接即可)
#4 原理與結構
原理很簡單,使用ansible管理模板,呼叫kubectl執行部署
ansible-templates -> deploy.yml -> kubectl -> kubenertes

執行程序使用tag標記,如-t deploy執行deploy部分
根據執行程序,大致分為以下步驟模塊
- base-build 基礎鏡像構建(docker build)
- push 推送公共鏡像到鏡像倉庫(docker pull)
- init 環境初始化(如創建 namespace)
- monitor 監控警報(如 prometheus)
- build 構建服務鏡像(docker build)
- deploy 部署服務(kubectl apply )
- ingress 配置域名訪問(7 層代理)
模板目錄 roles/k8s/templates
根據服務類別分為如下子目錄
- base 基礎鏡像 dockerfile
- ingress 域名決議配置
- init 環境初始化 yaml 檔案
- java jar包構建鏡像和部署模板
- jetty 使用
jetty的服務構建和部署模板 - monitor 監控警報相關 yaml
- ms 沒有單獨引數檔案的微服務部署模板
- nignx 前端靜態使用 nginx 容器的部署模板
針對不同k8s環境如dev、prod,使用各自引數配置如儲存、鏡像倉庫、資源限制等
使用ansible -i 指定inventory路徑并使用對應的組變數
如dev環境的k8s組態檔 group_vars/dev/k8s.yml
服務app-v1的dev環境配置 group_vars/dev/k8s_apps/app-v1.yml
prod環境使用對應配置路徑 group_vars/prod/k8s_apps/app-v1.yml
運行截圖

#5 dev 環境準備與配置
#5.1 快速安裝 k8s
export Ver=1.22.16 #k8s版本
curl -ks http://elvin.vip/ks/k8s/k8s.master.ha.sh |bash
# 參考https://www.cnblogs.com/elvi/p/8976305.html
#5.2 獲取 ansible-app2k8s
mkdir -p /data/ansible-app2k8s
cd /data/ansible-app2k8s
#gitee
git clone https://gitee.com/alivv/ansible-app2k8s.git ./
#github
#git clone https://github.com/alivv/ansible-app2k8s.git ./
#5.3 運行 ansible-app2k8s 容器
為保證運行
ansible版本一致,我做了ansible鏡像
#查看shell
cat /data/ansible-app2k8s/files/run.ansible-app2k8s.sh
sudo docker rm -f ansible-app2k8s &>/dev/null
sudo docker run -dit --net=host \
--name ansible-app2k8s -h app2k8s \
-w /data/ansible-app2k8s \
-v /tmp:/tmp \
-v /etc/hosts:/etc/hosts \
-v ~/.ssh:/root/.ssh \
-v /data/ansible-app2k8s:/data/ansible-app2k8s \
registry.cn-shanghai.aliyuncs.com/elvin/ansible:2.7.18-focal
sudo docker ps -l
#運行容器 ansible-app2k8s
bash /data/ansible-app2k8s/files/run.ansible-app2k8s.sh
#配置別名
alias app2k8s='docker start ansible-app2k8s ; docker exec -it ansible-app2k8s bash'
#linux
echo "alias app2k8s='docker start ansible-app2k8s ; docker exec -it ansible-app2k8s bash'" >>~/.bashrc
#macOS
echo "alias app2k8s='sudo docker start ansible-app2k8s ; sudo docker exec -it ansible-app2k8s bash'" >>~/.zshrc
#進入ansible-app2k8s容器(Ctrl+d退出)
app2k8s
#查看ansbile版本
ansible --version
#5.4 初始化 docker-build 節點
本實體把多個功能部署在 docker-build 單節點
為了安全,實際可根據需求可拆分為多個節點
#5.4.1 更改配置
配置 dev 節點 env/dev/k8s.inv
#配置dev環境節點資訊 env/dev/k8s.inv
cat > env/dev/k8s.inv <<EOF
[dev:children]
k8s-node
docker-build
[docker-build]
build-node1 ansible_ssh_host=192.168.23.45
[k8s-node]
k8s-node1 ansible_ssh_host=192.168.23.30
[k8s:children]
k8s-node
[docker:children]
docker-build
registry
[registry]
build-node1
EOF
#IP地址換自己的,節點需要免密登錄
#節點需要安裝python2
# apt install -y python python2 python-apt
# ln -fs /usr/bin/python2 /usr/bin/python
配置 dev 環境引數 group_vars/dev/k8s.yml
#修改配置IP地址
k8s_version: 1.22.16
kubectl_node: 192.168.23.45
deploy_yml_node: 192.168.23.45
ansible 測驗
ansible -i env/dev all -m ping
#獲取節點變數
ansible -i env/dev all -m setup
#5.4.2 安裝docker-registry、nfs-server、yml-node
#安裝docker,docker-py(ansible構建鏡像依賴)
ansible-playbook docker.yml -D -i env/dev -l docker-build -t docker,py,job
#部署docker-registry作為鏡像倉庫
ansible-playbook docker.yml -i env/dev -D -l registry -t registry,registry-auth
#增加鏡像倉庫host決議
ansible-playbook docker.yml -i env/dev -D -t hosts-registry
#yml檔案存放節點
ansible-playbook docker.yml -i env/dev -D -l docker-build -t yml-node
#安裝nfs服務和創建nfs目錄,創建容器存盤卷PVC使用
ansible-playbook nfs.yml -i env/dev -D -l docker-build -t nfs-server
#使用nfs儲存卷,k8s節點需安裝nfs client
ansible-playbook nfs.yml -i env/dev -D -l k8s
#5.4.3 安裝配置 kubectl
拷貝k8s 節點配置 /etc/kubernetes/admin.conf
替換本實體配置 roles/k8s/files/kubeconfig-dev.yml
可手動配置kubeconfig,檔案路徑配置在group_vars/dev/k8s.yml
#安裝配置kubectl命令列
ansible-playbook k8s.yml -i env/dev -D -l build-node1 -t kubectl,kubeconfig
#kubectl測驗命令 kubectl get nodes
ansible-playbook k8s.yml -i env/dev -D -t kubectl-test
#5.5 ansible-app2k8s 測驗
#查看幫助
ansible-playbook k8s.yml -i env/dev -D -t h
#查看資源串列
ansible-playbook k8s.yml -i env/dev -D -t list
構建鏡像測驗
#查看base基礎鏡像dockerfile串列
ansible-playbook k8s.yml -i env/dev -D -t baselist
#構建鏡像nginx_1.22-alpine-www
ansible-playbook k8s.yml -i env/dev -D -t base-build -e baselist=nginx_1.22-alpine-www
#構建完成后打開鏡像倉庫web查看鏡像
#默認賬戶密碼 admin docker
#添加本地host決議后打開 http://hub.elvin.vip
#6 app2k8s 部署服務到 k8s
#6.1 推送公共鏡像到鏡像倉庫
#查看串列
ansible-playbook k8s.yml -i env/dev -D -t pushlist
#推送所有(有點耗時)
ansible-playbook k8s.yml -i env/dev -D -t push -e pushlist=all
#6.2 k8 環境初始化
#查看yml串列
ansible-playbook k8s.yml -i env/dev -D -t initlist
#執行所有
ansible-playbook k8s.yml -i env/dev -D -t init -e initlist=all
#6.3 部署監控 prometheus、grafana、prometheus-adapter、loki
#警報通知使用釘釘機器人,需要改為自己的機器人tonken
grep notice_dingtalk_token group_vars/dev/k8s_ui.yml
#查看yml串列
ansible-playbook k8s.yml -i env/dev -D -t monitorlist
#執行所有yml
ansible-playbook k8s.yml -i env/dev -D -t monitor
grafana默認用戶密碼 admin grafana
添加loki資料源地址 http://loki:3100
添加prometheus資料庫源地址 http://prometheus:9090
grafana模板 roles/k8s/templates/monitor/grafana-template/

#6.4 部署服務到 k8s
#查看app串列
ansible-playbook k8s.yml -i env/dev -D -t applist
#測驗,構建與部署app-v1
ansible-playbook k8s.yml -i env/dev -D -t build,deploy -e applist=app-v1
#構建與部署全部
ansible-playbook k8s.yml -i env/dev -D -t build,deploy -e applist=all
#6.5 域名決議 ingress
ansible-playbook k8s.yml -i env/dev -D -t ingress
查看ingress配置,瀏覽器打開網址查看如下:

#7 部署驗證與清理
#添加本機hosts決議
ansible-playbook dev.yml -i env/dev -D -t hosts-local
#查看已配置網址串列,瀏覽器打開測驗
ansible-playbook dev.yml -i env/dev -t url
測驗完成后,清理 k8s 的 dev 部署
#洗掉ingress
ansible-playbook k8s.yml -i env/dev -D -t ingress-rm
#洗掉dev環境服務
ansible-playbook k8s.yml -i env/dev -D -t rm -e applist=all
#洗掉監控
ansible-playbook k8s.yml -i env/dev -D -t monitor-rm
#洗掉環境初始化
ansible-playbook k8s.yml -i env/dev -D -t init-rm
#8 功能解說
#8.1 本文常用 ansible 命令
ansible-playbook k8s.yml -i env/dev -D -t rmi,build,deploy -e applist=app-v1
- ansible-playbook 執行 ansible 劇本命令列
- k8s.yml 當前目錄劇本檔案名
- -i 指定 inventory 節點路徑
- -D 是--diff 簡稱,顯示執行程序中檔案修改變化
- -t 是--tags 簡稱,執行 tag 標記部分,使用
,分隔多個 tag - -e 是--extra-vars 簡稱,命令列指定變數,變數優先級最高
- -C 是--check 簡稱,試運行,用于檢測運行程序
#8.2 儲存卷 PVE
為便于管理與維護,本實體存盤卷PVC使用靜態儲存
使用PVC時掛載路徑添加對應服務子路徑 subPath
使用 cronJob 每天壓縮與清理 PVC 儲存的 log 檔案
儲存實體型別有 NFS、阿里云 NAS、騰訊云 CFS、AWS EFS、Azure Files
路徑 roles/k8s/templates/init 前綴是1.4.pvc的檔案
#8.3 日志方案(java 服務)
- 使用 log4j2 配置需要量化的 log 儲存到 ElasticSearch
- 使用 log4j2 配置日志儲存到檔案,容器掛載 PVC
- 使用 loki 搜集終端日志,UI 界面使用 grafana
log4j2 配置在 configmap roles/k8s/templates/jetty/configmap/
#8.4 墻裂推薦的 k8s 工具軟體 !!!
以下部署 yaml 路徑 roles/k8s/templates/init/
-
8.4.1 https 證書自動續簽
cert-manager
官網 https://cert-manager.io
GitHub https://github.com/cert-manager/cert-manager
注意事項:- 配置自己的 cert-ssl-issuer.yml
- http 認證創建證書,需要域名決議到正確的公網IP
- DNS 認證需要配置DNS決議權限,可以查看官網檔案
-
8.4.2 k8s 面板
KubePi
Kubernetes 可視化面板,可管多個 k8s 集群,國產開源
GitHub https://github.com/1Panel-dev/KubePi

-
8.4.3 k8s面板IDE工具推薦Lens
官網 https://k8slens.dev

-
8.4.4 k8s 用戶權限管理
permission-manager
添加配置用戶權限,生成用戶 kubeconfig 檔案
GitHub https://github.com/sighupio/permission-manager

#8.5 有狀態服務 StatefulSet
- 有狀態服務使用 StatefulSet 方式部署,需要掛載 PVC 儲存
- 因為有狀態服務部署后很少更改,放在 init 分類,前綴有 data 的 yml 檔案
-
- 如 redis roles/k8s/templates/init/3.data-redis-standone.yml
- 測驗環境部署單節點夠用,生產環境推薦使用公有云云原生服務
#8.6 監控警報
監控方案為 prometheus, 主要包含如下模塊:
- node-exporter 采集節點指標
- kube-state-metrics 匯聚容器狀態指標
- metrics-server 匯聚資源度量指標
- prometheus 收集和儲存指標,并提供查詢介面
- alertmanager 監控警告路由管理
- grafana 儀表盤 UI 頁面展示
- dingtalk 使用釘釘機器人發送警報通知
其它監控相關
-
prometheus-adapter 容器自動擴容需要
-
loki 日志儲存和查詢
-
promtail 采集日志發送給 loki
監控警報規則
prometheus 采集和警報規則都在 prometheus-config.yml 檔案
包含警報規則如下:
- k8s 節點 CPU、記憶體、磁盤使用率,磁盤剩余容量
- 容器 Pod 狀態、CPU 和記憶體的限制使用率
- 其它服務如 JVM、Redis、rabbitmq
grafana 模板
JVM 監控 grafana 視圖:

#8.7 容器鏡像倉庫
docker-registry 單獨部署使用可以查看我博客
https://www.cnblogs.com/elvi/p/13394449.html
服務部署到公有云,推薦直接使用公有云的鏡像儲存服務
- docker-registry 容器鏡像倉庫
- docker-registry-ui 鏡像查看 web 界面

#8.8 鏡像構建
- 鏡像構建 + push 到鏡像倉庫
- 構建鏡像不包含原始碼編譯,可按需修改 dockerfile 里的下載地址
- 其它工具如 Jenkins(原始碼編譯) -> 儲存編譯包 -> 鏡像構建 -> 鏡像倉庫
配置里有 3 個鏡像倉庫地址(公有云分內網和外網地址)
- local_repository_url 構建默認 push 到本地鏡像倉庫
- push_repository_url 推送到遠程鏡像倉庫地址
- deploy_repository_url 部署時的鏡像倉庫地址
#8.9 安全
請按需并自行解決安全問題,提示以下注意事項:
- yaml 儲存節點配置訪問控制
- 使用 ansible-vault 加密 ansible 密碼檔案
- 手動配置 kubeconfig, 并限制 k8s-apiserver 訪問
#8.10 其它
- 由于所有部署步驟,模板均可按需更改,自由度很高
- k8s 所有配置、部署的操作,均保存 yaml 檔案,便于以后升級、遷移等維護
- 若已熟悉 ansible,可使用本專案作為管理 k8s 部署服務的參考
- 做自動化部署還需結合其它工具,比如使用 Jenkins
使用 Jenkins+ansible+釘釘通知,自動化部署通知:

#9 日常使用命令參考
#更改構建引數后,查看dockerfile變化
ansible-playbook k8s.yml -i env/dev -D -t dockerfile -e applist=app-v1 -C
#更改部署引數后查看deployment變化
ansible-playbook k8s.yml -i env/dev -D -t yml -e applist=app-v1 -C
#單獨更改configmap配置后,服務需要重啟生效
ansible-playbook k8s.yml -i env/dev -D -t config,restart -e applist=app-v1
#構建和部署服務,rmi是洗掉構建節點已存在的相同tag鏡像
ansible-playbook k8s.yml -i env/dev -D -t rmi,build,deploy -e applist=app-v1
#部署生產環境,使用upload上傳鏡像到外網鏡像倉庫
ansible-playbook k8s.yml -i env/prod -D -t upload,deploy -e applist=app-v1
#更改prometheus監控警報規則后需要reload生效
ansible-playbook k8s.yml -i dev -D -t monitor-config,monitor-reload
#10 作者
Elvin [email protected]
主要博客 http://blog.elvin.vip
Source
https://gitee.com/alivv/ansible-app2k8s
https://github.com/alivv/ansible-app2k8s
本文來自博客園,作者:blog-elvin-vip,轉載請注明原文鏈接:https://www.cnblogs.com/elvi/p/17502093.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/555940.html
標籤:其他
下一篇:返回列表
