云原生监控与 CI/CD 基础实践
课程范围19-云原生监控系统 Prometheus 告警和高级管理 | 20-代码私有仓库 Git 和 GitLab | 21-代码私有仓库 GitLab 管理和 Jenkins 基础实验环境Ubuntu2404最小化安装2 台虚拟机可按课程要求扩展为 1 主 2 从国内源说明本实验所有软件源、镜像源、插件源均使用国内源阿里云 / 清华 / DaoCloud 等无需科学上网。角色主机名IP配置Master控制节点k8s-master10.0.0.2002C/4GNode1工作节点k8s-node110.0.0.812C/8GGitLab 较吃内存第一部分K8s 集群创建第 19 课前置环境1.1 基础环境配置【所有节点执行】1.设置主机名2.配置hosts解析3.关闭防火墙、swap4.时间同步5.加载内核模块、开启转发Ubuntu用modules-load持久化6.安装ipvs依赖7.修复 systemd-resolvedUbuntu 24.04 的 /etc/resolv.conf 指向 127.0.0.53会导致 kubelet 解析异常改为指向真实 DNS1.2 配置阿里云 apt 源【所有节点执行】1.3 安装 containerd 容器运行时并配置国内镜像加速【所有节点执行】K8s 1.24 已移除 dockershim此处安装 containerd来自阿里云 docker-ce 仓库并配置 DaoCloud 国内镜像加速后续 Prometheus / GitLab / Jenkins 官方镜像均可直接拉取无需修改任何镜像名。1.4 安装 kubeadm / kubelet / kubectl阿里云 kubernetes-new 源apt 版【所有节点执行】注意阿里云 Kubernetes apt 仓库的密钥和包都在v1.30/deb/目录下密钥为deb/Release.key仓库地址以/结尾flat 仓库格式不要写成 stable/main 普通仓库格式。1.5 初始化集群【Master 执行】1.5.1 故障排查API server is not healthy / kubelet 未运行【Master 执行】若 init 报The API server is not healthy after 4m0s按以下顺序定位# 1. 看控制面容器状态哪个在 CrashLoopBackOff / Exitedcrictl --runtime-endpoint unix:///var/run/containerd/containerd.sock ps -a | grep -E kube|etcd|pause# 2. 看 kubelet 报错最关键systemctl status kubelet --no-pager -ljournalctl -u kubelet --no-pager | tail -50# 3. 看失败容器日志crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock logs CONTAINERID常见原因 Acgroup 驱动不一致journalctl 出现cgroup driver字样grep -n SystemdCgroup /etc/containerd/config.toml # 必须为 truesed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.tomlsystemctl restart containerd kubelet常见原因 Bcontainerd 启动失败mirrors 旧写法不兼容改用官方certs.d目录方式配置镜像加速sed -i /registry.mirrors/,$d /etc/containerd/config.tomlsed -i s#config_path #config_path /etc/containerd/certs.d# /etc/containerd/config.tomlmkdir -p /etc/containerd/certs.d/{docker.io,registry.k8s.io,quay.io,ghcr.io,gcr.io}cat /etc/containerd/certs.d/docker.io/hosts.toml EOFserver https://registry-1.docker.io[host.https://docker.m.daocloud.io]capabilities [pull, resolve]EOFcat /etc/containerd/certs.d/registry.k8s.io/hosts.toml EOFserver https://registry.k8s.io[host.https://k8s.m.daocloud.io]capabilities [pull, resolve]EOFcat /etc/containerd/certs.d/quay.io/hosts.toml EOFserver https://quay.io[host.https://quay.m.daocloud.io]capabilities [pull, resolve]EOFcat /etc/containerd/certs.d/ghcr.io/hosts.toml EOFserver https://ghcr.io[host.https://ghcr.m.daocloud.io]capabilities [pull, resolve]EOFcat /etc/containerd/certs.d/gcr.io/hosts.toml EOFserver https://gcr.io[host.https://gcr.m.daocloud.io]capabilities [pull, resolve]EOFsystemctl restart containerd kubelet常见原因 Csandbox 沙箱镜像拉取超时containerd 日志出现failed to resolve registry.k8s.io/pause:xxx ... i/o timeoutkubelet 报CreatePodSandbox ... connection refused# 1. config_path 必须已指向 certs.d否则加速不生效sed -i s#config_path #config_path /etc/containerd/certs.d#g /etc/containerd/config.toml# 2. sandbox_image 只替换前缀、保留版本号兼容不同 containerd 默认的 pause 版本sed -i s#sandbox_image registry.k8s.io#sandbox_image registry.aliyuncs.com/google_containers# /etc/containerd/config.toml# 3. certs.d 目录和 hosts.toml 必须存在config_path 指向的目录不存在会导致 containerd 直接起不来ls /etc/containerd/certs.d/*/hosts.toml # 应列出 5 个文件缺失就按 1.3 节第 4 步补建# 4. 重启并实测拉取成功输出镜像摘要才继续systemctl restart containerdsystemctl status containerd --no-pager # 必须 active (running)crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock pull registry.k8s.io/pause:3.10.2常见原因 DDNS 解析异常拉取报dial tcp 10.255.x.x:443: connect: connection refused之类的内网地址错误或时好时坏# 1. 检查解析结果若返回 10.x/192.168.x 等内网地址说明 DNS 被污染或配置错误getent hosts registry.aliyuncs.comcat /etc/resolv.conf# 2. 写死阿里公共 DNS覆盖 systemd-resolved 符号链接rm -f /etc/resolv.confcat /etc/resolv.conf EOFnameserver 223.5.5.5nameserver 223.6.6.6EOFgetent hosts registry.aliyuncs.com # 确认已解析到公网 IP常见原因 Econtainerd 反复挂掉 / 预检报 CRI connection refusedkubeadm init预检直接报[ERROR CRI]: container runtime is not running ... dial unix /var/run/containerd/containerd.sock: connect: connection refused说明 init 根本没开始跑# 1. 先看 containerd 为什么没起来systemctl status containerd --no-pagerjournalctl -u containerd --no-pager -n 30 # 若见 failed to load TOML 等说明 config.toml 被多轮修改改坏了# 2. 配置文件被反复 sed 改坏时最干净的办法是重建镜像已缓存、DNS 已修复重建只需 2 分钟systemctl stop containerdmv /etc/containerd/config.toml /etc/containerd/config.toml.bak.$(date %s)containerd config default /etc/containerd/config.tomlsed -i s#sandbox_image registry.k8s.io#sandbox_image registry.aliyuncs.com/google_containers# /etc/containerd/config.tomlsed -i s/SystemdCgroup false/SystemdCgroup true/ /etc/containerd/config.tomlsed -i s#config_path #config_path /etc/containerd/certs.d# /etc/containerd/config.toml# 3. certs.d 目录和 5 个 hosts.toml 按 1.3 节第 4 步重建必须先建目录再启用 config_pathmkdir -p /etc/containerd/certs.d/{docker.io,registry.k8s.io,quay.io,ghcr.io,gcr.io}# ...写入各 hosts.toml内容见 1.3 节# 4. 启动并验证grep -nE SystemdCgroup|config_path|sandbox_image /etc/containerd/config.tomlsystemctl restart containerdsystemctl status containerd --no-pager # 必须 active (running)crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock images | grep pause# 确认沙箱镜像版本与本地缓存一致后重新执行 1.5 的 kubeadm init技巧预拉控制面镜像让 init 不依赖网络还能顺带确认 pause 实际版本号kubeadm config images pull \--image-repository registry.aliyuncs.com/google_containers \--kubernetes-version $(kubeadm version -o short)# 预拉完成后把沙箱镜像版本改成与本地缓存一致如 pause:3.10避免沙箱去拉另一个版本crictl --runtime-endpoint unix:///var/run/containerd/containerd.sock images | grep pausesed -i s#pause:3.10.2#pause:3.10# /etc/containerd/config.tomlsystemctl restart containerd重置后重新初始化失败的 init 必须清理否则重跑会撞 6443 端口注意若 init 报 API server not healthy 但 kubelet 已 healthy先别急着重置——等 2~3 分钟后用cp -i /etc/kubernetes/admin.conf $HOME/.kube/config kubectl get nodes试一次。慢速虚拟机上 etcd 初始化常超过 kubeadm 的 4 分钟超时API Server 随后正常启动集群实际可用。kubeadm reset -frm -rf $HOME/.kube /etc/cni/net.dsystemctl restart containerd kubelet# 重新执行 1.5 的 kubeadm init1.6 工作节点加入集群【Node 执行】join 报 already exists / Port 10250 in use 怎么办说明该 Node 之前加入过或有残留的 kubelet 占着 10250 端口。清理后重新 joinkubeadm reset -frm -rf /etc/cni/net.d /var/lib/kubelet/pkisystemctl restart containerd kubelet然后重新执行 join 命令token 过期报 token invalidtoken 有效期 24 小时在 Master 上重新生成 join 命令即可kubeadm token create --print-join-command1.7 部署 Flannel 网络插件【Master 执行】1.8 验证集群【Master 执行】第二部分实验一 —— 部署 Prometheus 完成对 K8s 集群的监控任务目标部署 Prometheus 并完成对 k8s 集群的监控包括 node 监控、pod 监控建立使用率大盘 node 和 pod并配置告警。2.1 创建监控命名空间【Master 执行】2.2 部署 node-exporterNode 监控数据采集【Master 执行】说明node-exporter 以 DaemonSet 方式运行Master 与 Node1 上各一个 Pod采集主机指标端口 9100。2.3 部署 kube-state-metricsPod/K8s 对象监控【Master 执行】2.4 部署 Prometheus 并配置告警规则【Master 执行】2.5 部署 Alertmanager接收告警【Master 执行】2.6 部署 Grafana 并建立使用率大盘【Master 执行】2.7 建立 Node 和 Pod 使用率大盘【Master 执行后浏览器操作】浏览器访问http://10.0.0.200:30300账号admin密码admin123。添加数据源Connections → Data sources → Add data source → PrometheusURL 填http://prometheus.monitoring.svc.cluster.local:9090保存并测试。导入 Node 使用率大盘Dashboards → New → Import输入社区大盘 ID1860Node Exporter Full含 CPU/内存/磁盘/网络使用率数据源选 Prometheus导入。 - 若 grafana.com 访问慢可将大盘 JSON 从国内镜像站如https://gitee.com搜索 node-exporter-full下载后选择 Upload JSON file 本地导入。导入 Pod 使用率大盘同样方式导入大盘 ID6417Kubernetes Pods展示 Pod 的 CPU/内存使用率排行。截图保存Node 大盘、Pod 大盘、http://10.0.0.200:30900Prometheus的 Targets 页面应看到全部节点和 Pod 目标为 UP 状态。2.8 验证监控与告警【Master 执行】第三部分实验二 —— 部署 GitLab 并完成课程实验练习第 20、21 课任务目标在 K8s 上部署 GitLab完成创建用户/群组/项目、配置 SSH 密钥、推送代码、分支与 Merge Request、Issue 管理等课程实验练习。3.1 部署 GitLab社区版【Master 执行】注意PVC 声明在 default 命名空间但 PV 绑定的是 hostPathGitLab 数据实际落在 k8s-node1 的/data/gitlab下。GitLab 启动需要 3~5 分钟可用kubectl logs -f gitlab-xxxx观察。3.2 获取初始 root 密码并登录【Master 执行】浏览器访问http://10.0.0.81:30081用户名root粘贴上述密码登录。3.3 GitLab 课程实验练习1设置中文界面头像 →Preferences → Language选简体中文保存刷新。2修改 root 密码头像 →Edit profile → Password设置新密码。3创建用户并管理权限管理中心Admin Area→ 用户 → 新建用户创建dev1、dev2两个普通用户为 dev1 设置密码通过 dev1 登录验证。4创建群组和项目管理中心 → 新建群组命名devops在群组下新建项目demo-web可见级别私有。5配置 SSH 密钥并推送代码【本机或 Node 执行】将公钥粘贴到 GitLabdev1 头像 → Preferences → SSH Keys → Add key克隆并首次提交端口 300816分支与 Merge Request 练习在 GitLab 页面创建 Merge Requestfeature/add-readme → main指定 dev2 为审核人审核合并。7Issue 管理练习项目计划Plan→ Issues → 新建 Issue标题如首页样式优化指派给 dev1并在 MR 中引用#1关联该 Issue合并后观察 Issue 自动关闭。8保护分支设置项目设置 → 仓库 → 受保护分支将main设为仅 Maintainer 可推送、所有人可合并验证 dev1 无法直接向 main 推送。dev1 换到功能分支再推第四部分实验三 —— 部署 Jenkins 并完成课程实验练习第 21 课任务目标在 K8s 上部署 Jenkins使用国内插件源完成插件安装创建 Freestyle 任务和 Pipeline 任务并打通 GitLab 拉取代码。4.1 部署 Jenkins【Master 执行】先在 node1 上准备数据目录Node 执行4.2 获取初始管理员密码【Master 执行】浏览器访问http://10.0.0.81:30080粘贴密码解锁。4.4 安装课程所需插件在Manage Jenkins → Plugins → Available plugins中安装国内源秒装Localization: Chinese (Simplified)中文界面Git/GitLab代码拉取与集成Pipeline流水线若初始未装Blue Ocean可视化流水线可选安装完成后重启kubectl rollout restart deployment jenkins。4.5 Jenkins 课程实验练习1Freestyle 自由风格任务新建任务 → Freestyle project命名demo-web-build。源码管理选Git仓库地址填 GitLab 项目 HTTP 地址http://10.0.0.81:30081/devops/demo-web.git凭据添加 → Jenkins → 用户名/密码填 GitLab 账号 dev1。构建步骤选执行 shell内容echo 构建开始 ls -lcat index.htmlecho 构建完成 点击立即构建查看Console Output确认能成功从 GitLab 拉取代码并执行脚本。2Pipeline 流水线任务新建任务 → Pipeline命名demo-web-pipeline。Pipeline 脚本groovy pipeline { agent any stages { stage(拉取代码) { steps { git branch: main, credentialsId: gitlab-dev1, url: http://10.0.0.81:30081/devops/demo-web.git } } stage(编译测试) { steps { sh echo Pipeline 构建$(date) sh ls -l } } stage(部署模拟) { steps { sh echo 模拟部署到 K8s 集群 } } } post { always { echo 流水线结束无论成败都会执行 } success { echo 构建成功 } failure { echo 构建失败请检查日志 } } }3.构建并查看 Stage View。3定时构建CI 触发方式练习在 Freestyle 任务构建触发器中勾选Build periodically填写H/5 * * * *每 5 分钟一次观察自动构建历史。第五部分作业总结实验内容访问入口K8s 集群kubeadm containerd阿里云源-Prometheus 监控node 监控 pod 监控 告警 Grafana 大盘http://10.0.0.200:30900/:30903/:30300GitLab部署 用户/群组/项目/MR/Issue 练习http://10.0.0.81:30081Jenkins部署 国内插件源 Freestyle/Pipeline 练习http://10.0.0.81:30080国内源汇总用途国内源地址系统软件源mirrors.aliyun.comUbuntu aptdeb822 格式kubeadm/kubeletmirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/apt密钥deb/Release.keyK8s 控制面镜像registry.aliyuncs.com/google_containers容器镜像加速docker.m.daocloud.io/k8s.m.daocloud.io/quay.m.daocloud.io/ghcr.m.daocloud.ioFlannel 清单下载ghfast.topGitHub 加速NTP 时间同步ntp.aliyun.comJenkins 插件源mirrors.tuna.tsinghua.edu.cn/jenkins/updates/Grafana 大盘备用大盘 JSON 国内镜像站本地导入
上一篇/下一篇内容由系统自动关联
返回资讯列表 →