# generic_architecture **Repository Path**: slcnx/generic_architecture ## Basic Information - **Project Name**: generic_architecture - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 2 - **Created**: 2024-10-20 - **Last Updated**: 2025-08-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 通用部署架构指南 这是一个基于 Ansible 的通用部署框架,使用 `generic-deploy` 角色来部署各种应用和服务。 ## 框架结构 ``` generic_architecture/ ├── playbooks/ # Ansible playbook 文件 │ ├── clickhouse/ # ClickHouse 数据库部署 │ ├── dns/ # DNS 服务部署 │ ├── kafka/ # Kafka 消息队列部署 │ └── ... # 其他服务部署 ├── custom_configs/ # 应用配置文件 │ ├── clickhouse/ # ClickHouse 配置 │ │ ├── custom_files/ # 应用文件(docker-compose.yaml等) │ │ └── custom_tasks/ # 系统配置任务 │ └── ... # 其他应用配置 ├── roles/ # Ansible 角色 │ └── generic-deploy/ # 通用部署角色 └── hosts # 主机清单文件 ``` ## 环境准备 https://docs.ansible.com/ansible/latest/installation_guide/installation_distros.html#installing-ansible-on-ubuntu ### 环境初始化 ```bash # 配置vim自动备份功能 ansible-playbook playbooks/init/vim-back.yaml ``` ### SSH免密配置 #### 配置步骤 1. 进入SSH配置目录: ```bash cd playbooks/ssh/ ``` 2. 修改hosts文件,添加目标主机信息: ```ini # 目标主机IP列表 192.168.102.233 192.168.102.234 192.168.102.235 [all:vars] # SSH连接用户名 ansible_ssh_user=slc # SSH连接密码 ansible_ssh_pass=123 # 启用特权提升 ansible_become=yes # 特权提升密码 ansible_become_pass=123 ``` 3. 运行ansible playbook进行配置: ```bash ansible-playbook setup-root-ssh.yml -i hosts ``` #### 功能说明 - 自动在当前主机生成SSH密钥对 - 自动将公钥分发到目标主机 - 自动配置目标主机的known_hosts - 自动设置适当的权限 - 支持批量配置多台主机 #### 注意事项 - 确保hosts文件中的用户名和密码正确 - 确保目标主机可以通过SSH访问 - 配置完成后可以通过 `ssh root@目标IP` 直接登录,无需密码 ## 基础服务配置 ### Supervisor 配置及监控 ```bash # 安装 Supervisor ansible-playbook playbooks/supervisor/install.yml # 配置 Supervisor 监控 ansible-playbook playbooks/prometheus/01-deploy-node-exporter.yml ``` 1. 验证supervisor是否能正常监控, 看到以下内置的应用tail正常即表示OK ```bash root@slc:/etc/supervisord# curl -s localhost:9100/metrics | grep super | head node_scrape_collector_duration_seconds{collector="supervisord"} 0.00974946 node_scrape_collector_success{collector="supervisord"} 1 # HELP node_supervisord_exit_status Process Exit Status # TYPE node_supervisord_exit_status gauge node_supervisord_exit_status{group="tail",name="tail"} 0 # HELP node_supervisord_start_time_seconds Process start time # TYPE node_supervisord_start_time_seconds counter node_supervisord_start_time_seconds{group="tail",name="tail"} 1.73588782e+09 # HELP node_supervisord_state Process State # TYPE node_supervisord_state gauge ``` 2. 告警规则, custom_configs/supervisord/custom_files/supervisor.rules,放在prometheus的rules目录下 3. grafana的json. custom_configs/supervisord/custom_files/supervisor.json, 导入到grafana ### Kubernetes 工具 ```bash # 安装 kubectl ansible-playbook playbooks/canal-cluster/kubectl.yml # 安装 helm ansible-playbook playbooks/canal-cluster/helm.yml ``` ### DNS 服务 ```bash # 安装配置 DNS 服务 ansible-playbook playbooks/dns/install.yml ``` ### Docker 环境 ```bash # 安装 Docker ansible-playbook playbooks/docker/install.yml ``` ### Registry 私有镜像仓库 ```bash # 部署私有镜像仓库 ansible-playbook playbooks/registry/install.yml ``` ### Yearning SQL审核平台 ```bash # 安装 Yearning SQL审核平台 ansible-playbook playbooks/sql/yearning-install.yml ``` 访问地址: http://:8000 默认登录账号: - 用户名: admin - 密码: Yearning_admin 使用方法: 1. 设置-进阶-自定义环境-添加环境,例如:test 2. 管理-流程-添加流程,例如:审核+执行、执行 3. 管理-数据源-匹配流程和环境-添加数据库,设置负责人 4. 管理-用户-添加用户,分配权限,对什么数据库有CURD权限。 5. 普通用户登陆后,查询数据、提交工单进行变更。 6. 管理员审核SQL,同意变更。 7. 管理员审核SQL,同意执行。 ### ClickHouse 数据库 ```bash # 部署 ClickHouse 数据库 ansible-playbook playbooks/clickhouse/install.yml ``` 访问地址: - HTTP 接口: http://:8123 - TCP 接口: :9000 功能特性: - 高性能列式数据库,适用于 OLAP 场景 - 支持实时数据分析和大数据处理 - 内置示例数据库和表结构 - 支持 SQL 查询和 REST API - 自动健康检查和数据持久化 使用方法: 1. 配置主机清单,在 `[clickhouse]` 组下添加服务器 2. 执行部署命令完成安装 3. 使用 HTTP 接口进行查询:`curl 'http://your-ip:8123/' --data-binary "SELECT version()"` 4. 使用客户端连接:`./custom_configs/clickhouse/custom_files/manage.sh client` 5. 查看服务状态:`./custom_configs/clickhouse/custom_files/manage.sh status` 管理脚本: - 启动服务:`./manage.sh start` - 停止服务:`./manage.sh stop` - 查看日志:`./manage.sh logs` - 备份数据:`./manage.sh backup` ## VPN 服务配置 ### PPTP 配置 ```bash # 安装 PPTP ansible-playbook playbooks/pptp.yml # 安装网络命名空间 ansible-playbook playbooks/netns.yml ``` Windows PPTP 连接配置: - 服务器: 你的 PPTP 主机 IP - 用户名: pptptest - 密码: 123456 - 测试: ping 10.24.0.2 ### L2TP/IPSec 配置 ```bash ansible-playbook playbooks/l2tp_ipsec/l2tp.yml ansible-playbook playbooks/l2tp_ipsec/strongswan.yml ``` ## 消息队列配置 ### Kafka 集群部署 ```bash # ZooKeeper + Kafka 模式 ansible-playbook playbooks/kafka/zk.yml ansible-playbook playbooks/kafka/kafka.yml # Kafka KRaft 模式 ansible-playbook playbooks/kafka/kraft.yml ``` ### Kafka 容器部署 ```bash # 单机部署 cd playbooks/kafka/docker/ docker compose up --build # k8s部署 cd playbooks/kafka/docker/ docker compose build --push ## 更新镜像到custom_configs/k8s-kafka/yml/目录中kafka-statefulset.yaml zookeeper-statefulset.yaml ansible-playbook playbooks/kafka/k8s-kafka.yml ``` Grafana Dashboard [README](custom_configs/k8s-kafka/README.md) ## 证书管理 ### 一键完成证书签发 ```bash ansible-playbook playbooks/cert/signcert.yml # 一键加载证书 ansible-playbook playbooks/cert/loadcert.yml ``` ## 日志系统配置 (ELK 8.15.1) ### 基础组件安装 ```bash ansible-playbook playbooks/elk/single-es.yml ansible-playbook playbooks/elk/kibana.yml ansible-playbook playbooks/elk/filebeat.yml ``` 配置说明: - 自定义索引 - 2个主分片 - 索引为数据流 - 使用默认索引策略 ### Filebeat 配置 #### 初始化配置(仅需执行一次) ```bash # 添加索引 ./filebeat setup --index-management -c custom_files/00-stdin-multiline-es.yml -E setup.template.enabled=true # 添加 dashboard ./filebeat setup --dashboards -c custom_files/00-stdin-multiline-es.yml ``` #### 控制台输入配置 ```bash # 标准输入到控制台 ./filebeat -e -c custom_files/00-stdin-console.yml # 标准输入到 ES ./filebeat -e -c custom_files/00-stdin-es.yml # JSON 格式到控制台 ./filebeat -e -c custom_files/00-stdin-json-console.yml # JSON 格式到 ES ./filebeat -e -c custom_files/00-stdin-json-es.yml # 多行格式到控制台 ./filebeat -e -c custom_files/00-stdin-multiline-console.yml # 多行格式到 ES ./filebeat -e -c custom_files/00-stdin-multiline-es.yml ``` #### 日志采集配置 ```bash # Rsyslog 到控制台 ./filebeat -e -c custom_files/01-rsyslog-console.yml # Rsyslog 到 ES ./filebeat -e -c custom_files/01-rsyslog-es.yml # Nginx 到控制台 ./filebeat -e -c custom_files/02-nginx-json-console.yml # Nginx 到 ES ./filebeat -e -c custom_files/02-nginx-json-es.yml # Java 多行到 ES ./filebeat -e -c custom_files/04-java-multiline-es.yml ``` ### 批量添加索引别名 ```bash # 支持: # - 添加多个索引 # - 指定副本、分片数 # - 配置热存储大小和时间 # - 配置温存储、冷存储和删除时间 ansible-playbook playbooks/01-ES/add-multi-index.yml ``` ## 日志分析 Nginx+Clickhouse vector -> clickhouse -> grafana ``` cd playbooks/nginx_clickhouse ansible-playbook install.yml -e deploy_hosts=192.168.111.128 -e custom_dir=/root/generic_architecture/ ``` ## ClickHouse 数据分析平台 ### 独立部署 ClickHouse ```bash # 部署 ClickHouse 数据库服务 ansible-playbook playbooks/clickhouse/install.yml ``` ### 数据分析场景 ClickHouse 适用于以下数据分析场景: - **日志分析**: 网站访问日志、应用日志、系统日志分析 - **实时监控**: 系统指标、业务指标实时分析 - **用户行为分析**: 用户访问轨迹、行为漏斗分析 - **商业智能**: 销售数据分析、财务报表生成 - **IoT 数据处理**: 传感器数据、设备状态监控 ### 示例查询 ```sql -- 查看用户访问统计 SELECT country, COUNT(*) as access_count, AVG(response_time_ms) as avg_response_time FROM example_db.user_access_log GROUP BY country; -- 查看销售数据分析 SELECT category, SUM(price * quantity) as total_sales, COUNT(*) as order_count FROM example_db.product_sales GROUP BY category; -- 系统性能监控 SELECT server_name, AVG(cpu_usage) as avg_cpu, MAX(memory_usage) as max_memory FROM example_db.system_metrics WHERE timestamp >= now() - INTERVAL 1 HOUR GROUP BY server_name; ``` ## Filebeat+ES+Prometheus+Alertmanager错误日志监控钉钉告警方案 ```bash ansible-playbook playbooks/elk/es-alert-install.yml ``` ## Canal 中间件集群部署 参考: https://www.cnblogs.com/crazymakercircle/p/17000177.html#autoid-h3-1-12-7 功能: 基于 MySQL 数据库 binlog 日志进行增量日志解析和导出 导出目标: 1. TCP(默认) - 需要 SDK 连接 TCP 11111 或连接 zookeeper 获取活动节点 - 一次消费一个实例 - 消息只能被消费一次 2. 消息队列 - 支持 RocketMQ、Kafka、RabbitMQ - 客户端可从队列顺序加载 ### 部署步骤 ```bash # 部署 kubectl ansible-playbook playbooks/canal-cluster/kubectl.yml # 部署 helm ansible-playbook playbooks/canal-cluster/helm.yml # 使用 kubectl 安装 canal cluster ansible-playbook playbooks/canal-cluster/canal.yml ``` ## Kubernetes 二进制部署 - 已验证 (v1.31.4) - ### 一键部署 ```bash bash 01.generate-cert.sh bash 02.deploy-etcd.sh bash 03.deploy-master.sh bash 04.deploy-worker.sh bash 05.deploy-cni.sh bash 06.deploy-others.sh ``` ### 证书过期 只签发10天的CA,1天的其他证书, 验证。 ```bash #清理每个worker节点上的 kubelet server证书。 metrics-server 连接节点获取metrics使用。 #kubectl logs, kubectl exec, kubectl port-forward 使用。 ansible workers -m shell -a 'rm -rf /data/kubernetes/pki/system\:node\:*' #再执行所有脚本01-06,即重新生成所有证书、admin.kubeconfig、组件kubeconfig、等 ``` ### containerd.io 版本兼容性 (可选) Kubernetes 与Containerd 的版本兼容性:https://containerd.io/releases/#kubernetes-support Docker 与Containerd 的版本兼容性 ``` apt-cache show docker-ce | grep -A10 "Version:" | grep -E 'Version|containerd.io' ``` 准备docker, containerd源 https://developer.aliyun.com/mirror/docker-ce?spm=a2c6h.13651102.0.0.3e221b11Fr726C ``` # step 1: 安装必要的一些系统工具 sudo apt-get update sudo apt-get install ca-certificates curl gnupg # step 2: 信任 Docker 的 GPG 公钥 sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # Step 3: 写入软件源信息 echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # Step 4: 安装Docker sudo apt-get update ``` 安装containerd ``` apt install containerd.io=xxx ``` 安装docker ``` apt install docker-ce=xxx ``` ### 证书并行生成 ```bash # localhost 编译出pki ansible-playbook playbooks/l2tp_ipsec/strongswan.yml -e deploy_hosts='localhost' # localhost清理证书 rm -rf /data/kubernetes/pki # 生成etcd证书 ansible-playbook ../../playbooks/cert/etcd.yml # 生成集群所需的证书,CA 10年有效期,组件证书1年有效期 # 使用 kubeapi.songliangcheng.com.cn作为高可用的kube-apiserver入口,我们先添加解析。 ansible-playbook ../../playbooks/cert/kubernetes.yml # 生成 Worker 节点证书 # 说明:由于自动签发 kubelet server 证书存在问题,我们采用手工生成方式 # 这些证书用于 kubectl logs、exec、port-forward 等操作 ansible-playbook ../../playbooks/cert/worker.yml ``` ### ETCD集群 - 启动集群 ```bash # localhost 成证书 # 复制证书到233,234,236 # 启动集群 cd playbooks/kubernetes/ # 更新hosts ansible-playbook deploy-etcd.yml ``` - 验证集群 ```bash ETCDCTL_API=3 /opt/etcd/etcdctl \ --endpoints=https://localhost:2379 \ --cacert=/data/kubernetes/pki/etcd/ca-cert.pem \ --cert=/data/kubernetes/pki/etcd/kube-etcd-cert.pem \ --key=/data/kubernetes/pki/etcd/kube-etcd-key.pem \ endpoint health -w table ETCDCTL_API=3 /opt/etcd/etcdctl \ --endpoints=https://localhost:2379 \ --cacert=/data/kubernetes/pki/etcd/ca-cert.pem \ --cert=/data/kubernetes/pki/etcd/kube-etcd-cert.pem \ --key=/data/kubernetes/pki/etcd/kube-etcd-key.pem \ endpoint status -w table ETCDCTL_API=3 /opt/etcd/etcdctl \ --endpoints=https://localhost:2379 \ --cacert=/data/kubernetes/pki/etcd/ca-cert.pem \ --cert=/data/kubernetes/pki/etcd/kube-etcd-cert.pem \ --key=/data/kubernetes/pki/etcd/kube-etcd-key.pem \ member list -w table ``` ### ETCD备份 为确保集群数据安全,建议配置定时备份etcd数据: ```bash # 配置etcd定时备份任务 ansible-playbook playbooks/kubernetes/kubernetes-cron-backup.yaml ``` 备份脚本功能: - 每天凌晨00:00自动备份etcd数据 - 备份文件保存在/data/backups/etcd目录 - 自动保留最近7天的备份 - 记录详细备份日志到/var/log/etcd-backup.log 如果需要恢复etcd数据,可以使用以下命令: ``` # 注意: db快照得在ansible节点上。 playbooks/kubernetes# ansible-playbook playbooks/kubernetes/kubernetes-restore.yaml -e bf=/data/backups/etcd/etcd-data-2025-03-20-093139.db # 注意: 也可以是一个数据目录,这个目录获取,得先停止所有服务:systemctl stop kube-apiserver kube-controller-manager kube-scheduler etcd kubelet kube-proxy containerd,再拷贝数据目录。 playbooks/kubernetes# ansible-playbook kubernetes-restore.yaml -e bf=/root/etcd.bak ``` ### 1. 主机配置 在 `hosts` 文件中配置节点信息和全局变量: - 虚拟网络 - POD网络 - proxy_http 配置windows代理,用来下载安装包 kubernetes-node, kubernetes-master, cni,会下载到ansible执行节点的/data/caches/archives/目录下 - proxy_https ### 3. 部署 Master 节点 ```bash # 临时将vip指向第1个master ansible-playbook deploy-temp-vip.yml # 部署 Master 组件 (kube-apiserver, kube-controller-manager, kube-scheduler) ansible-playbook deploy-master.yml # 添加自动补全kubectl,并复制admin.kubeconfig到/root/.kube/config 在首个master节点 ansible-playbook deploy-kubectl-completion.yml ``` ### 4. 部署 Worker 节点 ```bash # 部署containerd ansible-playbook deploy-containerd.yml # 部署 Worker 组件 (kubelet, kube-proxy) ansible-playbook deploy-worker.yml ``` ### 5. 部署 CNI 网络插件 ```bash # 部署容器网络接口 ansible-playbook deploy-cni.yml ``` 注意事项: - 确保已经完成 ETCD 集群的部署,参考上面 - worker的运行时为containerd时,需要配置 ``` ###################################################### # containerd 配置 开始 /etc/containerd/config.toml ######################################################## . .. ... sandbox = 'registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.10' . .. ... [plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.runc.options] . .. ... ShimCgroup = '' SystemCgroup = true . .. ... [plugins.'io.containerd.cri.v1.images'.registry] config_path = '/etc/containerd/certs.d' ###################################################### # containerd 配置 结束 ######################################################## root@song2204:/etc/kubernetes# tree /etc/containerd/certs.d/ /etc/containerd/certs.d/ └── docker.io └── hosts.toml 2 directories, 1 file root@song2204:/etc/kubernetes# cat /etc/containerd/certs.d/docker.io/hosts.toml server = "https://docker.io" [host."https://docker.rainbond.cc"] capabilities = ["pull", "resolve","push"] ``` - 检查节点间网络连通性 - 确保所需的内核模块已加载 (overlay, br_netfilter, ip_vs 等) - 所有证书路径默认在 kubernetes_pki 目录下 #### 6. DNS 配置 DNS 配置包括两个主要组件: - CoreDNS:作为集群的主 DNS 服务 - NodeLocal DNSCache:在每个节点上运行的本地 DNS 缓存 ```bash ansible-playbook -i hosts deploy-dns.yml # 验证dns k run myapp --image=busybox --rm --restart=Never -it -- ping www.baidu.com -c 1 ``` 主要特性: - 支持集群内外域名解析 - 本地 DNS 缓存加速查询 - 防止 DNS 查询风暴 - 优化的缓存策略和并发控制 配置说明: - CoreDNS 和 NodeLocal DNSCache 使用 `/etc/resolv.conf` 作为上游 DNS. kubelet配置 /run/systemd/resolve/resolv.conf为容器DNS。 - NodeLocal DNSCache 在每个节点上运行,使用 169.254.123.123 作为本地 IP - 支持自定义域名和缓存配置 注意事项: 1. 确保 `DNS_CACHE_ENABLED=1` 时,kubelet 配置会自动使用 NodeLocal DNSCache 2. 可以通过修改 `UPSTREAMNAMESERVER` 变量来自定义上游 DNS 服务器 3. DNS 缓存配置已优化,支持高并发查询 ### 7. 部署插件 #### 1. 部署 Dashboard 和 Metrics Server ```bash # 部署证书,metrics-server 服务端(给聚合层使用,访问 Metrics Server),proxy-client(给 API Server 使用,访问聚合层),client(给 Metrics Server 使用,访问 kubelet) ansible-playbook -i hosts playbooks/cert/addon.yml # 部署插件 ansible-playbook -i hosts deploy-addons.yml ``` #### 2. 访问 Dashboard 导出我们签发的/data/kubernetes/pki/ca-cert.pem, 在windows上导入ca-cert.crt (重命名) 1. 获取访问令牌: ```bash # 获取访问令牌 kubectl -n kubernetes-dashboard create token admin-user ``` 2. 访问方式: - NodePort方式:通过 `https://<节点IP>:30443` 访问 - 代理方式: ```bash kubectl proxy ``` 然后访问:`http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/` #### 3. 验证 Metrics Server ```bash # 查看节点指标 kubectl top nodes # 查看Pod指标 kubectl top pods -A ``` 注意事项: 1. Metrics Server 需要几分钟时间收集指标 2. 如果出现证书错误,已在配置中添加了 `--kubelet-insecure-tls` 参数 3. 确保节点时间同步,否则可能影响指标收集 #### 4. Metrics Server 认证授权流程 [Kubectl/HPA] ---(ServiceAccount/RBAC)---> [API Server] ---(proxy-client-cert)---> [Aggregation Layer/APIService] ---(requestheader-auth)---> [Metrics Server] ---(kubelet-client-cert)---> [Kubelet] 认证授权流程详细说明: 1. Kubectl/HPA通过ServiceAccount令牌访问API Server,使用RBAC进行授权 - ServiceAccount:为Pod提供身份认证和授权 - RBAC:基于角色的访问控制,定义了访问控制策略 2. API Server使用proxy-client证书访问聚合层,APIService资源定义了metrics.k8s.io API组的服务发现 - proxy-client证书:API Server访问聚合层的客户端证书 - APIService资源:注册metrics.k8s.io API组到API Server - caBundle:APIService中的CA证书,用于验证Metrics Server服务端证书 ``` # 1. 获取证书的base64 base64 /data/kubernetes/pki/metrics-server-cert.pem -w 0 # 2. 对base64解码获取证书 base64 /data/kubernetes/pki/metrics-server-cert.pem -w 0 |base64 -d | openssl x509 -in - -noout -text ``` 3. 聚合层通过请求头认证(X-Remote-User等)将身份传递给Metrics Server - 请求头认证:将用户身份信息传递给Metrics Server - TLS认证:使用caBundle验证Metrics Server服务端证书 4. Metrics Server使用kubelet客户端证书访问各节点的kubelet获取指标 - kubelet客户端证书:Metrics Server访问kubelet的客户端证书 1. API Server配置参数: ```bash # 代理客户端证书 --proxy-client-cert-file=/certs/kube-apiserver-proxy-client-cert.pem --proxy-client-key-file=/certs/kube-apiserver-proxy-client-key.pem # 请求头认证 --requestheader-client-ca-file=/certs/ca-cert.pem --requestheader-allowed-names= --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User ``` 2. Metrics Server配置参数: ```bash # API服务认证 --tls-cert-file=/certs/tls.crt --tls-private-key-file=/certs/tls.key --requestheader-client-ca-file=/certs/ca.crt # Kubelet访问认证 --kubelet-client-certificate=/certs/client.crt --kubelet-client-key=/certs/client.key --kubelet-certificate-authority=/certs/ca.crt ``` 3. 证书配置: ```yaml # API Server代理证书 CN: "kube-apiserver-proxy-client" O: "system:masters" # Metrics Server证书 CN: "system:metrics-server" O: "system:metrics-server" ``` 4. RBAC配置: ```yaml # Metrics Server聚合API权限 ClusterRole: system:metrics-server Resources: - "/metrics" - "/metrics/*" - "/api/*" Verbs: ["get", "list", "watch"] # 客户端读取指标权限 ClusterRole: system:aggregated-metrics-reader Resources: - "pods" - "nodes" - "namespaces" - "pods/metrics" - "nodes/metrics" - "namespaces/metrics" Verbs: ["get", "list", "watch"] # 权限绑定 Subjects: - ServiceAccount: metrics-server # Pod使用的服务账号,用于取指标 - User: system:metrics-server # 证书用户,用于读取指标 - Group: system:metrics-server # 证书用户组,用于读取指标 ``` #### 5. 部署 Dynamic Storage Class https://github.com/iKubernetes/learning-k8s/tree/master/OpenEBS ## 开发环境配置 ```bash ansible-playbook playbooks/develop/setup_env.yml cursor <配置的项目目录> ``` ## Nginx多站点多版本维护部署 ### 功能说明 - 支持基于Git版本的部署和回滚 - 支持金丝雀发布策略 - 支持多版本管理, 默认保留15个版本 - 支持自定义部署标题 - 支持指定部署用户, 将运行工作目录ownership到指定用户 - 支持共享目录配置,.env、storage/app/public等 ### 依赖准备 - Ansible执行节点安装NodeJS, 发布Vue、React、Next.JS等项目需要。 ```bash ansible-playbook playbooks/develop/setup_node.yml -e "deploy_hosts=localhost" ``` - Ansible执行节点安装php, 发布php项目需要。 略,自行完成php编译部署、模块编译 ### 部署配置 #### 1. 更新部署主机 编辑hosts文件,将需要部署的服务器添加到web_servers组: ```ini [web_servers] 192.168.102.136 192.168.102.234 192.168.102.236 ``` #### 2. 部署命令语法 ```bash ansible-playbook playbooks/web-deploy/deploy.yml [参数列表] 必填参数: -e "playbook_name=<应用名称>" # 应用配置目录名称,对应custom_web_configs下的目录 -e "deploy_title=<部署说明>" # 部署说明,用于记录部署历史 -e "deploy_hosts=<目标主机列表>" # 部署目标主机,多个主机用逗号分隔 部署时必填: -e "git_repo=<仓库地址>" # Git仓库地址 -e "git_version=" # Git版本号、分支名或标签名 回滚时必填: -e "rollback_mode=true" # 启用回滚模式 -e "rollback_commit=<版本号>" # 回滚到指定的Git版本号(可选,为空则回滚到上一个版本) 可选参数: -e "deploy_user=<部署用户>" # 部署用户,默认为www -e "versions_keep=<保留版本数>" # 保留的历史版本数量,默认15个 -e "git_depth=<克隆深度>" # Git克隆深度,1表示只克隆最新版本 -e '{ "shared_files": [ # 需要共享的文件列表 ".env", "config/app.php" ], "shared_dirs": [ # 需要共享的目录列表 "storage/app/public", "storage/logs" ], "rsync_exclude": [ # 同步时需要排除的文件或目录 ".git", "node_modules", "tests" ] }' ``` #### 3. 部署示例 ##### 3.1 基础部署 ```bash # 部署指定版本到单台服务器 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-vue-demo" \ -e "deploy_title='部署测试环境'" \ -e "git_version=02ab5e2a0c1b788157f80e563122a8455e13152b" \ -e "git_repo=https://gitee.com/slcnx/vue_demo.git" \ -e "deploy_hosts=192.168.102.136" # 部署到多台服务器 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-vue-demo" \ -e "deploy_title='部署生产环境'" \ -e "git_version=02ab5e2a0c1b788157f80e563122a8455e13152b" \ -e "git_repo=https://gitee.com/slcnx/vue_demo.git" \ -e "deploy_hosts=192.168.102.136,192.168.102.234,192.168.102.236" ``` ##### 3.2 回滚操作 ```bash # 回滚单台服务器到上一个版本 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-vue-demo" \ -e "deploy_title='回滚测试环境'" \ -e "deploy_hosts=192.168.102.136" \ -e "rollback_mode=true" # 回滚多台服务器到指定版本 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-vue-demo" \ -e "deploy_title='回滚生产环境'" \ -e "deploy_hosts=192.168.102.136,192.168.102.234,192.168.102.236" \ -e "rollback_mode=true" \ -e "rollback_commit=02ab5e2a0c1b788157f80e563122a8455e13152b" ``` ##### 3.3 高级部署 ###### 3.3.1 金丝雀发布 金丝雀发布支持多步骤部署,步骤类型包括: - setWeight:设置要部署的服务器比例(1-100) - 计算公式:本批次部署主机数 = ROUND_UP(总主机数 * setWeight / 100) - 主机选择: 1. 先获取未部署主机列表:deploy_host_list - deployed_hosts 2. 从未部署主机列表中按顺序选择本批次需要的数量 - 示例计算: ``` # 假设6台主机:A, B, C, D, E, F (按主机名排序) 第一批 setWeight: 10 - 计算主机数:ROUND_UP(6 * 10 / 100) = ROUND_UP(0.6) = 1台 - 未部署主机列表:[A, B, C, D, E, F] - 本批选择前1台:[A] - 已部署:[A] 第二批 setWeight: 50 - 计算主机数:ROUND_UP(6 * 50 / 100) = ROUND_UP(3) = 3台 - 未部署主机列表:[B, C, D, E, F] - 本批选择前3台:[B, C, D] - 已部署:[A, B, C, D] 第三批 setWeight: 100 - 计算主机数:ROUND_UP(6 * 100 / 100) = 6台 - 未部署主机列表:[E, F] - 本批选择所有:[E, F] - 已部署:[A, B, C, D, E, F] ``` - 计算逻辑说明: 1. 计算本批次应部署的主机数:ROUND_UP(总主机数 * setWeight / 100) 2. 获取未部署主机列表:总主机列表中排除已部署主机 3. 从未部署主机列表中按顺序选择需要的数量 4. 更新已部署主机列表,用于下一批次计算 - pause:暂停等待 - duration参数: - s:秒,例如:30s - m:分钟,例如:5m - h:小时,例如:1h - 特殊情况: - 不设置duration或设置为{}:永久暂停,等待用户确认 - duration无效时:会被忽略,等待用户确认 示例1:分两批部署,带暂停观察 ```bash # 部署20%服务器 -> 暂停5分钟 -> 部署剩余主机 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-vue-demo" \ -e "deploy_title='金丝雀发布-两批次'" \ -e "git_version=02ab5e2a0c1b788157f80e563122a8455e13152b" \ -e "git_repo=https://gitee.com/slcnx/vue_demo.git" \ -e "deploy_hosts=192.168.102.136,192.168.102.234,192.168.102.236" \ -e '{ "deploy_strategy": { "canary": { "steps": [ {"setWeight": 20}, {"pause": {"duration": "5m"}}, {"setWeight": 100} ] } } }' ``` 示例2:分三批部署,不同暂停时间 ```bash # 20% -> 暂停30s -> 50% -> 暂停2m -> 部署剩余主机 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-vue-demo" \ -e "deploy_title='金丝雀发布-三批次'" \ -e "git_version=02ab5e2a0c1b788157f80e563122a8455e13152b" \ -e "git_repo=https://gitee.com/slcnx/vue_demo.git" \ -e "deploy_hosts=192.168.102.136,192.168.102.234,192.168.102.236" \ -e '{ "deploy_strategy": { "canary": { "steps": [ {"setWeight": 20}, {"pause": {"duration": "30s"}}, {"setWeight": 50}, {"pause": {"duration": "2m"}}, {"setWeight": 100} ] } } }' ``` 示例3:分批部署带永久暂停 ```bash # 30% -> 永久暂停 -> 60% -> 永久暂停 -> 部署剩余主机 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-vue-demo" \ -e "deploy_title='金丝雀发布-永久暂停'" \ -e "git_version=02ab5e2a0c1b788157f80e563122a8455e13152b" \ -e "git_repo=https://gitee.com/slcnx/vue_demo.git" \ -e "deploy_hosts=192.168.102.136,192.168.102.234,192.168.102.236" \ -e '{ "deploy_strategy": { "canary": { "steps": [ {"setWeight": 30}, {"pause": {}}, {"setWeight": 60}, {"pause": {}}, {"setWeight": 100} ] } } }' ``` 注意事项: 1. setWeight和pause是两种独立的步骤类型 2. 最后一个setWeight步骤必须为100,会部署所有剩余主机 3. setWeight的值必须递增 4. pause的duration参数支持s/m/h后缀,不设置则永久暂停 5. 每个批次会显示详细的部署信息: - 当前步骤序号 - 发布权重百分比 - 本批次部署的主机数量 - 本批次部署的主机列表 - 已发布的主机列表 6. 暂停期间可以观察服务器状态,如有异常可以中断部署 ###### 3.3.2 多语言项目部署配置 ###### 1) 前端项目(Vue/React/Next.js) ```bash # 部署命令 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-vue-demo" \ -e "deploy_title='Vue项目部署'" \ -e "git_version=c206ff596725c1ee1509de58fa530aaa2ea3a65d" \ -e "git_repo=https://gitee.com/slcnx/vue_demo.git" \ -e "deploy_hosts=192.168.102.136" \ -e '{ "shared_files": [ ".env.production" ], "shared_dirs": [ "public/uploads", "logs" ], "rsync_exclude": [ ".git", "node_modules", ".env.development", ".env.local", "tests", "*.log" ] }' # 项目配置目录结构 custom_web_configs/deploy-vue-demo/ ├── pre_deploy/ # 部署前钩子(本地执行) │ ├── 10-install.yml # 安装依赖 │ └── 20-build.yml # 构建项目 └── post_release/ # 发布后钩子(远程执行) └── 10-cache.yml # 清理缓存 # 钩子配置示例 ## pre_deploy/10-install.yml - name: 安装项目依赖 shell: cd {{ checkout_path }} && npm install delegate_to: localhost run_once: true ## pre_deploy/20-build.yml - name: 构建项目 shell: cd {{ checkout_path }} && npm run build delegate_to: localhost run_once: true ## post_release/10-cache.yml - name: 清理Nginx缓存 shell: rm -rf /var/cache/nginx/* become: yes ``` ###### 2) Laravel框架项目 ```bash # 部署命令 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-laravel" \ -e "deploy_title='Laravel项目部署'" \ -e "git_version=main" \ -e "git_repo=https://github.com/your/laravel-project.git" \ -e "deploy_hosts=192.168.102.136" \ -e '{ "shared_files": [ ".env" ], "shared_dirs": [ "storage/app", "storage/app/public", "storage/framework/cache", "storage/framework/sessions", "storage/framework/views", "storage/logs", "bootstrap/cache" ], "rsync_exclude": [ ".git", "vendor", "node_modules", "tests", "*.log", ".env.example" ] }' # 项目配置目录结构 custom_web_configs/deploy-laravel/ ├── pre_deploy/ # 部署前钩子(本地执行) │ ├── 10-composer.yml # 安装PHP依赖 │ └── 20-optimize.yml # 优化自动加载 ├── pre_release/ # 发布前钩子(远程执行) │ └── 10-permissions.yml # 设置权限 └── post_release/ # 发布后钩子(远程执行) ├── 10-migrate.yml # 执行数据库迁移 ├── 20-cache.yml # 清理缓存 └── 30-reload.yml # 重载PHP-FPM # 钩子配置示例 ## pre_deploy/10-composer.yml - name: 安装Composer依赖 shell: cd {{ checkout_path }} && composer install --no-dev --optimize-autoloader delegate_to: localhost run_once: true ## pre_deploy/20-optimize.yml - name: 优化自动加载 shell: cd {{ checkout_path }} && composer dump-autoload --optimize delegate_to: localhost run_once: true ## pre_release/10-permissions.yml - name: 设置目录权限 file: path: "{{ release_path }}/{{ item }}" state: directory mode: '0755' owner: "{{ deploy_user }}" recurse: yes with_items: - "storage" - "bootstrap/cache" ## post_release/10-migrate.yml - name: 执行数据库迁移 shell: cd {{ webroot_path }} && php artisan migrate --force when: inventory_hostname == deploy_host_list[0] ## post_release/20-cache.yml - name: 清理Laravel缓存 shell: | cd {{ webroot_path }} php artisan config:clear php artisan cache:clear php artisan view:clear php artisan route:clear ## post_release/30-reload.yml - name: 重载PHP-FPM systemd: name: php-fpm state: reloaded become: yes ``` ###### 3) ThinkPHP框架项目 ```bash # 部署命令 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-thinkphp" \ -e "deploy_title='ThinkPHP项目部署'" \ -e "git_version=master" \ -e "git_repo=https://github.com/your/thinkphp-project.git" \ -e "deploy_hosts=192.168.102.136" \ -e '{ "shared_files": [ ".env", "config/database.php" ], "shared_dirs": [ "runtime/cache", "runtime/log", "runtime/temp", "public/uploads" ], "rsync_exclude": [ ".git", "vendor", "runtime/cache/*", "runtime/log/*", "runtime/temp/*", "*.log", ".env.example" ] }' # 项目配置目录结构 custom_web_configs/deploy-thinkphp/ ├── pre_deploy/ # 部署前钩子(本地执行) │ ├── 10-composer.yml # 安装PHP依赖 │ └── 20-optimize.yml # 优化自动加载 ├── pre_release/ # 发布前钩子(远程执行) │ └── 10-permissions.yml # 设置权限 └── post_release/ # 发布后钩子(远程执行) ├── 10-cache.yml # 清理缓存 └── 20-reload.yml # 重载PHP-FPM # 钩子配置示例 ## pre_deploy/10-composer.yml - name: 安装Composer依赖 shell: cd {{ checkout_path }} && composer install --no-dev delegate_to: localhost run_once: true ## pre_deploy/20-optimize.yml - name: 优化自动加载 shell: cd {{ checkout_path }} && composer dump-autoload --optimize delegate_to: localhost run_once: true ## pre_release/10-permissions.yml - name: 设置目录权限 file: path: "{{ release_path }}/{{ item }}" state: directory mode: '0755' owner: "{{ deploy_user }}" recurse: yes with_items: - "runtime" - "public/uploads" ## post_release/10-cache.yml - name: 清理ThinkPHP缓存 file: path: "{{ webroot_path }}/runtime/{{ item }}" state: absent with_items: - "cache" - "temp" ## post_release/20-reload.yml - name: 重载PHP-FPM systemd: name: php-fpm state: reloaded become: yes ``` ###### 4) Node.js后端项目 ```bash # 部署命令 ansible-playbook playbooks/web-deploy/deploy.yml \ -e "playbook_name=deploy-node" \ -e "deploy_title='Node.js项目部署'" \ -e "git_version=main" \ -e "git_repo=https://github.com/your/node-project.git" \ -e "deploy_hosts=192.168.102.136" \ -e '{ "shared_files": [ ".env", "config/production.json" ], "shared_dirs": [ "logs", "uploads", "tmp", "sessions" ], "rsync_exclude": [ ".git", "node_modules", "test", "logs/*", "*.log", ".env.example", ".env.test" ] }' # 项目配置目录结构 custom_web_configs/deploy-node/ ├── pre_deploy/ # 部署前钩子(本地执行) │ ├── 10-install.yml # 安装依赖 │ └── 20-build.yml # 构建项目 └── post_release/ # 发布后钩子(远程执行) └── 10-pm2.yml # 重启PM2进程 # 钩子配置示例 ## pre_deploy/10-install.yml - name: 安装项目依赖 shell: cd {{ checkout_path }} && npm ci delegate_to: localhost run_once: true ## pre_deploy/20-build.yml - name: 构建项目 shell: cd {{ checkout_path }} && npm run build delegate_to: localhost run_once: true ## post_release/10-pm2.yml - name: 重启PM2应用 shell: cd {{ webroot_path }} && pm2 reload ecosystem.config.js --env production ``` 注意事项: 1. 共享文件配置: - 仅共享包含敏感信息的配置文件(如:.env, database.php) - 示例配置文件(如:.env.example)不需要共享 - 代码仓库中的配置文件模板不需要共享 2. 共享目录配置: - 共享需要持久化的目录(上传文件、日志、缓存等) - 共享目录权限需要确保运行用户可写 3. 排除规则配置: - 排除版本控制目录(.git) - 排除依赖目录(node_modules, vendor) - 排除测试目录和文件 - 排除示例配置文件 - 排除日志文件 4. 钩子配置: - pre_deploy: 在本地执行构建、编译等操作(使用delegate_to: localhost和run_once: true确保只执行一次) - pre_release: 在远程执行权限设置等操作 - post_release: 在远程执行缓存清理、服务重启等操作 ## Jenkins CICD ### 1. 部署Jenkins https://www.jenkins.io/doc/book/installing/ - 新系统使用package安装,新版本 - 旧版本系统docker安装,新版本 - 新版本才有plugins对应 [配置service](https://www.jenkins.io/doc/book/system-administration/systemd-services/) ``` # 更新编辑器 vim update-alternatives --config editor ``` [安装java](https://www.jenkins.io/doc/book/installing/linux/#installation-of-java) ``` systemctl cat jenkins | grep jdk sudo apt install fontconfig openjdk-<上面的版本>-jre -y ``` [配置system properties](https://www.jenkins.io/doc/book/managing/system-properties/) ``` systemctl edit jenkins [Service] Environment="JAVA_OPTS=-Djava.awt.headless=true -Dhudson.model.DownloadService.noSignatureCheck=true -Dhudson.ProxyConfiguration.DEFAULT_CONNECT_TIMEOUT_MILLIS=60000" Environment="JENKINS_PORT=18080" ``` 配置java: 搜索 [java 17 net properties](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/net/doc-files/net-properties.html) ``` [Service] Environment="JAVA_OPTS=-Dhttps.proxyHost=192.168.120.250 -Dhttps.proxyPort=7890 -Dhttp.proxyHost=192.168.120.250 -Dhttp.proxyPort=7890 -Djava.awt.headless=true -Dhudson.model.DownloadService.noSignatureCheck=true -Dhudson.ProxyConfiguration.DEFAULT_CONNECT_TIMEOUT_MILLIS=60000" Environment="JENKINS_PORT=18080" ``` 如果需要配置即代码(可选配置),[参考文档](https://plugins.jenkins.io/configuration-as-code/),大量[demo](https://github.com/jenkinsci/configuration-as-code-plugin/tree/master/demos) ``` 方式1:CASC_JENKINS_CONFIG 方式2:JENKINS_JAVA_OPTIONS 中添加 -Dcasc.jenkins.config=/jenkins/casc_configs 方式3:默认在 $JENKINS_HOME/jenkins.yaml ``` 配置即代码的[认证](https://github.com/jenkinsci/configuration-as-code-plugin/tree/master/demos/credentials), 使用[secret文件](https://github.com/jenkinsci/configuration-as-code-plugin/blob/master/docs/features/secrets.adoc#using-properties-file), `/run/secrets/secrets.properties` 生成 configuration-as-code的配置文件,http://192.168.102.233:18080/configuration-as-code/viewExport [yaml在线调试](https://yaml-multiline.info/) 启动 ``` systemctl reset-failed systemctl daemon-reload systemctl restart jenkins ``` 配置镜像 ``` # 方案1:使用jsdelivr镜像 cd /var/lib/jenkins/ sed -i.bak 's#https://updates.jenkins.io/update-center.json#https://cdn.jsdelivr.net/gh/lework/jenkins-update-center@master/updates/ustc/update-center.json#gi' hudson.model.UpdateCenter.xml rm -f updates/default.json systemctl restart jenkins # 方案2:使用代理 playbooks/jenkins# ansible-playbook jenkins-proxy.yml -e custom_dir=/data/caches/generic_architecture cd /var/lib/jenkins/ sed -i.bak 's#https://updates.jenkins.io/update-center.json#http://127.0.0.1:1080/update-center.json#gi' hudson.model.UpdateCenter.xml rm -f updates/default.json systemctl restart jenkins ``` 登陆 ``` cat /var/lib/jenkins/secrets/initialAdminPassword ``` ### 2. 部署jenkins工具 ``` cd playbooks/jenkins ansible-playbook deploy-jenkins-tools.yml -e maven_name=maven-399 # /manage/configureTools/, 自定义MAVEN_HOME 为 /var/lib/jenkins/tools/custom_tools/maven-399, 名称maven-399 ``` ### 3. 添加Kubernetes集群 1. /manage/cloud/new 添加新的云: kubeneretes, 类型:kubernetes 2. 配置云 ``` 名称:kubernetes Kubernetes地址:https://kubeapi.songliangcheng.com.cn:6443 Kubernetes 服务证书key: /data/kubernetes/pki/ca-key.pem的内容 禁用证书检查:OK,对地址禁用证书检查 Kubernetes命名空间:jenkins 凭据: Secret text 获取token: playbooks/kubernetes# ansible-playbook deploy-jenkins-dependencies.yml 配置id: jenkins-ns-admin 选择凭据:jenkins-ns-admin 确认无误:点保存 Jenkins地址:当前浏览器URL Jenkins通道:IP:50000,需要安全配置->端口指定为50000 ``` 3. 配置Pod模板 ``` 名称:kube-agent 名称空间:jenkins 标签列表:kubeagent 用法:尽可能使用这个节点 ``` 4. 测试pod agent ``` 新建freestyle: kubernetes-jnlp 限制项目节点:kubeagent 运行任务,观察JOB成功,K8S是否正常创建容器 注意:freestyle仅能使用pod agent中的jnlp agent,使用不了其他容器。使用其他容器需要使用Pipeline ``` 5. 测试pipeline ``` 新建pipeline: kubernetes-pipeline-jnlp 准备jenkins script: playbooks/dsl-jenkins ``` ### 4. 安装jenkins 插件 参考链接:https://github.com/jenkinsci/plugin-installation-manager-tool ``` wget https://github.com/jenkinsci/plugin-installation-manager-tool/releases/download/2.13.2/jenkins-plugin-manager-2.13.2.jar # 安装插件 /usr/lib/jvm/java-17-openjdk-amd64/bin/java -Dhttp.proxyPort=7890 -Dhttp.proxyHost=192.168.120.250 -Dhttps.proxyPort=7890 -Dhttps.proxyHost=192.168.120.250 \ -jar jenkins-plugin-manager-2.13.2.jar -w /usr/share/java/jenkins.war \ --plugin-download-directory test \ --plugins ws-cleanup:0.48 mv test/* /var/lib/jenkins/plugins/ systemctl restart jenkins # 生成yaml /usr/lib/jvm/java-17-openjdk-amd64/bin/java -Dhttp.proxyPort=7890 -Dhttp.proxyHost=192.168.120.250 -Dhttps.proxyPort=7890 -Dhttps.proxyHost=192.168.120.250 \ -jar jenkins-plugin-manager-2.13.2.jar -w /usr/share/java/jenkins.war \ --plugin-download-directory test \ --available-updates --output yaml --plugins ws-cleanup >> plugins.yaml # 基于yaml安装 /usr/lib/jvm/java-17-openjdk-amd64/bin/java -Dhttp.proxyPort=7890 -Dhttp.proxyHost=192.168.120.250 -Dhttps.proxyPort=7890 -Dhttps.proxyHost=192.168.120.250 \ -jar jenkins-plugin-manager-2.13.2.jar -w /usr/share/java/jenkins.war \ --plugin-download-directory /var/lib/jenkins/plugins/ \ --plugin-file plugins.yaml # 示例yaml plugins: - artifactId: "dingding-notifications" source: version: "2.7.3" - artifactId: "build-user-vars-plugin" source: version: "195.v8c35f9d5c3dc" - artifactId: "gitlab-plugin" source: version: "1.9.7" - artifactId: "generic-webhook-trigger" source: version: "2.3.1" - artifactId: "docker-workflow" source: version: "603.va_6964865a_9b_9" ``` ### 5. 调试Jenkinsfile 1. cursor/vscode/windsurf 打开 playbooks/dsl-jenkins 2. 安装工作区推荐的插件 3. 进入jenkins jockey console, 连接jenkins 注意,需要个人的token,而非密码 4. 选择kubernetes-pipeline-jnlp, 右键activate replay session 5. 编辑下面的Replay files 6. 之后切回工作分区,固定mainScript.groovy, 只需要编辑mainScript.groovy, 保存后,ctrl+ship+p, run replay即可。 依次将1-7脚本,放在mainScript.groovy中,保存后,ctrl+ship+p, run replay即可。 ### 6. 部署gitlab ``` # 方案1:k8s需要大量的物理内存 playbooks/kubernetes# ansible-playbook deploy-gitlab-dependencies.yml # 方案2:docker-compose [小内存占用的gogs] playbooks/gogs# ansible-playbook install.yml -e custom_dir=/data/caches/generic_architecture/ 1. 数据库主机: postgres:5432 2. 数据库用户: gogs 3. 数据库密码: gogs 4. 数据库名称: gogs 5. 模式: public 6. 应用名称: gogs 7. 域名: 192.168.102.234 8. SSH 端口号: 10022 9. HTTP 端口号: 3000 10. 应用 URL: http://192.168.102.234:3000 11. 默认分支: main 12. 管理员用户名: slc 13. 管理员密码: admin # 方案3:物理机直接安装gitlab,gitlab-ce官方不可用,使用镜像站点: # https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/ # https://mirrors.aliyun.com/gitlab-ce/ubuntu/pool/xenial/ # [gitlab-ce](https://packages.gitlab.com/gitlab/gitlab-ce/) # 仅有18.04的包 apt install gitlab-ce=16.11.10-ce.0 Thank you for installing GitLab! GitLab was unable to detect a valid hostname for your instance. Please configure a URL for your GitLab instance by setting `external_url` configuration in /etc/gitlab/gitlab.rb file. Then, you can start your GitLab instance by running the following command: sudo gitlab-ctl reconfigure For a comprehensive list of configuration options please see the Omnibus GitLab readme https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/README.md Help us improve the installation experience, let us know how we did with a 1 minute survey: https://gitlab.fra1.qualtrics.com/jfe/form/SV_6kVqZANThUQ1bZb?installation=omnibus&release=16-11 ``` ### 7. gitlab 集成 Jenkins将构建状态推送给gitlab 1. GitLab Create a token named e.g. 'jenkins' with 'api' scope; expiration is optional 2. Jenkins /manage/configure 页面配置gitlab名称、连接、点击"添加"按钮添加凭证,选择"GitLab API 令牌"作为凭证类型,并将您的 GitLab 用户 API 密钥粘贴到"API 令牌"字段中,点击"测试连接"按钮;它应该成功. gitlab事件(push、pr添加或更新)推送给jenkins 1. [全局URL,不需要配置密钥令牌](https://plugins.jenkins.io/gitlab-plugin/#plugin-content-configuring-global-authentication) 2. [项目URL,每个JOB生成独立停牌](https://plugins.jenkins.io/gitlab-plugin/#plugin-content-configuring-per-project-authentication) 作业设置 1. 触发项目时,会携带大量的[变量](https://plugins.jenkins.io/gitlab-plugin/#plugin-content-defined-variables),jenkins可以基于变量克隆。 2. 将构建状态给gitlab, 提交代码或PR UI中可见。 ### 8. 通用webhook 1. 触发 ``` Request parameter: curl -vs "http://localhost:8080/jenkins/generic-webhook-trigger/invoke?token=abc123" 2>&1 Token header: curl -vs -H "token: abc123" "http://localhost:8080/jenkins/generic-webhook-trigger/invoke" 2>&1 It will also detect X-Gitlab-Token. Authorization header of type Bearer : curl -vs -H "Authorization: Bearer abc123" "http://localhost:8080/jenkins/generic-webhook-trigger/invoke" 2>&1 ``` 2. 对请求体解析: post content parameters ``` gitlab 的请求体 ref { "object_kind": "push", "event_name": "push", "before": "a717955aa9b116307514f298d0871033f5fa5b4b", "after": "157214e813bdb8e31045f97e427703567b895922", "ref": "refs/heads/main", "ref_protected": true, "checkout_sha": "157214e813bdb8e31045f97e427703567b895922", "message": null, "user_id": 1, "user_name": "Administrator", "user_username": "root", "user_email": null, "user_avatar": "https://www.gravatar.com/avatar/258d8dc916db8cea2cafb6c3cd0cb0246efe061421dbd83ec3a350428cabda4f?s=80&d=identicon", "project_id": 2, "project": { "id": 2, "name": "new-p", "description": null, "web_url": "http://192.168.102.137/root/new-p", "avatar_url": null, "git_ssh_url": "git@192.168.102.137:root/new-p.git", "git_http_url": "http://192.168.102.137/root/new-p.git", "namespace": "Administrator", "visibility_level": 0, "path_with_namespace": "root/new-p", "default_branch": "main", "ci_config_path": null, "homepage": "http://192.168.102.137/root/new-p", "url": "git@192.168.102.137:root/new-p.git", "ssh_url": "git@192.168.102.137:root/new-p.git", "http_url": "http://192.168.102.137/root/new-p.git" }, "commits": [ { "id": "157214e813bdb8e31045f97e427703567b895922", "message": "first commit\n", "title": "first commit", "timestamp": "2025-02-28T06:17:32+00:00", "url": "http://192.168.102.137/root/new-p/-/commit/157214e813bdb8e31045f97e427703567b895922", "author": { "name": "liangcheng", "email": "[REDACTED]" }, "added": [ ], "modified": [ "README.md" ], "removed": [ ] }, { "id": "d651686988b303ee0f6fd2d97064c53322b646c5", "message": "first commit\n", "title": "first commit", "timestamp": "2025-02-28T06:15:56+00:00", "url": "http://192.168.102.137/root/new-p/-/commit/d651686988b303ee0f6fd2d97064c53322b646c5", "author": { "name": "liangcheng", "email": "[REDACTED]" }, "added": [ ], "modified": [ "README.md" ], "removed": [ ] }, { "id": "a717955aa9b116307514f298d0871033f5fa5b4b", "message": "first commit\n", "title": "first commit", "timestamp": "2025-02-28T06:15:41+00:00", "url": "http://192.168.102.137/root/new-p/-/commit/a717955aa9b116307514f298d0871033f5fa5b4b", "author": { "name": "liangcheng", "email": "[REDACTED]" }, "added": [ ], "modified": [ "README.md" ], "removed": [ ] } ], "total_commits_count": 3, "push_options": { }, "repository": { "name": "new-p", "url": "git@192.168.102.137:root/new-p.git", "description": null, "homepage": "http://192.168.102.137/root/new-p", "git_http_url": "http://192.168.102.137/root/new-p.git", "git_ssh_url": "git@192.168.102.137:root/new-p.git", "visibility_level": 0 } } $.ref $.repository.name $.repository.git_http_url $.repository.git_ssh_url ``` 3. 测试提交 ``` curl -X POST -H "Content-Type: application/json" -d '{ref: 'main'}' http://192.168.102.233:18080/generic-webhook-trigger/invoke?token=abc123 ``` ### 9. Kubernetes 集成maven 1. 查看已存在 /manage/cloud -> Kubernetes -> Pod Templates。(原始存在 名称:kube-agent,名称空间:jenkins,标签: kubeagent) 2. 添加新模板:/manage/cloud -> Kubernetes -> Pod Templates -> Add a Pod Template 名称 kube-maven 名称空间 jenkins 标签列表:kubemaven kube-maven k8s-maven maven-pod 用法:尽可能使用这个节点 Container Template 名称:maven Docker镜像:maven:3.8.6-eclipse-temurin-17-alpine 配置挂载卷: pvc-maven-cache /root/.m2 3. 新建pipeline: 添加 playbooks/dsl-jenkins/29-Kubernetes-maven-build.groovy ### 10. Kubernetes 集成docker build 1. kube-maven 模板中,添加 Container Template 名称:docker Docker镜像:docker:cli 配置挂载卷: host path volume # 安装docker到节点,root@generic_architecture# ansible-playbook playbooks/docker/install.yml -e deploy_hosts=192.168.102.235 /run/docker.sock /run/docker.sock 3. 新建pipeline: 添加 playbooks/dsl-jenkins/30-Kubernetes-maven-docker-build.groovy 4. 安装插件docker pipleine, 解决docker login 在pipeline中不安全的问题。添加 playbooks/dsl-jenkins/30-Kubernetes-maven-docker-build-v2.groovy [docker workflow官方文档](https://docs.cloudbees.com/docs/cloudbees-ci/latest/pipelines/docker-workflow) ### 11. Jenkinsfile from SCM 1. jenkinsfile在gitlab仓库中 2. 对Pipeline配置Jenkinsfile from SCM repository url credentials 指定分支 脚本路径 ### 12. 多分支流水线 1. 对gitlab、github、bitbucket等配置多分支流水线 2. 多分支流水线基于PR进行发现分支(可以配置排除分支),并自动对分支创建流水线pipeline。 3. PR上升自动触发构建 4. master完整的CICD,develop 仅有CI, feature 仅单元测试。 5. jenkins发现分支,而后基于jenkinsfile创建pipeline。后面的分支代码变更自动触发相应的pipeline。 6. 工作逻辑 7. 创建multi-branch pipeline: multibranch-pipeline-springboot-helloworld 分支源: git http://192.168.102.137/root/spring-boot-helloworld 凭据 可选配置:名称过滤