全球热讯:使用ansible-app2k8s管理和部署服务到 kubernetes

2023-06-25 13:15:28 来源:博客园
ansible-app2k8s#1 介绍使用 ansible 管理和部署服务到 kubernetes适用于项目容器化,多套 k8s 环境的管理,可结合CICD工具做DevOps来自于项目实践,已部署多套 k8s 环境自建 k8s阿里云 ACK腾讯云 TEK华为云 CCEAWS EKS微软云 AKS#2 主要功能镜像构建并推送到镜像仓库环境初始化(创建 namespace、储存卷、驱动等)部署监控(prometheus、grafana、loki)构建与部署服务到 k8s(主要用途)#3 运行环境系统 Ubuntu 20ansible 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 基础镜像 dockerfileingress 域名解析配置init 环境初始化 yaml 文件java jar包构建镜像和部署模板jetty 使用jetty的服务构建和部署模板monitor 监控警报相关 yamlms 没有单独参数文件的微服务部署模板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.ymlprod环境使用对应配置路径 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-app2k8scd /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镜像

#查看shellcat /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-app2k8sbash /data/ansible-app2k8s/files/run.ansible-app2k8s.sh#配置别名alias app2k8s="docker start ansible-app2k8s ; docker exec -it ansible-app2k8s bash"#linuxecho "alias app2k8s="docker start ansible-app2k8s  ; docker exec -it ansible-app2k8s bash"" >>~/.bashrc#macOSecho "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.invcat > env/dev/k8s.inv <

配置 dev 环境参数 group_vars/dev/k8s.yml

#修改配置IP地址k8s_version: 1.22.16kubectl_node: 192.168.23.45deploy_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 clientansible-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-wwwansible-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
#警报通知使用钉钉机器人,需要改为自己的机器人tonkengrep notice_dingtalk_token group_vars/dev/k8s_ui.yml#查看yml列表ansible-playbook k8s.yml -i env/dev -D -t monitorlist#执行所有ymlansible-playbook k8s.yml -i env/dev -D -t monitor

grafana默认用户密码 admingrafana添加loki数据源地址 http://loki:3100添加prometheus数据库源地址 http://prometheus:9090grafana模板 roles/k8s/templates/monitor/grafana-template/

#6.4 部署服务到 k8s
#查看app列表ansible-playbook k8s.yml -i env/dev -D -t applist#测试,构建与部署app-v1ansible-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 部署

#删除ingressansible-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.ioGitHub https://github.com/cert-manager/cert-manager注意事项:

配置自己的 cert-ssl-issuer.ymlhttp 认证创建证书,需要域名解析到正确的公网IPDNS 认证需要配置DNS解析权限,可以查看官网文档

8.4.2 k8s 面板 KubePiKubernetes 可视化面板,可管多个 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 hi@elvin.vip主要博客 http://blog.elvin.vip

Sourcehttps://gitee.com/alivv/ansible-app2k8s

https://github.com/alivv/ansible-app2k8s

标签:

学生党送闺蜜什么礼物手工,强烈推荐制作燧石敲击工具,让TA快速点燃生活的乐趣-世界短讯

2023-06-25 10:33:20

无缘亚运,27岁王艺迪前往日本打球?19时官宣,大迪做最好选择 独家

2023-06-25 10:32:38

数字文明尼山对话预热宣传片《过去未去,未来已来》发布

2023-06-25 10:24:02

电价调整情况说明(电价调整)

2023-06-25 10:21:42

长期医疗和百万医疗哪个好?可靠吗?|天天观速讯

2023-06-25 10:20:25

靶向治理领导干部违规插手等问题 斩断工程建设领域腐败利益链 天天热推荐

2023-06-25 10:18:21

外提“颜值”,内挖“底蕴”——

2023-06-25 10:15:40

明确164项重点工作 商务部印发《自贸试验区重点工作清单(2023—2025年)》-天天资讯

2023-06-25 10:14:51

环球微头条丨牧场物语双子村卡米尔结婚攻略(牧场物语双子村卡米尔)

2023-06-25 10:13:48

全球最新:王思聪现身成都电音节,多名保镖开道阵仗大,还带了三位长发美女

2023-06-25 10:12:29

小鸡宝宝考考你浓白色的羊肉汤骨头汤里白色的主要是什么 环球热头条

2023-06-25 09:59:37

每日热议!知乎周源回应黄渊普实名举报:将调整匿名功能,社区不欢迎人身攻击

2023-06-25 09:58:18

时隔3年广东端午龙船饭再现,1800围共饮共食看呆老外,太震撼了

2023-06-25 09:56:10

天天精选!水芹炒香干做法?

2023-06-25 09:49:40

人工智能如何应对气候变化

2023-06-25 09:47:22
x 广告
x 广告

Copyright ©  2015-2022 每日云南网版权所有  备案号:京ICP备12018864号-37   联系邮箱:291 323 6@qq.com