27.B站薪享宏福笔记——第十一章(1)镜像仓库Harbor && 日志收集Loki
11 B站薪享宏福笔记——第十一章
—— kubernetes 中的必备的工具组件
11.1 镜像仓库方案
—— Harbor - 超融合镜像管理
11.1.1 Harbor 介绍说明
Harbor 的目标是帮助用户迅速搭建一个企业级的 Docker registry 服务。它以 Docker 公司开源的 仓库registry 为基础,额外提供了如下功能:
基于角色的访问控制(Role Based Access Control)(不同用户)
基于策略的镜像复制(Policy based image replication)(不同仓库间复制拷贝)
镜像的漏洞扫描(Vulnerability Scanning)
AD/LDAP集成(LDAP/AD support)(域控制器集成)
镜像的删除和空间清理(Image deletion & garbage collection)(没有标签的悬空镜像)
友好的管理UI(Graphical user portal)
审计日志(Audit logging)(日志记录,便于事后分析)
RESTful API(接口调用实现自动化)
部署简单(Easy deployment )(安装方式:Helm、docker-compose、kubernetes)
11.1.2 Harbor 架构图

1.通过 镜像验证服务Notary Client 、Docker 客户端、浏览器Browser 等接入到 Nginx
2.如果是 镜像验证服务Notary Client 请求被 Nginx 转发接入到后端 Notary
3.如果是 Docker 客户端 请求被 Nginx 转发接入到后端 仓库Regisry(走 仓库Registry v2 版本接口)
4.如果是 浏览器Browser 请求被 Nginx 转发接入到后端 Admin Server 服务中,Admin Server 服务提供 UI、API 接口、Auth 认证服务,Admin Server 服务同时还支持接入 AD/LDAP集成 域控制器
5.日志控制器端 Log Collector,将各组件日志统一进行存储分析(可用于审计)
6.DB 可以用于存储元数据信息、用户验证信息等
7.通过 Replication Job Service 可以对远程的镜像实现自动化执行
11.1.3 Harbor 安装部署
(1)创建名称空间
# 创建 harbor 的名称空间
[root@k8s-master01 11.1]# cat harbor_ns.yaml apiVersion: v1 kind: Namespace metadata: name: harbor [root@k8s-master01 11.1]# kubectl apply -f harbor_ns.yaml namespace/harbor created [root@k8s-master01 11.1]# kubectl get namespace NAME STATUS AGE harbor Active 10s .........
(2)选择节点进行 harbor 安装(可选)
# 可选选项,通过定义标签,使 harbor 固定启动的服务节点(与selectnode效果相同) [root@k8s-master helm]# kubectl edit ns harbor -o yaml apiVersion: v1 kind: Namespace metadata: annotations: scheduler.alpha.kubernetes.io/node-selector: harbor=env name: harbor # 选择 node 进行标签设定 [root@k8s-master helm]# kubectl label node k8s-node3 harbor=env
(3)添加 Helm repo
# 添加 harbor 地址 [root@k8s-master01 11]# helm repo add harbor https://helm.goharbor.io "harbor" has been added to your repositories [root@k8s-master01 11.1]# helm repo ls NAME URL bitnami https://charts.bitnami.com/bitnami aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts harbor https://helm.goharbor.io [root@k8s-master01 11.1]# helm search repo NAME CHART VERSION APP VERSION DESCRIPTION ......... harbor/harbor 1.17.1 2.13.1 An open source trusted cloud native registry th... # helm 默认下载最新稳定版本, 可以通过 --version 指定下载版本号,下载的 tgz 包保存到当前目录下 [root@k8s-master01 11.1]# helm pull harbor/harbor [root@k8s-master01 11.1]# helm pull harbor/harbor --version 1.11.0 [root@k8s-master01 11.1]# ls -ltr total 112 -rw-r--r-- 1 root root 55 Jul 25 14:49 harbor_ns.yaml -rw-r--r-- 1 root root 50217 Jul 25 15:10 harbor-1.17.1.tgz -rw-r--r-- 1 root root 54415 Jul 25 15:11 harbor-1.11.0.tgz
(4)Helm 安装 harbor
# tar 包解压 [root@k8s-master01 11.1]# tar -xvf harbor-1.11.0.tgz ......... [root@k8s-master01 11.1]# cd harbor/ [root@k8s-master01 harbor]# ls Chart.yaml LICENSE README.md cert conf templates values.yaml # 前面 存储章节保存的存储类,有类名 nfs-client [root@k8s-master01 11.1]# kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE nfs-client k8s-sigs.io/nfs-subdir-external-provisioner Delete Immediate false 33d # 将存储类名填写到存储中 [root@k8s-master01 harbor]# sed -i 's/storageClass: ""/storageClass: "nfs-client"/g' values.yaml [root@k8s-master01 harbor]# grep 'storageClass: ' values.yaml storageClass: "nfs-client" storageClass: "nfs-client" storageClass: "nfs-client" storageClass: "nfs-client" storageClass: "nfs-client" storageClass: "nfs-client" storageClass: "nfs-client" # 漏扫下载镜像太慢,可以选择不下载漏扫,将 false 改为 true,如果是 false 可以将 timeout 时间加长,这是镜像下载超时时间 [root@k8s-master01 harbor]# grep 'skipUpdate:' values.yaml skipUpdate: true # 安装的 服务名为 harbor ,-f 可变文件 values.yaml ,基于 当前目录,-n harbor 指定名称空间 [root@k8s-master01 harbor]# helm install harbor -f values.yaml . -n harbor NAME: harbor LAST DEPLOYED: Fri Jul 25 15:37:39 2025 NAMESPACE: harbor STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Please wait for several minutes for Harbor deployment to complete. Then you should be able to visit the Harbor portal at https://core.harbor.domain For more details, please visit https://github.com/goharbor/harbor [root@k8s-master01 harbor]# kubectl get pod -n harbor NAME READY STATUS RESTARTS AGE harbor-chartmuseum-7574c876c5-j67xp 1/1 Running 0 2m11s harbor-core-5bb65bcc78-kpvgz 1/1 Running 0 2m12s harbor-database-0 1/1 Running 0 2m12s harbor-jobservice-6995ddf5fc-5rnnb 1/1 Running 3 (60s ago) 2m11s harbor-notary-server-5578c446d9-m46b9 1/1 Running 1 (58s ago) 2m12s harbor-notary-signer-7cbb97b788-d2w5s 1/1 Running 1 (58s ago) 2m12s harbor-portal-64bb85667c-ks26r 1/1 Running 0 2m12s harbor-redis-0 1/1 Running 0 2m12s harbor-registry-759849f995-kn8x5 2/2 Running 0 2m12s harbor-trivy-0 1/1 Running 0 2m12s # 查看 域名 [root@k8s-master01 harbor]# kubectl get ingress -n harbor NAME CLASS HOSTS ADDRESS PORTS AGE harbor-ingress nginx core.harbor.domain 80, 443 4m43s harbor-ingress-notary nginx notary.harbor.domain 80, 443 4m43s
# 电脑主机进入目录,在 hosts 文件中添加新的信息 C:\Windows\System32\drivers\etc 192.168.66.12 core.harbor.domain
在浏览器中输入域名:https://core.harbor.domain,账户:admin,首次登录密码:Harbor12345

(5)Harbor 仓库介绍


概要:仓库的基本信息
镜像仓库:仓库中存储的镜像
Helm Charts:仓库中存储的 Helm 包,通过服务端供给
成员:项目由谁管理、添加用户、添加角色、添加组(注意:用户要先经过管理员创建后才可添加)
标签:给镜像添加标签,可以通过标签检索
扫描器:漏洞扫描(默认Trivy)
P2P 预热:集群上千节点时,将镜像 P2P 分发,减少原 harbor仓库 服务器压力
策略:保留镜像的策略
机器人账户:开发应用时,通过接口对当前仓库的某个项目名称做管理,可以执行的动作(可以设置权限)
Webhooks:钩子,在 Harbor 仓库内做了动作,可以对外发送一些对应设定的请求
日志:上传和下载镜像的日志
配置管理:项目是否公开、部署安全性,是否通过镜像验证、是否开启漏洞扫描、代码漏洞特赦白名单

用户管理:添加用户
机器人账户:添加机器人账户
仓库管理:可以创建多个仓库
复制管理:定时拉取某些仓库的镜像到本地仓库或推送本地镜像仓库到其他仓库(需要先添加仓库)
分布式分发:镜像的分布式传输、分布式下载
标签:定义标签(定义好后,上面项目中就可以应用标签)
项目定额:定义仓库可以使用的存储空间
审查服务:漏扫(默认集成 Trivy)
清理服务:垃圾清理以及日志保留时间
任务中心:那些用户在同步镜像
配置管理:1.认证模式:是否允许自注册、2.安全:添加漏扫白名单、3:系统设置:谁可以创建项目、令牌过期时间(CS结构,客户端访问服务端用用户名和密码,服务端返回一个复杂字符串,这个字符串和用户绑定,客户端再请求时使用字符串申请,可以对这个字符串设置有效时间)、会话过期时间(超时自动退出登录)、机器人账户名称前缀(通过前缀发现那些用户是机器人)、机器人账户令牌过期时间、镜像库根证书(使用镜像仓库需要信任,可以导入根证书)、仓库只读、开启 WEBHOOK、日志转发端点(可用其他组件集成监控)
主题颜色
Harbor API V2.0 接口的定义手册
(6)Harbor 仓库页面上传
# 将 harbor 域名添加解析到各节点
[root@k8s-master01 harbor]# echo "192.168.66.12 core.harbor.domain" >> /etc/hosts [root@k8s-node01 ~]# echo "192.168.66.12 core.harbor.domain" >> /etc/hosts [root@k8s-node02 ~]# echo "192.168.66.12 core.harbor.domain" >> /etc/hosts
镜像和Helm包 可以手动上传,可以使用命令上传(方便)

手动可以通过页面点击上传:
# 将 helm 下载的 tar 包下传到桌面 [root@k8s-master01 11.1]# pwd /root/11/11.1 [root@k8s-master01 11.1]# ls -ltr total 112 -rw-r--r-- 1 root root 55 Jul 25 14:49 harbor_ns.yaml -rw-r--r-- 1 root root 50217 Jul 25 15:10 harbor-1.17.1.tgz -rw-r--r-- 1 root root 54415 Jul 25 15:11 harbor-1.11.0.tgz drwxr-xr-x 5 root root 135 Jul 25 15:32 harbor [root@k8s-master01 11.1]# sz harbor-1.17.1.tgz [root@k8s-master01 11.1]# sz harbor-1.11.0.tgz


(7)Harbor 仓库命令行上传
# 拉取一个镜像用于测试(老师讲的仓库 myapp:v6.0 拉取有时访问失败) [root@k8s-master01 ~]# docker pull mysql ......... [root@k8s-master01 ~]# docker images|grep mysql mysql latest 245a6c909dc0 3 days ago 921MB [root@k8s-master01 ~]# docker tag mysql:latest core.harbor.domain/library/mysql:test_harbor.v1.0 [root@k8s-master01 ~]# docker images|grep mysql core.harbor.domain/library/mysql test_harbor.v1.0 245a6c909dc0 3 days ago 921MB mysql latest 245a6c909dc0 3 days ago 921MB
a.添加信任的域名
# docker login 默认登录官网,后面加域名,指定登录仓库的网站 # 没有经过 docker 的认证所以会报错(两种方案:1.在docker配置文件中添加信任的域名、2.将 Harbor 仓库的ca证书给docker,使docker信任) [root@k8s-master01 ~]# docker login core.harbor.domain Username: admin Password: Error response from daemon: Get "https://core.harbor.domain/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority # 第一种,docker 信任域名的方式 [root@k8s-master01 ~]# cat /etc/docker/daemon.json { ......... "insecure-registries": ["https://docker.m.daocloud.io","core.harbor.domain"], ......... } [root@k8s-master01 ~]# systemctl daemon-reload [root@k8s-master01 ~]# systemctl restart docker # 登录,输入域名,让 docker 加载配置重启生效,然后登录:账号:admin、密码:Harbor12345 [root@k8s-master01 ~]# docker login core.harbor.domain Username: admin Password: WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'. Configure a credential helper to remove this warning. See https://docs.docker.com/go/credential-store/ Login Succeeded [root@k8s-master01 ~]# docker logout core.harbor.domain Removing login credentials for core.harbor.domain
b.添加信任的ca证书
# 第二种 Harbor 仓库的ca证书给docker,使docker信任(上面要是做了实验,可以修改回配置,再重启,保持变量) [root@k8s-master01 11.1]# kubectl get secret harbor-ingress -n harbor -o yaml apiVersion: v1 data: ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURGRENDQWZ5Z0F3SUJBZ0lSQUpGUG1SQ3RKTU4rdG0rWlhsYkVMMWt3RFFZSktvWklodmNOQVFFTEJRQXcKRkRFU01CQUdBMVVFQXhNSmFHRnlZbTl5TFdOaE1CNFhEVEkxTURjeU5UQTNNemMwTUZvWERUSTJNRGN5TlRBMwpNemMwTUZvd0ZERVNNQkFHQTFVRUF4TUphR0Z5WW05eUxXTmhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUFtckNGOHNGV3Y4OFUybm5SclBzZHlFeUlPdWtFRDgzZkYzVjQzd2RJTm1VcERpcFUKSGxIM1JHaFRhcGw2eXhiQnJPSFkxaGdIMjJJQzVpU1ZjTEQyaXBMSlF3dktkN0V2L25aWHJEQlNadkFTYXJuMwpWN2R0b05rWE91TmFYRGNPcWhuWnIvV2VoUWswK3BPdFBNWlgyK1VRT2czVnNOZEpMK2htdXJyQzJiTjkxbXVBCitGa0JuU1RJNEp6TXJRQkc0Yk55eXZLMGhXeG04WkZYaTc5T3A0YTlkTlNmS1VKRkRaalJrMmNQNnc2VkFLUEoKMVpyTTRVNmxSRmNPcHd3ZjBBNHE3aStZd3BBTG9zZ0hPVUd0c1RkQkovSWpML1IyNEtGaU9nSkxkWHJnWjJyeApmbTBrUDYvS3JDY2k3WFBPMlVtaHpIY2dNYWVmRTZhbCtrSXZRd0lEQVFBQm8yRXdYekFPQmdOVkhROEJBZjhFCkJBTUNBcVF3SFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGT1k2NTVuNEd4ejl2UUM5bXY0b25sZ01WeTRHTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQjNzUWJPSGllcnozNkJmK3p1aHM0eW1WNVZBdVFtMnVicmJ5NlpPbUtUVzNSMFB1WjJZQ2dnCmppOHdaQlh5Wm1JTFNKNWs2cjB5WlhwVTFxeGZMM1pNT3VXdURSS252bUpHdXc1bFFOdjcwVHlpN25uUGF2M0QKRFh6Ulh1bEdjdDZraXRFaWFjdU8ySm1FSzdxMEVQMGhYTmNUZ2RNc3NHT3pDUEErZXFWd0tFeUw5OGpncFJQdAoyK0dzMXhhNW5POE1IdjJaNE5kaDhRamlCMEJuVkx1ZGFIZEF4ejVTUmJWUlljanQ5Z3dYVHcxd1VwbG5lRnF6Ckl1U0UveWxjRjBhUlpjaUpZMDlqemxDTTVVa1BXcXl2azlsb3duakVKQzNSMFZqdXFNMlJLcWNtYU02eXBjdUIKcjZLNTV0QjdndXd5Nks2NU0rajlGZkhtMGhnRXlId1kKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURVakNDQWpxZ0F3SUJBZ0lRSDNXUFRBWDRCdFJRcysyMmhkNExNREFOQmdrcWhraUc5dzBCQVFzRkFEQVUKTVJJd0VBWURWUVFERXdsb1lYSmliM0l0WTJFd0hoY05NalV3TnpJMU1EY3pOelF3V2hjTk1qWXdOekkxTURjegpOelF3V2pBZE1Sc3dHUVlEVlFRREV4SmpiM0psTG1oaGNtSnZjaTVrYjIxaGFXNHdnZ0VpTUEwR0NTcUdTSWIzCkRRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ204UFNxQk1hZVpta3lIbWpEbGhsQm4xOVRFcyt3UXRSK1Z3RFgKNkhEUUdaaU5FRlc0eGxXNTl0c25RMjdUT20yZ3RscC80aGlvWlhld0tGbXBZejBNbjBZRHM4RlE3UXFHUUcxRwpVYnFvUUVxQk5yUWo1MStqU2V3K0pKR2lnYVh3amRDVklKdWxJL0pVYVIvSGNBWDB4VVpLV0NnYlVXcFd4dVZSCkpyNUJkaGhRVHM2SCtyOUJPMTV1c1NVTzRCOFIzcWhqL01lTlJkQUgrbTFHQm5ER3p3YkJTK1BsQ01OU1NYVTkKQlVWUVUvM2VLbkRPSVFOZVY4STdxMjh4c2llQ0VoaTBiUmttRWRIVlpRUHY1ZUEyZGVER3BWZGJwSmhoR1FNQgpDLzZBQm1xRHQva28wQ09LdTROQXVaOGRyWVl0WlE4cVdGR3N5cm9scHJrZHpRUFBBZ01CQUFHamdaWXdnWk13CkRnWURWUjBQQVFIL0JBUURBZ1dnTUIwR0ExVWRKUVFXTUJRR0NDc0dBUVVGQndNQkJnZ3JCZ0VGQlFjREFqQU0KQmdOVkhSTUJBZjhFQWpBQU1COEdBMVVkSXdRWU1CYUFGT1k2NTVuNEd4ejl2UUM5bXY0b25sZ01WeTRHTURNRwpBMVVkRVFRc01DcUNFbU52Y21VdWFHRnlZbTl5TG1SdmJXRnBib0lVYm05MFlYSjVMbWhoY21KdmNpNWtiMjFoCmFXNHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBSVNlZndtL3BqU2tIeGNPV3pIb2lXWERGaDNBbXV4NTlQVEUKZGF1TE1ZRUZJMHNXemE5Tmd2Mi9tUDZMYWpFdGNJNHk0cXpIamxWZThZQ2NMQmp1RWtsbXVsTW5vWFFHczl2RQpFdm95eE9FdmFIUFl1cFl1UDUzOThsV2FqVmEvL3lPUFNJcDZJZnRSUkM4RnhxTWpBY0xKbWxZMFgwM3JnY3kzCktvNk1ZU3QwNUF2WEhyUy9KMU1Da3VUeU9EM1JxSjNvV29ja1dvdU4rcm5WelczNnBlWjRqMmJwZy9QRFhaZVMKNzZmalptRm1EMmpWS3RjRnhpamxvenVaSjhpbi9FdlNJYnhNNGVDaW5DcERiQ1k4Vys3aVdWazU3ZVFqNTMwdgpzdmQ3SHdSbHFaZnFKbDV6Z3c3VGFtMGhQQzdJZ0FKaDFiZkRaa3JwOVNPRGhmamRUZDg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBcHZEMHFnVEdubVpwTWg1b3c1WVpRWjlmVXhMUHNFTFVmbGNBMStodzBCbVlqUkJWCnVNWlZ1ZmJiSjBOdTB6cHRvTFphZitJWXFHVjNzQ2hacVdNOURKOUdBN1BCVU8wS2hrQnRSbEc2cUVCS2dUYTAKSStkZm8wbnNQaVNSb29HbDhJM1FsU0NicFNQeVZHa2Z4M0FGOU1WR1NsZ29HMUZxVnNibFVTYStRWFlZVUU3TwpoL3EvUVR0ZWJyRWxEdUFmRWQ2b1kvekhqVVhRQi9wdFJnWnd4czhHd1V2ajVRakRVa2wxUFFWRlVGUDkzaXB3CnppRURYbGZDTzZ0dk1iSW5naElZdEcwWkpoSFIxV1VENytYZ05uWGd4cVZYVzZTWVlSa0RBUXYrZ0FacWc3ZjUKS05BamlydURRTG1mSGEyR0xXVVBLbGhSck1xNkphYTVIYzBEendJREFRQUJBb0lCQUUzRXZoVmQrRERlUUc4cQpuMTlOMHlJdzNqVlM5QkdHY0hzU2lNQUw5bEhiT3Flc1RtS3Zja3daWldwYkRZdTFFbERsNGk3azR0dS91UXdGCklBKzZ2VHZlRHIyMnhYMnZqMUdQUGRpZVJqZ1BDeVk2bDV5S01wRmM1SUxtZ2ptVDcvdXA5TnNqdjU0a3FzVUwKMjlRS3FadW5NdUY3UStQRi82WEJMaDZwejhPcVFYZU0zU2lsbDNNak1SQjYzbUw2Y2ZsRXI4NzV1TUFhRzd2UwpxM0RveVU2czlzb05hY01TVHI2bkdsWThERXJXSGJXNkF6NDJMcEh4NXFvUGJ5akF2b054dk9SbjR3aEtxd1R0CjMxRFRLR1F5cUZLMUVBMnRQVHBoazZVaUJVMTl1T0FGS0lIVjgrcERNbHVhMk41QVpQMFR5ZTBMN0l0VWNQRnEKRzhKend3RUNnWUVBelFzdWFRNTUwcHlJYVJrbUhHU2ZQbDF2ZFVDVXBhekdyVHJrOEV0NTlvM1F5QkcvaFNGagpyMHdZZlo3U1hkRTRQVGV0cFpTQTRVN3JyS2lncjg4Z1lhcmtYcGlkWVdPcWFwMTEzdVdDM3c5QzhoTEpJTnQ4CjljQ2dmRlpCVy9mWjI4M29OWkFJSndQSFMwZmpyN08zaGcrTnR0eGM3K0lPMXh3ZUEvRVZZUThDZ1lFQTBHMjEKUnlocG1KRTVKejdldm83WCtKSk5GR3IwQkRZcldqcFNwKzVqWjZtTndPcUM1WDVWRFN4L0FpTjRTN1Y5eWFQOQpzeC9KaEF4dTRUdjhicWFia3FmZUE3WngwenBRa1ZVUzJNZWVyaHlPeDR5T09XVkxhbXBwd0VqRmU1UVNpeVBvCnJqQi93aW9XUml0NDMxSm5uQVMvQlB0NUVBOHVzZFdKZUNSOHNVRUNnWUI4RHR2UnJIU0F2VHk3ZWYvWkJmaGoKWDF6a2NHSi9xdjI2S2Z3Q2QyZ2ZpTVpkaG45K0tTbUxFbHR2QmZ6NXpuQmNlYWVTbXpzdkZ2VDR6ajRLb1NOUwpkSGNmMU83RDBlMTEvRGNvMld4SlVZNkxzRm9JaTBRYjNLUTlGbU1OSmZTbVRQckdEWk1oSitRWTVESWFTSDR0Cm1wTi9vK3lISnhzYmcyT1Z0dlBjZVFLQmdGQzUzUmRGWUxpMXJvUXp4b1Bad1c1R0E5S2ZwZ2tuamR6eGIrZ1kKM2FsZHMwaC95OWprK0Q0VStOQTBPcmhmLytza04vT3pvUklpMnFNajM1NWZxeXUvRnE4cmI2U1hGbk5qbHR3ZApYS2trNkd3RFZXYUhoQkVnUy9zc2RFaHJ6azdUeHFBSXFzTGlHQ1J2Vys1cTlUUXBabTZnazRBVDBVc1JZS0FHCnljREJBb0dCQU10eDFtMUdxNXFEczE3SWo2MWhZQWR4V1lhNjVJZUxYcW9JRTUrNzlKSERzOE9rRWc3eWdrTUcKNkNBTVIzU3h0MTJZNnhEcnpzWHlITG5Wd0w0eGc4cWpzYjlvYUF4L0FPbWxZYmFGZEMvSFo4Sy9GcUJ0RHh3TgpxaHNiZVZCalREdk9tNFlLdGxvVk5HOEcrbmdhYUxrcVVGMGRHWUF0VmNBS3FIZkZ4U1F5Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== kind: Secret metadata: annotations: meta.helm.sh/release-name: harbor meta.helm.sh/release-namespace: harbor creationTimestamp: "2025-07-25T07:37:44Z" labels: app: harbor app.kubernetes.io/managed-by: Helm chart: harbor heritage: Helm release: harbor name: harbor-ingress namespace: harbor resourceVersion: "2214732" uid: 4be5b280-fe90-49fa-9cf3-bce20ce21a57 type: kubernetes.io/tls [root@k8s-master01 11.1]# echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURGRENDQWZ5Z0F3SUJBZ0lSQUpGUG1SQ3RKTU4rdG0rWlhsYkVMMWt3RFFZSktvWklodmNOQVFFTEJRQXcKRkRFU01CQUdBMVVFQXhNSmFHRnlZbTl5TFdOaE1CNFhEVEkxTURjeU5UQTNNemMwTUZvWERUSTJNRGN5TlRBMwpNemMwTUZvd0ZERVNNQkFHQTFVRUF4TUphR0Z5WW05eUxXTmhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUFtckNGOHNGV3Y4OFUybm5SclBzZHlFeUlPdWtFRDgzZkYzVjQzd2RJTm1VcERpcFUKSGxIM1JHaFRhcGw2eXhiQnJPSFkxaGdIMjJJQzVpU1ZjTEQyaXBMSlF3dktkN0V2L25aWHJEQlNadkFTYXJuMwpWN2R0b05rWE91TmFYRGNPcWhuWnIvV2VoUWswK3BPdFBNWlgyK1VRT2czVnNOZEpMK2htdXJyQzJiTjkxbXVBCitGa0JuU1RJNEp6TXJRQkc0Yk55eXZLMGhXeG04WkZYaTc5T3A0YTlkTlNmS1VKRkRaalJrMmNQNnc2VkFLUEoKMVpyTTRVNmxSRmNPcHd3ZjBBNHE3aStZd3BBTG9zZ0hPVUd0c1RkQkovSWpML1IyNEtGaU9nSkxkWHJnWjJyeApmbTBrUDYvS3JDY2k3WFBPMlVtaHpIY2dNYWVmRTZhbCtrSXZRd0lEQVFBQm8yRXdYekFPQmdOVkhROEJBZjhFCkJBTUNBcVF3SFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01BOEdBMVVkRXdFQi93UUYKTUFNQkFmOHdIUVlEVlIwT0JCWUVGT1k2NTVuNEd4ejl2UUM5bXY0b25sZ01WeTRHTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQjNzUWJPSGllcnozNkJmK3p1aHM0eW1WNVZBdVFtMnVicmJ5NlpPbUtUVzNSMFB1WjJZQ2dnCmppOHdaQlh5Wm1JTFNKNWs2cjB5WlhwVTFxeGZMM1pNT3VXdURSS252bUpHdXc1bFFOdjcwVHlpN25uUGF2M0QKRFh6Ulh1bEdjdDZraXRFaWFjdU8ySm1FSzdxMEVQMGhYTmNUZ2RNc3NHT3pDUEErZXFWd0tFeUw5OGpncFJQdAoyK0dzMXhhNW5POE1IdjJaNE5kaDhRamlCMEJuVkx1ZGFIZEF4ejVTUmJWUlljanQ5Z3dYVHcxd1VwbG5lRnF6Ckl1U0UveWxjRjBhUlpjaUpZMDlqemxDTTVVa1BXcXl2azlsb3duakVKQzNSMFZqdXFNMlJLcWNtYU02eXBjdUIKcjZLNTV0QjdndXd5Nks2NU0rajlGZkhtMGhnRXlId1kKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo="|base64 -d > ca.crt # 将证书保存在docker目录下,各节点添加创建根域名相同的子目录 [root@k8s-master01 11.1]# mkdir -p /etc/docker/certs.d/core.harbor.domain [root@k8s-node01 ~]# mkdir -p /etc/docker/certs.d/core.harbor.domain [root@k8s-node02 ~]# mkdir -p /etc/docker/certs.d/core.harbor.domain [root@k8s-master01 11.1]# cp ca.crt /etc/docker/certs.d/core.harbor.domain/ [root@k8s-master01 11.1]# scp ca.crt n1:/etc/docker/certs.d/core.harbor.domain/ root@n1's password: ca.crt 100% 1127 209.8KB/s 00:00 [root@k8s-master01 11.1]# scp ca.crt n2:/etc/docker/certs.d/core.harbor.domain/ root@n2's password: ca.crt 100% 1127 423.0KB/s 00:00 # 登录仓库服务器,可以登录成功了 [root@k8s-master01 11.1]# docker login core.harbor.domain Username: admin Password: WARNING! Your credentials are stored unencrypted in '/root/.docker/config.json'. Configure a credential helper to remove this warning. See https://docs.docker.com/go/credential-store/ Login Succeeded
(8)Harbor 仓库测试上传镜像
[root@k8s-master01 11.1]# docker images|grep mysql core.harbor.domain/library/mysql test_harbor.v1.0 245a6c909dc0 3 days ago 921MB mysql latest 245a6c909dc0 3 days ago 921MB [root@k8s-master01 11.1]# docker push core.harbor.domain/library/mysql:test_harbor.v1.0 The push refers to repository [core.harbor.domain/library/mysql] 01e9866faf54: Pushed 51fea2595c3a: Pushed 177861a3cc8a: Pushed d05bf5af5bed: Pushed 6b3d0258f752: Pushed 6ac6e1662376: Pushed 0fcc1ad8e1e5: Pushed ba998149d8e6: Pushed 36a144bfa009: Pushed 1ab2dc8eb50e: Pushed test_harbor.v1.0: digest: sha256:c89bf9446f2d2386d36151178098d64594897a44dc6125f7efd5e70440102888 size: 2412


[root@k8s-node01 ~]# docker images|grep mysql [root@k8s-node01 ~]# docker pull core.harbor.domain/library/mysql:test_harbor.v1.0 test_harbor.v1.0: Pulling from library/mysql 62efe2b176c9: Pull complete 736f5014e23e: Pull complete d8cbbf99b1d8: Pull complete 42dcfa514f37: Pull complete 0f4e1544ec0b: Pull complete 2702f0bc0b03: Pull complete 3933202e133d: Pull complete 408de5f91115: Pull complete 8cf481282f11: Pull complete 77a166a67589: Pull complete Digest: sha256:c89bf9446f2d2386d36151178098d64594897a44dc6125f7efd5e70440102888 Status: Downloaded newer image for core.harbor.domain/library/mysql:test_harbor.v1.0 core.harbor.domain/library/mysql:test_harbor.v1.0 [root@k8s-node01 ~]# docker images|grep mysql core.harbor.domain/library/mysql test_harbor.v1.0 245a6c909dc0 3 days ago 921MB
(9)Harbor 仓库镜像扫描
# 上传漏扫的软件包 [root@k8s-master01 11.1]# rz -E rz waiting to receive. [root@k8s-master01 11.1]# ls ca.crt harbor harbor-1.11.0.tgz harbor-1.17.1.tgz trivy.tar.gz # 漏扫中文件存放的位置 [root@k8s-master01 11.1]# grep /trivy/db/ harbor/values.yaml # in the local file system (`/home/scanner/.cache/trivy/db/trivy.db`). In addition, the database contains the update # `/home/scanner/.cache/trivy/db/trivy.db` path. [root@k8s-master01 11.1]# kubectl get pod -n harbor NAME READY STATUS RESTARTS AGE harbor-chartmuseum-7574c876c5-j67xp 1/1 Running 1 (15h ago) 20h harbor-core-5bb65bcc78-kpvgz 1/1 Running 12 (15m ago) 20h harbor-database-0 1/1 Running 17 (20m ago) 20h harbor-jobservice-6995ddf5fc-5rnnb 1/1 Running 11 (15m ago) 20h harbor-notary-server-5578c446d9-m46b9 1/1 Running 16 (19m ago) 20h harbor-notary-signer-7cbb97b788-d2w5s 1/1 Running 5 20h harbor-portal-64bb85667c-ks26r 1/1 Running 1 (15h ago) 20h harbor-redis-0 1/1 Running 1 (15h ago) 20h harbor-registry-759849f995-kn8x5 2/2 Running 2 (15h ago) 20h harbor-trivy-0 1/1 Running 1 (15h ago) 20h # pod 中没有存放对应的包,是因为前面关闭了自动下载,默认去github官网下载 [root@k8s-master01 11.1]# kubectl exec -it harbor-trivy-0 -n harbor -- /bin/bash scanner [ / ]$ ls /home/scanner/.cache/trivy/db/trivy.db ls: /home/scanner/.cache/trivy/db/trivy.db: No such file or directory scanner [ / ]$ exit exit command terminated with exit code 1 [root@k8s-master01 11.1]# kubectl cp trivy.tar.gz harbor-trivy-0:/home/scanner/ -n harbor [root@k8s-master01 11.1]# kubectl exec -it harbor-trivy-0 -n harbor -- /bin/bash scanner [ / ]$ cd /home/scanner/ scanner [ ~ ]$ ls bin ca-bundle.crt.original entrypoint.sh install_cert.sh trivy.tar.gz scanner [ ~ ]$ mv trivy.tar.gz .cache/ cscanner [ ~ ]$ cd .cache/ scanner [ ~/.cache ]$ ls reports trivy trivy.tar.gz scanner [ ~/.cache ]$ rm -rf trivy scanner [ ~/.cache ]$ tar -xf trivy.tar.gz scanner [ ~/.cache ]$ ls reports trivy trivy.tar.gz


11.2 日志方案
—— loki 云原生的日志服务器,可能是目前最具性价比的方案
11.2.1 日志归集
(1)归集日志原因
当 节点数 和 Pod数量 过多时,查看日志将变成一个繁琐的事,且 Pod 具有 "动态维稳性" ,可能刚查看过,就"挂掉了",需要去看 新Pod,因此需要一个分布式存储的框架

(2)归集应有架构

1.每个节点上安装 agent 端,收集当前节点的所有容器日志,推送到 共享存储 storage 中
2.基于 共享存储storage 创建 GUI 为用户提供图像化访问的接口,同时要拥有数据筛选能力,能够筛选或检索不同 Pod 日志,以作区分
11.2.2 传统 VS 新兴
(1)常见 EFK/ELK 分布式方案

EFK:Fluentd、Elastic Search、Kibana
ELK:Logstash、Elastic Search、Kibana
Fluentd、Logstash 类似 agent 端,负责收集日志
Elastic Search 类似 storage 端,存储日志并提供对应检索接口(Elastic Search 主要由开源 JAVA 提供的搜索引擎库,在库上开发了接口)
Kibana 类似 GUI 端,提供检索日志Web页面
优势:
功能完善
具有丰富的案例(行业应用使用案例丰富)

构建 CDN:
1.智能 DNS 服务器,可根据用户IP源地址,智能返回不同解析结果(例如:北京用户访问,就近返回北京IDC机房负载的IP)
2.缓存服务器,缓存服务器向原服务器访问,缓存原服务器中的静态资源到本地IDC,以减轻原服务器压力和加快用户访问速度(定时同步静态资源,再由访问就近分配缓存服务器IP)
3.因为数据日志分布全国各地,所以需要查看很麻烦,可以使用 Logstash 归集,再通过公网推送到 Elasticsearch 的机房IDC,通过 Kibana 进行日志检索和统计
Squid(章鱼怪):数据在硬盘中,在网络中作为缓存服务器来提高访问速度和减少带宽使用
Varnish Software:数据在内存中,高速缓存网页内容,以减少对后端服务器的负载,并显著提高网站的响应速度和性能
劣势:
资源消耗量大(Logstash、Elastic Search、Kibana都是由 JAVA 语言编写,但JAVA因为跨平台需要虚拟机JVM,所以会很"大")
灵活性差(容器化之前使用多,已经定型了,而现在需要的是更适用于云原生的日志收集工具)
(2)云原生 Loki 分布式方案

Promtail 类似 agent 端,负责收集日志
Grafana loki 类似 storage 端,存储日志并提供对应检索接口
Grafana 类似 GUI 端,提供检索日志Web页面
优势:
资源消耗低
灵活性强 (适用云原生)
搜索速度快
劣势:
案例相对较少(出现时间还较短,相对不够成熟)
(3)详细对比
存储方式:Loki 使用类似于散列表的内存数据结构,不需要进行索引,查询速度快;ELK 和 EFK 使用 Elastic Search 进行索引,查询速度可能比较慢(相同数据量时)
数据收集和处理:Loki 使用 Promtail 进行数据收集和处理,EFK 使用 Fluentd 进行数据收集和处理,ELK 使用 Logstash 进行数据收集和处理,Fluentd 相对于 Logstash 更轻量级,拥有更好的可扩展性;Logstash 可以处理大量数据源,但可能需要更多的资源;Promtail 是为 Loki 设计的,它的性能通常会优于 Logstash,特别是在大规模日志收集场景下,Promtail 可以有效地处理大量的日志数据,并且具有良好的水平扩展性
扩展性:ELK 和 EFK 具有广泛的扩展性和适应性,可以对多种数据源进行处理;Loki 的扩展性相对较弱
学习曲线:ELK 和 EFK 想较于 Loki 具有更陡峭的学习曲线,因为它们具有更多的组件和功能
可视化工具:ELK 和 EFK 使用 Kibana 进行数据可视化,Kibana 提供了丰富的图表、表格和仪表盘等可视化工具;Loki 使用 Grafana(GUI平台) 进行数据可视化,Grafana 也是一个强大的可视化工具,但它可能需要更多的配置和调整
11.2.3 Loki
(1)Loki 概念
Loki 是 Grafana Labs 团队最新的开源项目,是一个集水平可扩展性、高可用性、多租户的日志聚合系统
Like Prometheus,but for logs(照抄 Prometheus,但是只为了日志服务)
与其他日志聚合系统相比,Loki 具有下面的一些特性:
不对日志进行全文索引,通过存储压缩非结构化日志和仅索引元数据,Loki 操作起来会更简单,更省成本(logQL:日志查询语言)
通过使用与 Prometheus 想同的标签记录流对日志进行索引和分组,这使得日志的扩展和操作效率更高
特别适合储存 Kubernetes Pod 日志,诸如 Pod 标签之类的元数据会被自动删除和编入索引(Pod 标签等元数据自动进入日志,对Pod日志中标签自动编入索引)
受 Grafana 原生支持(页面能够通过 Loki 获取)
(2)Loki 组成

Promtail(数据获取端,类似 agent)
用来将容器日志发送到 Loki 或 Grafana 服务上的日志收集工具
该工具主要包括发现采集目标以及给日志流添加上 Label标签(与 Prometheus 想同,通过标签进行数据分层),然后发送给 Loki
Promtail 的服务发现是基于 Prometheus 的服务发现机制实现的(有自动服务发现规则)

Loki
受 Prometheus 启发的可以水平扩展、高可用以及支持多租户的日志聚合系统
使用了和 Prometheus 相同的服务发现机制,将标签添加到日志流中而不是构建全文索引(速度更快)
从 Promtail 接收到的日志和应用的 metrics 指标就具有相同的标签集
不仅提供了更好的日志和指标之间的上下文切换,还避免了对日志进行全文索引

Grafana
一个用于监控和可视化观测的开源平台
支持非常丰富的数据源
在 Loki 技术栈中它专门用来展示来自 Prometheus 和 Loki 等数据源的时间序列数据
可进行查询、可视化、报警等操作
可以用于创建、探索和共享数据 Dashboard
鼓励数据驱动
(3)Loki 架构

Distributor:
用来将容器日志发送到 Loki 或者 Grafana 服务上的日志收集工具
Ingester:
摄取服务负责在写入路径上将日志数据写入长期存储后端(DynamoDB、S3、Cassandra等),并在读取路径上返回内存中查询的日志数据
如果写入被3个摄取器中的2个确认,我们可以容忍一个摄取器丢失,但不能容忍2个,因为这回导致数据丢失
Loki 默认配置为接受无序写入
写过程:
1.从上至下,数据由 写路径Write Path 写入 到 Distributor(Loki 中的 Promtail)
2.当写入到 Distributor 中,数据会进入到 摄取器Ingester,摄取器Ingester 会进行一定过滤的功能(容忍1个丢失)
3.摄取器Ingester 中数据获取完成写入到数据持久化中(DynamoDB、S3、Cassandra等)
4.将数据切成两块,一块是索引,对元信息进行索引,另一块是真实数据
读过程:
1.读前端Query Frontend (Loki 中的 Grafana)进行展示,查询语言Q-querier(Loki 中的 Grafana)从数据中读取
2.规则Ruler(Prometheus 中 Altermanager)支持报警策略
11.2.4 Loki 部署
(1)Loki 安装部署
[root@k8s-master01 11.2]# rz -E rz waiting to receive. [root@k8s-master01 11.2]# ls loki-stack-2.9.11-wangyang.xinxianghf.tgz [root@k8s-master01 11.2]# tar -xvf loki-stack-2.9.11-wangyang.xinxianghf.tgz ......... [root@k8s-master01 11.2]# ls -ltr total 132 drwxr-xr-x 4 root root 208 Nov 14 2023 loki-stack -rw-r--r-- 1 root root 133606 Mar 28 2024 loki-stack-2.9.11-wangyang.xinxianghf.tgz [root@k8s-master01 11.2]# cd loki-stack/ [root@k8s-master01 loki-stack]# ls Chart.yaml README.md charts loki-ingress.yaml requirements.lock requirements.yaml templates values-pre.yaml values.yaml
[root@k8s-master01 loki-stack]# cat values-pre.yaml loki: enabled: true persistence: enabled: true accessModes: - ReadWriteOnce size: 2Gi storageClassName: nfs-client promtail: enabled: true defaultVolumes: - name: run hostPath: path: /run/promtail - name: containers hostPath: path: /data/docker/containers - name: pods hostPath: path: /var/log/pods defaultVolumeMounts: - name: run mountPath: /run/promtail - name: containers mountPath: /data/docker/containers readOnly: true - name: pods mountPath: /var/log/pods readOnly: true grafana: enabled: true persistence: enabled: true accessModes: - ReadWriteOnce size: 2Gi storageClassName: nfs-client
# 下面的卷挂载中 containers 路径 要与 /etc/docker/daemon.json 中 "data-root": "/data/docker" 路径一致 loki: 安装:开启 持久卷: 安装:开启 读写策略: 单点读写 存储大小:2G 存储类名称:nfs-client promtail: 安装:开启 默认的卷: 卷名:run 主机路径: 路径:/run/promtail 卷名:containers 主机路径: 路径: /data/docker/containers 卷名:pods 主机路径: 路径:/var/log/pods 默认的卷挂载: 卷名:run 挂载路径:/run/promtail 卷名:containers 挂载路径:/data/docker/containers 只读:开启 卷名:pods 挂载路径:/var/logs/pods 只读:开启 grafana: 安装:开启 持久卷: 安装:开启 读写策略: 单点读写 存储大小:2G 存储类名称:nfs-client
[root@k8s-master01 loki-stack]# kubectl create namespace loki namespace/loki created [root@k8s-master01 loki-stack]# helm install loki -f values-pre.yaml . -n loki NAME: loki LAST DEPLOYED: Tue Jul 29 21:58:10 2025 NAMESPACE: loki STATUS: deployed REVISION: 1 NOTES: The Loki stack has been deployed to your cluster. Loki can now be added as a datasource in Grafana. See http://docs.grafana.org/features/datasources/loki/ for more detail. [root@k8s-master01 loki-stack]# kubectl get pod -n loki -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES loki-0 1/1 Running 0 102s 10.244.85.231 k8s-node01 <none> <none> loki-grafana-65ff68b754-zv6nc 2/2 Running 0 102s 10.244.58.193 k8s-node02 <none> <none> loki-promtail-6mgwq 1/1 Running 0 102s 10.244.85.230 k8s-node01 <none> <none> loki-promtail-hdc6t 1/1 Running 0 102s 10.244.32.157 k8s-master01 <none> <none> loki-promtail-ntfmj 1/1 Running 0 102s 10.244.58.195 k8s-node02 <none> <none>
# 视频中将 svc 的 type 改为了 NodePort,下面使用了第十章 ingress-nginx 知识,视频:kubectl edit svc loki-grafana -n loki 修改大概 39行内容 type: NodePort
[root@k8s-master01 loki-stack]# kubectl get svc -n loki NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE loki ClusterIP 10.1.168.251 <none> 3100/TCP 17m loki-grafana ClusterIP 10.8.245.61 <none> 80/TCP 17m loki-headless ClusterIP None <none> 3100/TCP 17m loki-memberlist ClusterIP None <none> 7946/TCP 17m [root@k8s-master01 loki-stack]# cat grafana_ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: grafana-ingress namespace: loki spec: ingressClassName: nginx rules: - host: www.grafanatest.com http: paths: - path: / pathType: Prefix backend: service: name: loki-grafana port: number: 80 [root@k8s-master01 loki-stack]# kubectl apply -f grafana_ingress.yaml ingress.networking.k8s.io/grafana-ingress created [root@k8s-master01 loki-stack]# kubectl get ingress -n loki NAME CLASS HOSTS ADDRESS PORTS AGE grafana-ingress nginx www.grafanatest.com 80 7s
# 电脑主机进入目录,在 hosts 文件中添加新的信息 C:\Windows\System32\drivers\etc 192.168.66.12 www.grafanatest.com
# 获取账号和密码 [root@k8s-master01 loki-stack]# kubectl get secret -n loki NAME TYPE DATA AGE loki Opaque 1 48m loki-grafana Opaque 3 48m loki-promtail Opaque 1 48m sh.helm.release.v1.loki.v1 helm.sh/release.v1 1 48m [root@k8s-master01 loki-stack]# kubectl get secret loki-grafana -n loki -o yaml ......... admin-password: OGJtOHJvWXR6Q3JsU1FXcDVNMVhsd2tEcFI0YmRLdGRqTkpyTnhxeQ== admin-user: YWRtaW4= ......... [root@k8s-master01 loki-stack]# echo -n "YWRtaW4="|base64 -d admin[root@k8s-master01 loki-stack]# echo -n "OGJtOHJvWXR6Q3JsU1FXcDVNMVhsd2tEcFI0YmRLdGRqTkpyTnhxeQ=="|base64 -d 8bm8roYtzCrlSQWp5M1XlwkDpR4bdKtdjNJrNxqy[root@k8s-master01 loki-stack]#
# 下面如果登录成功不用做,如果密码提示错误,则是因为之前安装然后卸载了,但是 grafana.db 中会记录首次安装账户、密码的数据,所以要删除,然后重新安装 helm install loki -f values-pre.yaml . -n loki [root@k8s-master01 loki-stack]# helm uninstall loki -n loki
[root@k8s-master01 loki-stack]# kubectl delete pvc --all -n loki
[root@k8s-master01 loki-stack]# df -h|grep nfs-client 192.168.66.11:/nfsdata/share 96G 14G 83G 14% /var/lib/kubelet/pods/cec96439-4905-4ebf-8bec-ed4f09ac3447/volumes/kubernetes.io~nfs/nfs-client-root [root@k8s-master01 ~]# cd /var/lib/kubelet/pods/cec96439-4905-4ebf-8bec-ed4f09ac3447/volumes/kubernetes.io~nfs/nfs-client-root
[root@k8s-master01 nfs-client-root]# ls
default harbor loki
[root@k8s-master01 nfs-client-root]# rm -rf loki/
[root@k8s-master01 loki-stack]# kubectl get secret loki-grafana -n loki -o yaml .......... admin-password: dEh4Z1E1eTZSNFFPdk9EQXBFeFdDWVBrZVFOTkdET09sY1d2dE40RQ== admin-user: YWRtaW4= .......... [root@k8s-master01 loki-stack]# echo 'YWRtaW4='|base64 -d admin[root@k8s-master01 loki-stack]# [root@k8s-master01 loki-stack]# echo 'dEh4Z1E1eTZSNFFPdk9EQXBFeFdDWVBrZVFOTkdET09sY1d2dE40RQ=='|base64 -d tHxgQ5y6R4QOvODApExWCYPkeQNNGDOOlcWvtN4E[root@k8s-master01 loki-stack]#
在浏览器中输入域名 www.grafanatest.com ,可以访问,输入通过 base64 转义后的账号、密码

(2)Loki 使用
Grafana 自动打标签,可以查看日志

Ctrl + f 可以搜索,下方匹配的日志会高亮显示;绿色是 info 日志,红色是 error 日志;下方日志中匹配的结果高亮显示

# 模拟生产后台生成日志
[root@k8s-master01 loki-stack]# kubectl create deployment myapp --image=myapp:v1.0 --replicas=3 deployment.apps/myapp created [root@k8s-master01 loki-stack]# kubectl create svc clusterip myapp --tcp=80:80 service/myapp created [root@k8s-master01 loki-stack]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE myapp ClusterIP 10.14.72.100 <none> 80/TCP 5s [root@k8s-master01 loki-stack]# for i in `seq 20`;do curl 10.14.72.100/hostname.html;curl 10.14.72.100/index.html;sleep 1s; done myapp-77d465c645-gjpv8 Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a> .........

———————————————————————————————————————————————————————————————————————————
无敌小马爱学习
浙公网安备 33010602011771号