0%

InfluxDB官方文档/githab源码

Helm安装

1
helm upgrade --install my-influxdb influxdata/influxdb --set image.tag=2.5.1-alpine

访问:开放nodeport,访问ip:nodeport地址

基础概念

measurement:表

point::一行数据记录

time:时间戳,自带字段,单位纳秒

tags:有各种索引的属性,一般用于

fields:没有索引的属性,一般会实时变化,存经纬度、温度、等变化的数据

annotated CSV数据

csv数据格式
group false false true true false false true true true 组?
datatype string long dateTime:RFC3339 dateTime:RFC3339 dateTime:RFC3339 double string string string 数据类型
default mean 默认值?
result table _start _stop _time _value _field _measurement car 数据表头
0 2022-11-22T07:20:32.833674853Z 2022-11-22T08:20:32.833674853Z 2022-11-22T08:00:30Z 39.90786 lat gps 川A888888 point一行数据
注释 表? 查询的开始时间 查询的结束时间 数据的时间 field的值 field的key tag
csv源数据
1
2
3
4
5
6
7
8
#group,false,false,true,true,false,false,true,true,true
#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,double,string,string,string
#default,mean,,,,,,,,
,result,table,_start,_stop,_time,_value,_field,_measurement,car
,,0,2022-11-22T07:20:32.833674853Z,2022-11-22T08:20:32.833674853Z,2022-11-22T08:00:30Z,39.90786,lat,gps,川A888888
,,0,2022-11-22T07:20:32.833674853Z,2022-11-22T08:20:32.833674853Z,2022-11-22T08:12:40Z,39.91786,lat,gps,川A888888
,,1,2022-11-22T07:20:32.833674853Z,2022-11-22T08:20:32.833674853Z,2022-11-22T08:00:30Z,116.510958,lon,gps,川A888888
,,1,2022-11-22T07:20:32.833674853Z,2022-11-22T08:20:32.833674853Z,2022-11-22T08:12:40Z,116.510928,lon,gps,川A888888

line protocol

1
2
3
4
5
6
measurementName,tagKey=tagValue fieldKey="fieldValue" 1465839830100400200
---------------,--------------- --------------------- -------------------
Measurement tags set fields set timestamp
eg:
gps,car=川A888888 lat=39.90786,lon=116.510958 1669104020000000000
gps,car=川A888888 lat=39.91786,lon=116.510928 1669104759000000000

接入springboot

添加依赖

1
2
3
4
5
<dependency>
<groupId>com.influxdb</groupId>
<artifactId>influxdb-client-java</artifactId>
<version>6.7.0</version>
</dependency>

连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Configuration
public class InfluxdbConfig {

@Value("${spring.influx.url:''}")
private String influxDbUrl;
@Value("${spring.influx.token:''}")
private String influxDbToken;
@Value("${spring.influx.org:''}")
private String influxDbOrg;
@Value("${spring.influx.buket:''}")
private String influxDbBuket;


@Bean
InfluxDBClient influxDBClient(){
InfluxDBClient influxDBClient= InfluxDBClientFactory.create(influxDbUrl,influxDbToken.toCharArray(),influxDbOrg,influxDbBuket);
influxDBClient.setLogLevel(LogLevel.BASIC);
return influxDBClient;
}

}

读写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
@Repository
public class GpsSeriesDao {
private static final Logger LOG = Logger.getLogger(GpsSeriesDao.class.getName());
/**
* 表(_measurement)
*/
private static final String TABLE = "gps";
@Autowired
InfluxDBClient influxDBClient;
@Autowired
InfluxdbConfig influxdbConfig;

/**
* 读数据
* @param carNum
* @param startTime
* @param endTime
* @return
*/
public List<GpsRecord> findTrackByCarNum(String carNum, String startTime, String endTime) {
String flux = "from(bucket: \"" + influxdbConfig.influxDbBuket + "\")\n" +
" |> range(start: " + startTime + ",stop:" + endTime + ")\n" +
" |> filter(fn: (r) => r[\"_measurement\"] == \"" + TABLE + "\")\n" +
" |> filter(fn: (r) => r[\"carNum\"] == \"" + carNum + "\")\n" +
" |> pivot(rowKey:[\"_time\"],columnKey: [\"_field\"],valueColumn: \"_value\") "+
" |> yield(name: \"mean\")";
LOG.info("query flux:\n" + flux);
QueryApi queryApi = influxDBClient.getQueryApi();
List<GpsRecord> gpsRecords = queryApi.query(flux, GpsRecord.class);
return gpsRecords;
}

/**
* 写数据
* @param gpsRecord
*/
public void writeGpsRecord(GpsRecord gpsRecord) {
String timestamp;
if (gpsRecord.getTime() != null) {
timestamp = gpsRecord.getTime().toEpochMilli() + "000000"; //13位转为19位时间戳,数据库才能识别
} else {
throw new BusinessException(ApiCode.PARAM_FORMAT_INCORR.getValue(), "gps time参数格式错误");
}
String data = TABLE + ",carNum=" + gpsRecord.getCarNum() + " lat=" + gpsRecord.getLat() + ",lon=" + gpsRecord.getLon() + " " + timestamp;
LOG.info("Line Protocol:\n" + data);
WriteApiBlocking writeApi = influxDBClient.getWriteApiBlocking();
writeApi.writeRecord(WritePrecision.NS, data);
}
}

常见influxdb flux语句

官方文档

行列转换语句-pivot

在influxdb当有多个field时,每个field查询出来会单独成一行数据,这是就需要添加

1
|> pivot(rowKey:["_time"],columnKey: ["_field"],valueColumn: "_value")

添加之后,就会把多个field换成一行。

常见集成架构

graph LR

A[mqtt/物联网设备] -->B(emq/mqtt服务端)
B --> c[telegraf/数据中转处理]
c --> d[infludb/入库]
d --> e[grafna/展示]

常见问题

  1. 时区问题,在界面上默认是0时区去查询,时间数据导入2022-11-22T08:51:00Z z代表0时区。

    解决:修改容器的时区,添加只读挂在卷

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    spec:
    volumes:
    - name: localtime
    hostPath:
    path: /etc/localtime
    type: ''
    containers:
    volumeMounts:
    - name: localtime
    readOnly: true
    mountPath: /etc/localtime

    添加之后,导入数据也要注意,切换为中国(+8)时区,也就是在时间RFC3339上,就行加8,也就是2022-11-22T08:51:00+08:00进行导入,但是查询时,界面上还是以0时区显示,不方便观察,可以在data explorer->customize->time format选择YYYY-MM-DD hh:mm:ss a ZZ

参考

Go - time.RFC3339 时间格式化

mqtt+emq+influxdb+grafana系统搭建傻瓜教程

对比

时序数据库 排名 Star 安装 优势
InfluxDB 1 24.4k helm 除了不符合信创没有任何可挑剔的,集群版收费(需要许可证),单机版适用于小数据集
TimescaleDb 5 14k helm 基于PostgreSQL,当时序数据库也可以当关系型数据库
OpenTSDB 7 4.8k 基于HBase/部署安装复杂
TDengine 13 19.6k helm 国产性能强悍专为物联网、车联网、工业互联网、IT运维等设计和优化的大数据平台
DophinDB 9 闭源 国产/金融场景用的多

参考

时序数据库选型

apm全链路追踪

产品对比

pinpoint

Pinpoint是用 Java / PHP编写的用于大型分布式系统的 APM(应用程序性能管理)工具。受Dapper的启发,Pinpoint 提供了一种解决方案,通过跟踪分布式应用程序中的事务来帮助分析系统的整体结构以及其中的组件如何互连。

Skywalking

分布式系统的应用程序性能监控工具,专为微服务、云原生和基于容器的 (Kubernetes) 架构而设计。

CAT

  • CAT 是基于 Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。
  • CAT 作为服务端项目基础组件,提供了 Java, C/C++, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。
  • CAT 很大的优势是它是一个实时系统,CAT 大部分系统是分钟级统计,但是从数据生成到服务端处理结束是秒级别,秒级定义是48分钟40秒,基本上看到48分钟38秒数据,整体报表的统计粒度是分钟级;第二个优势,监控数据是全量统计,客户端预计算;链路数据是采样计算。

Zipkin

bonree(收费)

基调听云

Skywalking

helm-k8s安装

1
2
3
4
5
6
7
8
9
10
11
12
13
#添加仓库
helm repo add skywalking https://apache.jfrog.io/artifactory/skywalking-helm
#创建skywalking空间
kubectl create namespace skywalking
#安装
helm install skywalking \
skywalking/skywalking \
--version 4.3.0 \
-n skywalking \
--set oap.image.tag=9.2.0 \
--set oap.storageType=elasticsearch \
--set ui.image.tag=9.2.0 \
--set elasticsearch.imageTag=6.8.6

springboot接入Skywalking

查看Skywalking oap服务地址

集群管理->应用负载->服务->skywalking-oap->dns+服务端口=skywalk oap 后端服务地址

idea agent接入

编辑vm参数,添加如下参数:

java -javaagent:~/skywalking/agent/skywalking-agent.jar -Dskywalking.agent.service_name=your-service-name -Dskywalking.collector.backend_service=127.0.0.1:11800

通过k8s sidecar无侵入接入

kind: Deployment配置文件添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
initContainers: #新添加初始化容器,主要用于拷贝skywalking-agent.jar包,也可以在dockerfile里面的基础镜像直接加,就不用初始化容器
- name: sidecar
#过期不兼容hutool image: apache/skywalking-base:8.1.0-es7 # 容器镜像,包含静态资源文件
image: apache/skywalking-java-agent:8.13.0-java8
imagePullPolicy: IfNotPresent
command: ["cp", "-r", "/skywalking/agent", "/sidecar"]
volumeMounts:
- name: sidecar
mountPath: /sidecar
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}" #springboot 应用镜像
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
- name: JAVA_OPTS
value: -javaagent:/sidecar/agent/skywalking-agent.jar
- name: SW_AGENT_NAME
value: {{ include "springboot-app.fullname" . }} #服务名
- name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
value: "{{.Values.skyWalking.oap}}" # skywalk oap 后端服务
ports:
- containerPort: {{ .Values.containerPort }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
volumeMounts: #新加
- name: sidecar
mountPath: /sidecar
volumes: #新加
- name: sidecar #共享agent文件夹
emptyDir: {}

常见问题

  1. 使用hutool工具的HttpUtil.get方法发现不能追踪链路?

    原理:skywalking版本9.2.0,升级agent镜像,升级之后能追踪。

    解决:将apache/skywalking-base:8.1.0-es7替换成 apache/skywalking-java-agent:8.13.0-java8

参考

KubeSphere 部署 SkyWalking 至 Kubernetes 开启无侵入 APM

使用/不使用 Istio 将 Envoy 指标发送到 SkyWalking

概念

KubeSphere 服务网格基于开源项目 Istio 构建,可以控制应用程序不同部分之间的通信方式。其中,灰度发布策略为用户在不影响微服务之间通信的情况下测试和发布新的应用版本发挥了重要作用。

服务网格

服务网格基于 Istio,将微服务治理和流量管理可视化。它拥有强大的工具包,包括熔断机制、蓝绿部署、金丝雀发布、流量镜像、链路追踪、可观测性和流量控制等。

istio

架构

Istio 服务网格从逻辑上分为数据平面控制平面

  • 数据平面 由一组智能代理(Envoy)组成,被部署为 Sidecar。这些代理负责协调和控制微服务之间的所有网络通信。它们还收集和报告所有网格流量的遥测数据。

    组件一: Envoy 特性动态服务发现、负载均衡、TLS 终端、HTTP/2 与 gRPC 代理、熔断器、健康检查、基于百分比流量分割的分阶段发布、故障注入、丰富的指标。

  • 控制平面 管理并配置代理来进行流量路由。

    组件二:Istiod 提供服务发现、配置和证书管理。

部署模型
  • 集群模型:单一/多集群
  • 网络模型:单一/多网络
  • 控制平面模型
  • 身份和信任模型:网格内/网格之间信任
  • 网格模型:单一/多网格
  • 租户模型:命名空间租赁/集群租户模型
Ingress

控制 Istio 服务网格的入口流量。

Egress

控制 Istio 服务网格的出口流量。

灰度发布策略

当您在 KubeSphere 中升级应用至新版本时,灰度发布可以确保平稳过渡。采用的具体策略可能不同,但最终目标相同,即提前识别潜在问题,避免影响在生产环境中运行的应用。这样不仅可以将版本升级的风险降到最低,还能测试应用新构建版本的性能。

蓝绿部署

蓝绿发布提供零宕机部署,即在保留旧版本的同时部署新版本。在任何时候,只有其中一个版本处于活跃状态,接收所有流量,另一个版本保持空闲状态。如果运行出现问题,您可以快速回滚到旧版本。

  • 特点:任何时刻只有一个环境接收流量。

金丝雀发布

控制一部分流量到新的环境,待确认没问题,便可把所有流量转移到新环境。

  • 特点:流量逐步转移,风险降到最低。

流量镜像

复制实时产生的流量推送至新部署的镜像环境。

  • 特点:可以对比新旧环境流量处理的效率,测试集群,测试数据库。

实战

部署Bookinfo示例应用

  1. 启用服务组件Istio

  2. 创建一个项目

  3. 为新建的项目设置网关: 项目设置-->高级设置-->设置网关-->NodePort/LoadBalancer

  4. 应用负载-->应用模版-->如何使用应用治理--部署示例应用然后一路下一步即可

  5. 应用负载-->自制应用-->bookinfo-->点击访问进行访问应用

    访问地址http://productpage.exxk-lab.10.25.24.12.nip.io:31612/分析:

    productpage.exxk-lab.10.25.24.12.nip.io:31612是dns泛域名,nip.io是一个免费域名解析服务,会自动指向10.25.24.12不需要配置hosts映射文件。

helm chart语法

  1. 在githuab创建helm-charts仓库

  2. 克隆代码到本地git clone git@github.com:iexxk/helm-charts.git

  3. 进入cd helm-charts目录,创建目录执行mkdir charts

  4. 创建发布流程文件,执行mkdir -p .github/workflows

  5. 创建github操作流文件.github/workflows/release.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    name: Release Charts

    on:
    push:
    branches:
    - main

    jobs:
    release:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
    uses: actions/checkout@v2
    with:
    fetch-depth: 0

    - name: Configure Git
    run: |
    git config user.name "$GITHUB_ACTOR"
    git config user.email "$GITHUB_ACTOR@users.noreply.github.com"

    - name: Run chart-releaser
    uses: helm/chart-releaser-action@v1.1.0
    env:
    CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
  6. 进入github项目页面创建分支gh-pages

  7. 创建chart,进入charts目录,执行helm create nginx-file-browser创建nginx-file-browser项目

  8. 依次执行git add . git commit -m "init"git push

  9. 等待github编译部署成功,gh-pages分支内会多一个或更新yaml的文件

  10. 同步到artifacthub,在控制面板点击添加,输入名字:exxk,和url:https://iexxk.github.io/helm-charts

  11. 等待2+分钟,刷新,就能搜索到自己github仓库的chart了。

测试使用
1
2
3
4
5
6
7
helm repo add exxk https://iexxk.github.io/helm-charts #添加仓库
helm search repo exxk #查看仓库有哪些chart
helm repo update #更新仓库
#安装
helm install --set nfs.enabled=true --set nfs.server=127.0.0.1 my-nginx-file-browser exxk/nginx-file-browser
#卸载
helm delete my-nginx-file-browser

常见问题

  1. 国内拉去release压缩发布版本时,因为网络原因容易失败。

    解决:

    引入最新版helm/chart-releaser-action自动发布,修改helm-charts/.github/workflows/release.yml文件内容如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    name: Release Charts

    on:
    push:
    branches:
    - main

    jobs:
    release:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
    uses: actions/checkout@v2
    with:
    fetch-depth: 0

    - name: Configure Git
    run: |
    git config user.name "$GITHUB_ACTOR"
    git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
    - name: Run chart-releaser
    uses: helm/chart-releaser-action@v1.4.1
    env:
    CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
    - name: github fast
    run: |
    git status
    git checkout gh-pages
    git pull
    ls
    sed -i "s/github.com/download.fastgit.org/g" index.yaml
    git add index.yaml
    git commit -m "update url"
    git push

参考

GitHub、Google等镜像加速地址收集

注意事项

版本号不变化,是不会覆盖发布的,注意每次修改Chart.yaml的版本号version: 0.1.1

vpn选型

  • openvpn: mac需要单独安装客户端,虽然以前安装过,暂时不考虑
  • strongswan:不需要客户端,但是放在容器不知道为啥通过127.0.0.1连不上
  • algo:
  • SoftEther:
  • Streisand:
  • WireGuard:

strongswan安装(mac不能连接)

1
2
3
4
5
6
7
8
9
10
11
12
13
14

# ipsec version
Linux Libreswan 4.7 (XFRM) on 5.10.104-linuxkit

# sysctl net.ipv4.ip_forward=1
# sysctl net.ipv6.conf.all.forwarding=1
# sysctl net.ipv4.conf.all.accept_redirects=0
# sysctl net.ipv4.conf.all.send_redirects=0

# SHARED_SECRET="123$(openssl rand -base64 32 2>/dev/null)"
# echo ": PSK \"${SHARED_SECRET}\"" > /etc/ipsec.secrets

# /usr/sbin/ipsec start --nofork

dockerfile源码

错误:mac vpn 连接 发生意外错误 49: Can’t assign requested address

解决: 没找到解决方案,放弃

1
2
3
4
5
6
7
8
9
10
docker run -d --name snx-vpn --cap-add=ALL \
-p 500:500/udp \
-p 4500:4500/udp \
-p 1701:1701/tcp \
-p 1194:1194/udp \
-p 5555:5555/tcp \
-e PSK="1238AwC0L+TIvFTtB2ZKJ+RjWsrQk7qCPrE4JlwXhJaNts=" \
-e USERNAME=admin \
-e PASSWORD=admin123456 \
siomiz/softethervpn

参考

How to Install and Configure strongSwan VPN on Ubuntu 18.04

gaomd/docker-ikev2-vpn-server

strongSwan文档

如何快速搭建VPN,六款VPN服务器上最好的自由和开源工具,轻松搭建个人VPN

需求,电脑想连2个check point vpn,但是网上客户端支持一个

因此另一个打算用snx加容器进行部署然后在用snell来代理到surge上面进行访问,因此需要制作一个snx加上snell的镜像。

采用snell的原因,比较简单,其他的strongSwan、ss都比较复杂。

编译源码件iexxk/checkpoint-snx-snell

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#启动容器
docker run --name snx-vpn --cap-add=ALL -p 500:500 -v /lib/modules:/lib/modules -d exxk/checkpoint-snx-snell:latest
#进入容器
docker exec -it snx-vpn bash
#登录vpn,执行下面的命令会提示输入密码,然后提示是否接受,然后输入y
snx -s 服务svn的ip -u 用户名
#查看vpn路由地址
route
Destination Gateway Genmask Flags Metric Ref Use Iface
192.16.192.0 0.0.0.0 255.255.224.0 U 0 0 0 tunsnx
192.16.250.1 0.0.0.0 255.255.255.255 UH 0 0 0 tunsnx
U对应SRC-IP类型
UH对应IP-CIDR类型 255.255.224.0对应192.16.192.0/19 详细见:子网掩码计算
一个255对应8位,三个255就是3*8=24,最后一个不是2个8位+11100000(单个1)转换为十进制就是224
#snx断开
snx -d
#停止容器
docker stop snx-vpn
#删除容器
docker rm snx-vpn

自定义修改配置

修改配置可以修改容器内这个/etc/snell/snell-server.conf配置文件,可以修改psk密码(如果暴露在外一定要修改密码)和端口

客户端配置

配置代理

进入surge-->代理-->策略-->规则判断-->新建一个代理

配置

  • 服务器地址:容器的宿主机地址(本机就127.0.0.1)
  • 端口:默认500
  • PSK:默认2iPRYDZyOVfjRwt9
  • 混淆:TLS

然后根据那些地址自己要走代理的地方设置走该代理即可

配置路由规则

进入surge-->代理-->规则-->新建一个规则,添加容器里面的路由到规则里面

终端使用代理

在当前终端执行export https_proxy=http://127.0.0.1:6152;export http_proxy=http://127.0.0.1:6152;export all_proxy=socks5://127.0.0.1:6153

退出终端失效,测试不能用ping,ping不是http协议和socks5协议,用curl -vv https://www.google.com

终端使用ssh代理

ssh -o "ProxyCommand=nc -X 5 -x 127.0.0.1:6153 %h %p" root@10.1.1.10

royal TSX使用代理

连接右键-->properties-->advanced-->SSH-->Additional SSH Options添加该内容-o "ProxyCommand=nc -X 5 -x 127.0.0.1:6153 %h %p"

常见问题

  1. SNX: Virtual Network Adapter initialization and configuration failed. Try to reconnect.

    解决:apt-get install kmod

  2. SNX: Routing table configuration failed. Try to reconnect.

    解决:docker run --cap-add=ALL -v /lib/modules:/lib/modules -t checkpoint-snx-snell:22.9.21 添加--cap-add=ALL

  3. SNX: Connection aborted.

    解决:去vpn服务器用sifra浏览器访问,下载ssl network extender(linux)版本,然后执行docker cp snx_install.sh snx-vpn:/ 进入容器执行chmod +x snx_install.sh && ./snx_install.sh

    解决2: 升级docker版本之后You’re currently on version 4.11.1 (84025). The latest version is 4.13.1 (90346)也提示该错误,回退版本到4.11.1(84025)解决。

  4. Another session of SNX is already running, aborting…

    解决:执行snx -d断开连接,然后重新连接。

参考

子网掩码计算

snx安装包

snx安装先决条件

primovist/snell.sh

surge-networks/snell

Kedu-SCCL/docker-snx-checkpoint-vpn

用 strongSwan 搭建免证书的 IKEv2 VPN

Docker 的(Linux/Mac OS)网络配置问题

Docker for Mac 的网络问题及解决办法

需求

因为Jenkins经常产生尸体容器,所以需要一个定时任务清理错误的容器

解决方案-采用

原生命令:kubectl get pods -n kubesphere-devops-system |grep Error |awk '{print $1}' |xargs kubectl delete pod -n kubesphere-devops-system

  1. 集群管理—>配置中心—>服务账户—>项目[kubesphere-devops-system]—>创建[test]—>选择管理员权限

    单独创建的原因:defalut的账户没有删除的权限,通过创建账号可以生产token,然后修改权限即可,创建的容器会默认加载defalut的token,但是因为没权限,所以需要自己挂载。

  2. 集群管理—>应用负载—>任务—>定时任务[kubesphere-devops-system]—>创建[jenkins-agent-clean]

    容器镜像配置:

    1
    2
    3
    镜像:bitnami/kubectl:latest
    运行命令:sh
    参数:kubectl get pods -n kubesphere-devops-system |grep Error|awk '{print $1}' |xargs kubectl delete pod -n kubesphere-devops-system

    挂载存储配置:

    1
    2
    3
    密钥:test-token-xxxx
    模式:只读
    挂载目录:/var/run/secrets/kubernetes.io/serviceaccount

生成的完整的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
apiVersion: batch/v1beta1
kind: CronJob
metadata:
namespace: kubesphere-devops-system
labels:
app: jenkins-agent-clean
name: jenkins-agent-clean
annotations:
kubesphere.io/description: 定时清理jenkins的死掉编译的容器
spec:
concurrencyPolicy: Forbid
jobTemplate:
metadata:
labels:
app: jenkins-agent-clean
spec:
template:
spec:
containers:
- name: container-suzpfl
imagePullPolicy: IfNotPresent
image: 'bitnami/kubectl:latest'
command:
- sh
args:
- '-c'
- >-
kubectl get pods -n kubesphere-devops-system |grep Error|awk
'{print $1}' |xargs kubectl delete pod -n
kubesphere-devops-system
volumeMounts:
- name: volume-sjpdty
readOnly: true
mountPath: /var/run/secrets/kubernetes.io/serviceaccount
restartPolicy: Never
serviceAccount: default
initContainers: []
volumes:
- name: volume-sjpdty
secret:
secretName: test-token-f2fxz
imagePullSecrets: null
metadata:
annotations:
logging.kubesphere.io/logsidecar-config: '{}'
schedule: 0 * * * *

旧版安装

loki-stack-2.1.2 会安装有状态副本集loki和守护进程集loki-promtail

1
2
3
helm repo add loki https://grafana.github.io/loki/charts
#默认安装有状态副本集loki和守护进程集loki-promtail,--set grafana.enabled=true额外安装grafana
helm upgrade --install loki loki/loki-stack --version 2.1.2 --set grafana.enabled=true --namespace=kubesphere-loki-system

单独的grafana安装

1
2
helm repo add grafana https://grafana.github.io/helm-charts
helm install my-grafana grafana/grafana

新版安装

Loki-stack-2.6.5

1
2
3
helm upgrade --install loki grafana/loki-stack --set grafana.enabled=true
#查看密码
kubectl get secret --namespace <YOUR-NAMESPACE> loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

配置

Loki的部署如果是emptyDir: {}数据不会持久话,重启会丢失,因此尽量配置nfs目录挂载,重启就不会丢失了。

Grafana Loki 存储保留

查看路径: 平台管理--->集群--->配置中心--->密钥--->[filter]kubesphere-loki-system--->loki--->右侧眼睛(不然是加密的)

修改:在查看路径的基础上 更多操作--->编辑密钥--->loki.yaml--->编辑

Loki.yaml配置详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
auth_enabled: false
chunk_store_config:
max_look_back_period: 0s #为避免查询超过保留期的数据,必须小于或等于table_manager时间值 如果开启24h
compactor:
shared_store: filesystem
working_directory: /data/loki/boltdb-shipper-compactor
ingester:
chunk_block_size: 262144
chunk_idle_period: 3m
chunk_retain_period: 1m
lifecycler:
ring:
kvstore:
store: inmemory
replication_factor: 1
max_transfer_retries: 0
limits_config:
enforce_metric_name: false
reject_old_samples: true #是否拒绝老样本
reject_old_samples_max_age: 168h #168h之前的样本将会被删除
schema_config:
configs:
- from: "2020-10-24"
index:
period: 24h
prefix: index_
object_store: filesystem
schema: v11
store: boltdb-shipper
server:
http_listen_port: 3100
storage_config:
boltdb_shipper:
active_index_directory: /data/loki/boltdb-shipper-active
cache_location: /data/loki/boltdb-shipper-cache
cache_ttl: 24h
shared_store: filesystem
filesystem:
directory: /data/loki/chunks # 块存储路径
table_manager: #表管理器
retention_deletes_enabled: false #是否开启删除 如果开启 true
retention_period: 0s #保留时间,0s不保留 , 如果开启 24h

参考

loki 自定义部署配置

常见错误

  1. 启动过报错

    1
    level=error ts=2022-08-10T01:49:48.744952015Z caller=table.go:81 msg="failed to cleanup table" name=index_19214

创建nfs服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
yum install rpcbind nfs-utils #所有机器都要安装,他是通过宿主机来挂载的
systemctl start rpcbind #开启服务
systemctl start nfs-server # 开启服务
systemctl enable rpcbind # 开机启动
systemctl enable nfs-server #开机启动
mkdir -p /share
vim /etc/exports
#添加如下内容rw表示可读可写; no_root_squash的配置可以让任何用户都能访问此文件夹,192.168.4.*不支持,会出现访问拒绝的错误
/share 192.168.4.1(rw,no_root_squash)
#加载配置服务
exportfs -rv
#测试挂载
mount -t nfs 192.168.4.2:/share /root/testshare
#删除挂载
umount /root/testshare
#mac测试挂载,在finder按快捷键command+k,输入如下地址
nfs://192.168.4.2/share

k8s配置使用nfs存储类nfs-client-provisioner

旧版不支持kubernetes 1.20以上版本

1
2
3
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm install my-release --set nfs.server=192.168.4.2 --set nfs.path=/share stable/nfs-client-provisioner
helm delete my-release #卸载

新版

1
2
3
4
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.4.2 \
--set nfs.path=/share

使用

创建pvc,新建nginx-pvc-nfs.yaml 文件内容如下

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-pvc
spec:
storageClassName: nfs-client
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Mi

执行kubectl apply -f nginx-pvc-nfs.yaml ,检查pvc是否创建成功

创建部署,新建nginx-deployment.yaml文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
volumes:
- name: nginx-data
persistentVolumeClaim:
claimName: nginx-pvc
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: nginx-data

执行kubectl apply -f nginx-deployment.yaml

总结

nfs-client-provisioner容器只有在创建pvc的时候会通过该容器来连接管理nfs,pvc创建成功之后就与nfs-client-provisioner无关了,不管他是否还在运行。

nfs的挂载不是在容器内部,还是依赖于宿主机,因此宿主机需要有挂载的依赖等等

查看nfs的挂载情况

可以在pod所在机器执行df -h可以看到类似下面的输出

1
10.25.207.176:/mnt/data/kubesphere-loki-system-loki-storage-pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588  9.8G  1.8G  7.5G   19% /var/lib/kubelet/pods/4d276910-7529-4355-8d92-6cfa1da68825/volumes/kubernetes.io~nfs/pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588

问题

  1. nfs-client-provisioner容器报错: unexpected error getting claim reference: selfLink was empty, can't make reference

    原因:kubernetes在1.20版本移除了SelfLink,kubernetes Deprecate and remove SelfLink

    解决:nfs-client-provisioner使用新版

  2. 拉去镜像报错:Back-off pulling image "k8s.gcr.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2"

    解决:使用docker代理镜像在线生成地址

  3. 部署nginx时,使用挂载卷,多台时,其中一台报错如下

    1
    2
    3
    4
    异常	FailedMount	2 分钟前
    (近 4 分钟发生 2 次) kubelet Unable to attach or mount volumes: unmounted volumes=[nginx-data], unattached volumes=[nginx-data kube-api-access-vq8pp]: timed out waiting for the condition
    异常 FailedMount 1 秒前
    (近 7 分钟发生 11 次) kubelet MountVolume.SetUp failed for volume "pvc-bb951005-5152-4ab8-ba6c-251d11af5c7a" : mount failed: exit status 32 Mounting command: mount Mounting arguments: -t nfs 192.168.4.2:/share/default-nginx-pvc-pvc-bb951005-5152-4ab8-ba6c-251d11af5c7a /var/lib/kubelet/pods/f274b225-5cec-432b-8b84-35f9355b0486/volumes/kubernetes.io~nfs/pvc-bb951005-5152-4ab8-ba6c-251d11af5c7a Output: mount.nfs: access denied by server while mounting 192.168.4.2:/share/default-nginx-pvc-pvc-bb951005-5152-4ab8-ba6c-251d11af5c7a

    解决:修改/etc/exports添加权限

  4. 客户端连接测试时

    1
    2
    3
    4
    5
    6
    7
    8
    [root@xxx mnt]# mount -t nfs 10.255.7.6:/mnt/data /mnt/test
    mount: 文件系统类型错误、选项错误、10.255.7.6:/mnt/data 上有坏超级块、
    缺少代码页或助手程序,或其他错误
    (对某些文件系统(如 nfs、cifs) 您可能需要
    一款 /sbin/mount.<类型> 助手程序)

    有些情况下在 syslog 中可以找到一些有用信息- 请尝试
    dmesg | tail 这样的命令看看。

    解决:安装nfs客户端:yum install -y nfs-utilssystemctl start nfs-utils

  5. 错误日志如下:

    1
    MountVolume.SetUp failed for volume "pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588" : mount failed: exit status 32 Mounting command: systemd-run Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/bb3fdc10-38de-4437-b8df-81b207e57f1d/volumes/kubernetes.io~nfs/pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588 --scope -- mount -t nfs 10.255.247.176:/mnt/data/kubesphere-loki-system-loki-storage-pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588 /var/lib/kubelet/pods/bb3fdc10-38de-4437-b8df-81b207e57f1d/volumes/kubernetes.io~nfs/pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588 Output: Running scope as unit run-62186.scope. mount: wrong fs type, bad option, bad superblock on 10.255.247.176:/mnt/data/kubesphere-loki-system-loki-storage-pvc-dc2431fb-5352-4265-8a9d-0a11b69d8588, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so.

    解决:简短错误信息就是mount 32错误,基本就是挂载忙,或者宿主机没有安装nfs-utils,因此集群所有节点最好执行安装yum install -y nfs-utils,不然部署的时候随机换了一台机器就会提示该错误