CICD
工具做DevOps
kubectl
客户端连接即可)原理很简单,使用ansible
管理模板,调用kubectl
执行部署
ansible-templates -> deploy.yml -> kubectl -> kubenertes
执行过程使用tag
标记,如-t deploy
执行deploy
部分
根据执行过程,大致分为以下步骤模块
模板目录 roles/k8s/templates
根据服务类别分为如下子目录
jetty
的服务构建和部署模板针对不同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
运行截图
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
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 ./
为保证运行
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
本实例把多个功能部署在 docker-build 单节点
为了安全,实际可根据需求可拆分为多个节点
配置 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
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
拷贝
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
#查看帮助 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
#查看列表 ansible-playbook k8s.yml -i env/dev -D -t pushlist #推送所有(有点耗时) ansible-playbook k8s.yml -i env/dev -D -t push -e pushlist=all
#查看yml列表 ansible-playbook k8s.yml -i env/dev -D -t initlist #执行所有 ansible-playbook k8s.yml -i env/dev -D -t init -e initlist=all
#警报通知使用钉钉机器人,需要改为自己的机器人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/
#查看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
ansible-playbook k8s.yml -i env/dev -D -t ingress
查看ingress配置,浏览器打开网址查看如下:
#添加本机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
ansible-playbook k8s.yml -i env/dev -D -t rmi,build,deploy -e applist=app-v1
,
分隔多个 tag为便于管理与维护,本实例存储卷PVC
使用静态储存
使用PVC
时挂载路径添加对应服务子路径 subPath
使用 cronJob 每天压缩与清理 PVC 储存的 log 文件
储存实例类型有 NFS、阿里云 NAS、腾讯云 CFS、AWS EFS、Azure Files
路径 roles/k8s/templates/init 前缀是1.4.pvc
的文件
log4j2 配置在 configmap roles/k8s/templates/jetty/configmap/
以下部署 yaml 路径 roles/k8s/templates/init/
8.4.1 https 证书自动续签 cert-manager
官网 https://cert-manager.io
GitHub https://github.com/cert-manager/cert-manager
注意事项:
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
监控方案为 prometheus, 主要包含如下模块:
其它监控相关
prometheus-adapter 容器自动扩容需要
loki 日志储存和查询
promtail 采集日志发送给 loki
监控警报规则
prometheus 采集和警报规则都在 prometheus-config.yml 文件
包含警报规则如下:
grafana 模板
JVM 监控 grafana 视图:
docker-registry 单独部署使用可以查看我博客
https://www.cnblogs.com/elvi/p/13394449.html
服务部署到公有云,推荐直接使用公有云的镜像储存服务
配置里有 3 个镜像仓库地址(公有云分内网和外网地址)
请按需并自行解决安全问题,提示以下注意事项:
使用 Jenkins+ansible+钉钉通知,自动化部署通知:
#更改构建参数后,查看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
Elvin hi@elvin.vip
主要博客 http://blog.elvin.vip
Source
https://gitee.com/alivv/ansible-app2k8s
https://github.com/alivv/ansible-app2k8s