使用ansible-app2k8s管理和部署服務到 kubernetes

2023-06-25 15:02:00

ansible-app2k8s

#1 介紹

#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-registrynfs-serveryml-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.5 有狀態服務 StatefulSet
  • 有狀態服務使用 StatefulSet 方式部署,需要掛載 PVC 儲存
  • 因為有狀態服務部署後很少更改,放在 init 分類,字首有 data 的 yml 檔案
    • 如 redis roles/k8s/templates/init/3.data-redis-standone.yml
  • 測試環境部署單節點夠用,生產環境推薦使用公有云雲原生服務
#8.6 監控警報

監控方案為 prometheus, 主要包含如下模組:

其它監控相關

監控警報規則

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
服務部署到公有云,推薦直接使用公有云的映象儲存服務

#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