1206-1303 Kubernetes集群的备份和还原 优化 Kubernetes全链路监控 12.6-13.3

发布时间 2023-11-06 20:59:44作者: zhan0

一、Kubernetes集群的备份和还原

1.1 获取etcdctl二进制文件

查看etcd版本号

# kubectl -n kube-system  exec -it $(kubectl get po -n kube-system |grep etcd- |head -1|awk '{print $1}') -- etcd --version
etcd Version: 3.5.7
Git SHA: 215b53cf3
Go Version: go1.17.13
Go OS/Arch: linux/amd64

从github下载etcd 3.5.7 版本包文件

wget https://github.com/etcd-io/etcd/releases/download/v3.5.7/etcd-v3.5.7-linux-amd64.tar.gz

解压etcd-v3.5.7-linux-amd64.tar.gz

tar zxf etcd-v3.5.7-linux-amd64.tar.gz -C /opt/

将可执行文件软链接到/bin/ 目录

ln -s /opt/etcd-v3.5.7-linux-amd64/etcdctl /bin/

1.2在master-1-230 节点备份

[root@master-1-230 opt]# mkdir -p /opt/etcd_backup/
您在 /var/spool/mail/root 中有新邮件
[root@master-1-230 opt]# ETCDCTL_API=3 etcdctl \
> snapshot save /opt/etcd_backup/snap-etcd-$(date +%F-%H-%M-%S).db \
> --endpoints=https://192.168.1.230:2379 \
> --cacert=/etc/kubernetes/pki/etcd/ca.crt \
> --cert=/etc/kubernetes/pki/etcd/server.crt \
> --key=/etc/kubernetes/pki/etcd/server.key
{"level":"info","ts":"2023-11-05T11:47:50.405+0800","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"/opt/etcd_backup/snap-etcd-2023-11-05-11-47-50.db.part"}
{"level":"info","ts":"2023-11-05T11:47:50.412+0800","logger":"client","caller":"v3@v3.5.7/maintenance.go:212","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2023-11-05T11:47:50.412+0800","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"https://192.168.1.230:2379"}
{"level":"info","ts":"2023-11-05T11:47:50.460+0800","logger":"client","caller":"v3@v3.5.7/maintenance.go:220","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2023-11-05T11:47:50.552+0800","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"https://192.168.1.230:2379","size":"5.0 MB","took":"now"}
{"level":"info","ts":"2023-11-05T11:47:50.552+0800","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"/opt/etcd_backup/snap-etcd-2023-11-05-11-47-50.db"}
Snapshot saved at /opt/etcd_backup/snap-etcd-2023-11-05-11-47-50.db

1.3 恢复(单节点etcd)

停止kube-apiserver和etcd Pod

mv /etc/kubernetes/manifests/ /etc/kubernetes/manifests_bak  ##将目录改名,就会自动停掉
模拟删除etcd数据
mv /var/lib/etcd/  /var/lib/etcd_bak
恢复tcd数据
ETCDCTL_API=3 /opt/etcd-v3.5.7-linux-amd64/etcdutl snapshot restore /opt/etcd_backup/snap-etcd-2023-11-05-11-47-50.db --data-dir=/var/lib/etcd  ##/var/lib/etcd/目录会自动生成

启动kube-apiserver和etcd Pod

mv /etc/kubernetes/manifests_bak  /etc/kubernetes/manifests  #目录挪回去,服务会自动起来

查看删除的Pod

kubectl get po

1.4 恢复(etcd集群)

将master-1-230备份的etcd数据和etcdctl可执行文件copy到另外2个节点

[root@master-1-230 etcd_backup]# scp /opt/etcd_backup/snap-etcd-2023-11-05-11-47-50.db  master-1-234:/tmp/
snap-etcd-2023-11-05-11-47-50.db                                                                                                   100% 4896KB  52.1MB/s   00:00    
您在 /var/spool/mail/root 中有新邮件
[root@master-1-230 etcd_backup]# scp /opt/etcd_backup/snap-etcd-2023-11-05-11-47-50.db  master-1-235:/tmp/
snap-etcd-2023-11-05-11-47-50.db 

# scp -r /opt/etcd-v3.5.7-linux-amd64/  master-1-234:/opt/
The authenticity of host 'master-1-234 (192.168.1.234)' can't be established.
ECDSA key fingerprint is SHA256:JF34KxGa2jCFAjdEQnmCxD6Ff5Ywbl9ieLAOQUdhwAE.
ECDSA key fingerprint is MD5:5e:09:1e:13:72:5c:71:82:c8:9e:93:c9:e2:63:67:7a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'master-1-234' (ECDSA) to the list of known hosts.
README.md                                                                                                                          100% 9394     5.8MB/s   00:00    
READMEv2-etcdctl.md                                                                                                                100% 7896     4.6MB/s   00:00    
etcdutl                                                                                                                            100%   13MB  73.7MB/s   00:00    
etcdctl                                                                                                                            100%   16MB  63.2MB/s   00:00    
README.md                                                                                                                          100%  532   533.7KB/s   00:00    
v3election.swagger.json                                                                                                            100%   12KB   5.3MB/s   00:00    
rpc.swagger.json                                                                                                                   100%   91KB  39.8MB/s   00:00    
v3lock.swagger.json                                                                                                                100% 5670     4.1MB/s   00:00    
README-etcdutl.md                                                                                                                  100% 7359     7.7MB/s   00:00    
README-etcdctl.md                                                                                                                  100%   41KB  26.1MB/s   00:00    
etcd                                                                                                                               100%   22MB  36.8MB/s   00:00    
[root@master-1-230 etcd_backup]# scp -r /opt/etcd-v3.5.7-linux-amd64/  master-1-235:/opt/
The authenticity of host 'master-1-235 (192.168.1.235)' can't be established.
ECDSA key fingerprint is SHA256:rNDJIissGX1rU+raciQMvD2I2CzjY3w2KvErxzKDfCA.
ECDSA key fingerprint is MD5:51:42:52:c1:64:fa:4f:80:fe:d9:00:74:dc:10:be:ed.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'master-1-235' (ECDSA) to the list of known hosts.
README.md                                                                                                                          100% 9394     5.7MB/s   00:00    
READMEv2-etcdctl.md                                                                                                                100% 7896     5.0MB/s   00:00    
etcdutl                                                                                                                            100%   13MB  74.7MB/s   00:00    
etcdctl                                                                                                                            100%   16MB  69.4MB/s   00:00    
README.md                                                                                                                          100%  532   447.7KB/s   00:00    
v3election.swagger.json                                                                                                            100%   12KB   8.6MB/s   00:00    
rpc.swagger.json                                                                                                                   100%   91KB  36.1MB/s   00:00    
v3lock.swagger.json                                                                                                                100% 5670     3.4MB/s   00:00    
README-etcdutl.md                                                                                                                  100% 7359     6.4MB/s   00:00    
README-etcdctl.md                                                                                                                  100%   41KB  21.6MB/s   00:00    
etcd                                                                                                                               100%   22MB  63.3MB/s   00:00    
[root@master-1-230 etcd_backup]# 

在部署etcd节点停掉kube-apiserver和etcd Pod

mv /etc/kubernetes/manifests/ /etc/kubernetes/manifests_bak  ##将目录改名,就会自动停掉
模拟删除etcd数据
mv /var/lib/etcd/  /var/lib/etcd_bak

在etcd 3个节点分别恢复数据

master-1-230上恢复etcd数据

ETCDCTL_API=3 /opt/etcd-v3.5.7-linux-amd64/etcdutl snapshot restore /opt/etcd_backup/snap-etcd-2023-11-05-11-47-50.db --data-dir=/var/lib/etcd --name master-1-230 --initial-cluster="master-1-230=https://192.168.1.230:2380,master-1-235=https://192.168.1.235:2380,master-1-234=https://192.168.1.234:2380
--initial-advertise-peer-urls="https://192.168.1.230:2380"

master-1-234上恢复etcd数据

ETCDCTL_API=3 /opt/etcd-v3.5.7-linux-amd64/etcdutl snapshot restore /tmp/snap-etcd-2023-11-05-11-47-50.db --data-dir=/var/lib/etcd --name master-1-234 --initial-cluster="master-1-230=https://192.168.1.230:2380,master-1-235=https://192.168.1.235:2380,master-1-234=https://192.168.1.234:2380
--initial-advertise-peer-urls="https://192.168.1.234:2380"

master-1-235上恢复etcd数据

ETCDCTL_API=3 /opt/etcd-v3.5.7-linux-amd64/etcdutl snapshot restore /tmp/snap-etcd-2023-11-05-11-47-50.db --data-dir=/var/lib/etcd --name master-1-235 --initial-cluster="master-1-230=https://192.168.1.230:2380,master-1-235=https://192.168.1.235:2380,master-1-234=https://192.168.1.234:2380
--initial-advertise-peer-urls="https://192.168.1.235:2380"

在部署etcd节点启动kube-apiserver和etcd Pod

mv /etc/kubernetes/manifests_bak  /etc/kubernetes/manifests  #目录挪回去,服务会自动起来

二、 Kubernetes集群优化

Kubernetes 自 v1.6 以来,官方就宣称单集群最大支持 5000 个节点。不过这只是理论上,在具体实践中从 0 到 5000,还是有很长的路要走,需要见招拆招。

1)官方标准如下:

  • 不超过 5000 个节点
  • 不超过 150000 个 pod
  • 不超过 300000 个容器
  • 每个节点不超过 100 个 pod

2)Master节点配置优化

Master节点上CPU和内存推荐配置:
 
工作节点数
CPU配置
内存配置
1-5
1核
3.75G
6-10
2核
7.5G
11-100
4核
15G
101-250
8核
30G
251-500
16核
60G
500以上
32核
120G
 

3)kube-apiserver 优化

高可用

启动多个kube-apiserver实例通过外部LB做负载均衡,而LB本身也需要做高可用,所以我们用的是Keepalived+Haproxy模式。

控制连接数

在Kubernetes中,"突变请求"(Mutating Requests)是指对资源进行更改的请求,例如创建、更新或删除资源。这些请求会修改集群中的状态或配置。
相对地,"非突变请求"(Non-Mutating Requests)是指不会对资源进行更改的请求,通常是读取或观察资源的请求,例如获取资源的信息或列表。
Kubernetes API Server(apiserver)区分这两种类型的请求,以便能够采取不同的处理策略和并发限制。因为突变请求对集群状态产生更直接的影响,所以通常需要更加谨慎和有限制的处理。
kube-apiserver 以下两个参数可以控制连接数:
  • --max-mutating-requests-inflight : 用于限制并发进行的突变请求的数量。 确保在任何给定时间点上并发进行的突变请求数量不超过设置的限制。这可以帮助防止对apiserver的过度负载,防止资源竞争和故障。如果设置为0表示不限制,默认值为 200。
  • --max-requests-inflight : 用于限制非突变请求的最大并发数。 如果设置为0表示不限制,默认值为 400。
 
如何设置参数呢?
    以直接修改/etc/kubernetes/manifests/kube-apiserver.yaml,增加参数即可
  • 节点数量在 1000 - 3000 之间时,推荐:
    --max-requests-inflight=1500
    --max-mutating-requests-inflight=500
  • 节点数量大于 3000 时,推荐:
    --max-requests-inflight=3000
    --max-mutating-requests-inflight=1000

 

4)kube-scheduler与kube-controller-manager优化

高可用

kube-controller-manager 和 kube-scheduler 是通过 leader election 实现高可用,启用时需要添加以下参数:
--leader-elect=true
--leader-elect-lease-duration=15s
--leader-elect-renew-deadline=10s
--leader-elect-resource-lock=endpoints
--leader-elect-retry-period=2s
按照我们在前面高可用部署方法部署就自动增加了--leader-elect=true
该参数需要修改/etc/kubernetes/manifests/kube-controller-manager.yaml和/etc/kubernetes/manifests/kube-scheduler.yaml

控制 QPS(Controller-manager)

与 kube-apiserver 通信的 qps 限制,推荐为:
--kube-api-qps=100


控制burst(Controller-manager)
--kube-api-burst 是 Kubernetes API Server(kube-apiserver)的一个参数,用于控制 API 请求的突发请求数。
该参数定义了 kube-apiserver 在短时间内可以处理的请求数量上限,用于应对突发的请求流量。突发请求数是在超过 --kube-api-qps 参数定义的每秒请求数限制时允许的短期爆发请求的数量。
例如,--kube-api-burst=200 表示在 --kube-api-qps 所定义的每秒请求限制之上,kube-apiserver 可以接受最多 200 个突发请求。推荐为:
--kube-api-burst=200
以上两个参数需要修改 /etc/kubernetes/manifests/kube-controller-manager.yaml

5)Kubelet 优化

  • 设置 --image-pull-progress-deadline=30m: 该参数定义了这个拉取过程的超时时间。如果在超时时间内未完成镜像的拉取操作,kubelet 将终止该操作并报告失败。
  • 设置 --serialize-image-pulls=false:该参数用于控制容器镜像的并发拉取行为,当设置为 true 时,kubelet 将以串行方式拉取容器镜像。这意味着每个容器将按顺序进行镜像拉取,一个接一个地执行。所以,这里设置为false,可以做到并发拉取镜像。
  • 设置--max-pods=110:Kubelet 单节点允许运行的最大 Pod 数,默认是 110,可以根据实际需要设置。

6)Etcd优化

高可用部署
最好是单独拆分出来,部署成一个集群(可以使用kubeadm部署),然后在初始化时再指定外部Etcd集群即可
参考: https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/high-availability/
 
磁盘IO
对于Etcd使用的磁盘最好是使用SSD盘,提高磁盘的IO性能。
 
提高Etcd进程的IO优先级
由于 ETCD 必须将数据持久保存到磁盘日志文件中,因此来自其他进程的磁盘活动可能会导致增加写入时间,结果导致 ETCD 请求超时和临时 leader 丢失。当给定高磁盘优先级时,ETCD 服务可以稳定地与这些进程一起运行:
ionice -c2 -n0 -p $(pgrep etcd)

提高存储配额

默认 ETCD 空间配额大小为 2G,超过 2G 将不再写入数据。通过给 ETCD 配置 --quota-backend-bytes 参数增大空间配额,最大支持 8G。
vi /etc/kubernetes/manifests/etcd.yaml  增加参数

分离 events 存储

集群规模大的情况下,集群中包含大量节点和服务,会产生大量的 event,这些 event 将会对 etcd 造成巨大压力并占用大量 etcd 存储空间,为了在大规模集群下提高性能,可以将 events 存储在单独的 ETCD 集群中。
配置 kube-apiserver:
--etcd-servers="http://etcd1:2379,http://etcd2:2379,http://etcd3:2379" --etcd-servers-overrides="/events#http://etcd4:2379,http://etcd5:2379,http://etcd6:2379"
 

三、 全链路监控Skywalking介绍

3.1 APM 与传统监控

APM (Application Performance Management) 应用新能管理,通过各种探针采集并上报数据,收集关键指标,同时搭配数据展示以实现对应用程序性能管理和故障管理的系统化解决方案。
目前ARM 工具主要有:Cay、Zipkin、Pinpoint、SkyWalking。SkyWalking是一款优秀的APM工具,包括:分布式追踪、性能指标分享下、应用和服务依赖分析等。
Zabbix、Permetheus、open-falcon等监控系统主要关注服务器硬件指标与系统服务运行状态等,而APM系统更重视程序内部执行过程指标和服务之间链路调用情况的监控,APM有利于深入代码找到请求响应“慢”的根本问题,与Zabbix/Permetheus之类的监控是互补关系。
APM可以解决什么问题?
对应一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到以下问题:
  • 如何串联整个调用链路,快速定位问题?如:应用与第三方服务之间的数据流向,应用与应用之间的调用。
  • 如何缕清各个微服务之间的依赖关系?如:应用A调用应用B,应用B又会调用应用C
  • 如何进行各个微服务接口的性能分析?
  • 如何跟踪整个业务流程的调用处理顺序?

使用APM工具,比如Skywalking 可以快速自动显示业务调用关系

3.2 Skywalking介绍

Skywalking 是一个国产开源框架。Skywalking是分布式系统的应用程序性能监控工具,专为微服务、云原生架构和基于容器(Docker、k8s)架构设计,

官网:https://skywalking.apache.org/
Github: https://github.com/apache/skywalking
官方文档:https://skywalking.apache.org/docs/
1)Skywalking 监控维度
在许多不同的场景下, SkyWalking 为观察和监控分布式系统提供了解决方案。首先是像传统的方式那样, SkyWalking 为服务提供了自动打点的代理, 如 Java, C# , Node.js , Go , PHP 以及 Nginx LUA(包括 Python 和 C++ 调用的 SDK 捐献)。
对于多数语言,持续部署环境,云原生基础设施正变得更加强大,但也更加复杂。
Skywalking 的服务网格接收器可以让 Skywalking 接收来自服务网格框架(例如 Istio)的遥测数据,以帮助用户理解整个分布式系统。
总之, SkyWalking 为服务(service)、服务实例(service instance)以及 端点(endpoint) 提供了可观测能力。服务(Service)、实例(Instance) 以及 端点(Endpoint) 等概念在如今随处可见, 所以让我们先了解一下他们在 SkyWalking 中都表示什么意思:
  • 服务(Service):表示对请求提供相同行为的一组工作负载,在使用打点代理或 SDK 的时候,你可以定义服务的名字. SkyWalking 还可以使用在 Istio 等平台中定义的名称。
  • 服务实例(Service Instance):上述的一组工作负载中的每一个工作负载称为一个实例,就像 Kubernetes 中的 pods 一样,服务实例未必就是操作系统上的一个进程. 但当你在使用打点代理的时候, 一个服务实例实际就是操作系统上的一个真实进程.
  • 端点(Endpoint):对于特定服务所接收的请求路径, 如 HTTP 的 URI 路径和 gRPC 服务的类名 + 方法签名。

使用SkWalking时,用户可以看到服务与端点之间的拓扑结果,每个服务/服务实例/端点的性能指标,可以设置报警规则。

2)Skywalking架构
Skywalking 逻辑上分为四部分:
  • 探针:基于不同的来源可能不一样,但左右都是搜集数据,将数据格式转化为Skywalking适用的格式。
  • 平台后端:支持数据聚合,数据分析以及驱动数据流从探针到用户节点的流程。分析包括skywalking原生追踪和性能指标以及第三方来源。
  • 存储:通过开放的插件化接口存放skywalking数据。可以选择存储系统如ElasticSearch或Mysql集群。
  • 用户界面(UI):一个基于接口高度定制化 的web系统,用户可以可视化查看和管理skywalking数据

3)探针

探针主要基础到目标系统中的代理或SDK库,它负责手机遥测数据,包括链路追踪和性能目标。根据目标系统的技术栈,探针可能有差异巨大的方式达到以上功能。但从根本上是一致的,即收集并格式化数据,发送到后端。

skywalking 探针可分为三组:

  1. 基于语言的原生代理,这种类型的代理运行在目标服务的用户空间中,就行用户代码的一部分。如skywalking java代理,使用-javaagent命令参数在运行期间对代码进行操作。另一种是使用目标库提供的钩子函数或拦截机制。这些探针是基于特定的语言和库。
  2. 服务网络探针,服务网络探针从服务网格的sidecar和控制面板搜集数据,在以前代理只作用整个集群的入口,但是有了服务网格和sidecar之后,可基于此进行观测。
  3. 第三方打点类库,skywalking能接收其他流行的打点库产生的数据格式。skywalking通过分析数据,将数据格式化成自身的链路和度量数据格式。

四、 Skywalking部署

使用helm部署Skywalking,存储使用ElasticSearch

4.1 版本信息

Kubernetes  1.27.6
Skywalking 9.5.0
Elasticsearch 8.10.4

4.2 安装ElasticSearch

4.2.1查看bitnami仓库是否加载

# helm   repo list|grep bitnami
bitnami             	https://charts.bitnami.com/bitnami   
如果没有,需要新增bitnami仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

4.2.2 下载ElasticSearch的chart包

# helm  search repo elasticsearch|grep bitnami
bitnami/elasticsearch                             	19.13.5      	8.10.4     	Elasticsearch is a distributed search and analy...
bitnami/dataplatform-bp2                          	12.0.5       	1.0.1      	DEPRECATED This Helm chart can be used for the ...
bitnami/kibana                                    	10.5.10      	8.10.4     	Kibana is an open source, browser based analyti...
# helm pull bitnami/elasticsearch  --untar --version 19.13.5

 4.2.3 安装ElasticSearch

vim values.yaml
cd  elasticsearch
vi values.yaml  
定义  storageClass: "nfs-client" 
搜索  memory: 2048Mi  改为  memory: 1024Mi
搜索  heapSize: 1024m 改为  heapSize: 512m
搜索 replicaCount: 2 改为  replicaCount: 1  ##如果是生产环境不要改
 安装ElasticSearch
# helm  install skywalking-es .
NAME: skywalking-es
LAST DEPLOYED: Sun Nov  5 19:55:37 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: elasticsearch
CHART VERSION: 19.13.5
APP VERSION: 8.10.4

-------------------------------------------------------------------------------
 WARNING

    Elasticsearch requires some changes in the kernel of the host machine to
    work as expected. If those values are not set in the underlying operating
    system, the ES containers fail to boot with ERROR messages.

    More information about these requirements can be found in the links below:

      https://www.elastic.co/guide/en/elasticsearch/reference/current/file-descriptors.html
      https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html

    This chart uses a privileged initContainer to change those settings in the Kernel
    by running: sysctl -w vm.max_map_count=262144 && sysctl -w fs.file-max=65536

** Please be patient while the chart is being deployed **

  Elasticsearch can be accessed within the cluster on port 9200 at skywalking-es-elasticsearch.default.svc.cluster.local

  To access from outside the cluster execute the following commands:

    kubectl port-forward --namespace default svc/skywalking-es-elasticsearch 9200:9200 &
    curl http://127.0.0.1:9200/
查看pod
# kubectl  get po |grep es-
查看svc
kubectl  get svc|grep es-
访问es
curl http://10.109.107.49:9200
 

4.3 安装Skywalking

4.3.1 添加repo仓库

# helm repo add skywalking https://apache.jfrog.io/artifactory/skywalking-helm
"skywalking" has been added to your repositories
[root@master-1-230 elasticsearch]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "myharbor" chart repository
...Successfully got an update from the "aliyun" chart repository
...Successfully got an update from the "skywalking" chart repository
...Successfully got an update from the "bitnami" chart repository
...Successfully got an update from the "prometheus-community" chart repository
Update Complete. ⎈Happy Helming!⎈

4.3.2 下载chart

# helm search repo skywalking
NAME                 	CHART VERSION	APP VERSION	DESCRIPTION                 
skywalking/skywalking	4.3.0        	           	Apache SkyWalking APM System
helm pull skywalking/skywalking --version 4.3.0

4.3.3 修改value.yaml

tar zxvf skywalking-4.3.0.tgz
cd skywalking
vi values.yaml  #有几个地方需要改

elasticsearch:
  config:
    host: skywalking-es-elasticsearch.default  ##查看svc可以查到,后面加default,表示default命名空间
    port:
      http: 9200
  enabled: false  ##把true改为false,意思是不自动安装es,因为我们前面已经手动安装过了

oap:
  image:
    tag: 9.5.0
  javaOpts: -Xmx512m -Xms512m  ##内存减少,如果是生产环境,可以适当调大
  replicas: 1  ##把2改为1,降低资源使用,生产环境不要改为1
  storageType: elasticsearch  ##使用es作为存储

ui:
  image:
    tag: 9.5.0

4.3.4 安装

# helm install skywalking .
NAME: skywalking
LAST DEPLOYED: Sun Nov  5 20:12:52 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
************************************************************************
*                                                                      *
*                 SkyWalking Helm Chart by SkyWalking Team             *
*                                                                      *
************************************************************************

Thank you for installing skywalking.

Your release is named skywalking.

Learn more, please visit https://skywalking.apache.org/

Get the UI URL by running these commands:
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl port-forward svc/skywalking-ui 8080:80 --namespace default

4.3.5 端口映射,将ingress80 端口转发到8083

nohup  kubectl port-forward svc/skywalking-ui   --address 192.168.1.230   8083:80 --namespace default &
# netstat  -lnp|grep 8083
tcp        0      0 192.168.1.230:8083      0.0.0.0:*               LISTEN      59557/kubectl       
oap 的11800也映射出来,方便外部agent连接
nohup  kubectl port-forward svc/skywalking-oap --address 192.168.1.230 11800:11800 &

4.3.6 访问ui

http://192.168.1.230:8083/

 4.3.7 查看es数据

kubectl  get svc|grep es
curl http://10.109.107.49:9200/_cat/indices?v

五、Skywalking配置和使用

5.1配置一个java应用

5.1.1 在 master-1-230 节点安装docker

安装docker

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
[root@master-1-230 13.3]# systemctl  restart docker
[root@master-1-230 13.3]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@master-1-230 13.3]# docker version
Client: Docker Engine - Community
 Version:           24.0.7
 API version:       1.43
 Go version:        go1.20.10
 Git commit:        afdd53b
 Built:             Thu Oct 26 09:11:35 2023
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          24.0.7
  API version:      1.43 (minimum version 1.12)
  Go version:       go1.20.10
  Git commit:       311b9ff
  Built:            Thu Oct 26 09:10:36 2023
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.24
  GitCommit:        61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
 runc:
  Version:          1.1.9
  GitCommit:        v1.1.9-0-gccaecfc
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

5.1.2 安装git

yum install -y git

5.1.3 克隆zrlog源码

git clone https://gitee.com/94fzb/zrlog-docker.git
正克隆到 'zrlog-docker'...
remote: Enumerating objects: 82, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 82 (delta 0), reused 0 (delta 0), pack-reused 79
Unpacking objects: 100% (82/82), done.

5.1.4 编译

cd zrlog-docker
##下载Skywalking的java agent
which wget &> /dev/null || yum install -y wget 
wget  https://archive.apache.org/dist/skywalking/java-agent/8.15.0/apache-skywalking-java-agent-8.15.0.tgz
tar  zxvf apache-skywalking-java-agent-8.15.0.tgz
##将刚刚解压的包,用zip压缩
which zip &>/dev/null || yum install -y zip
zip -r java-agent.zip skywalking-agent

##编辑zrlog包里的启动脚本run.sh,目的是为了增加skywalking的java agent
which unzip &>/dev/null || yum install -y unzip
wget http://dl.zrlog.com/release/zrlog.zip
mkdir zrlog
unzip zrlog.zip -d zrlog/
vi zrlog/bin/run.sh ##内容改为如下
java -javaagent:/opt/tomcat/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=app1 -Dskywalking.collector.backend_service=192.168.1.230:11800 -Xmx128m -Dfile.encoding=UTF-8 -jar zrlog-starter.jar#说明:
#javaagent:指定skywalking-agent.jar文件路径
#skywalking.agent.service_name: 本应用在skywalking中的名称
#skywalking.collector.backend_service: skywalking 服务端地址,grpc上报地址,默认端口是 11800

##将zrlog重新打包
cd zrlog
zip -r zrlog.zip ./*
cd ..
/bin/mv zrlog/zrlog.zip ./

##修改Dockerfile
vi Dockerfile #改为如下
FROM openjdk:17
MAINTAINER “xiaochun” xchun90@163.com
CMD [“/bin/bash”]
ARG DUMMY
RUN mkdir -p /opt/tomcat
#RUN curl -o /opt/tomcat/ROOT.zip http://dl.zrlog.com/release/zrlog.zip?${DUMMY}
COPY zrlog.zip /opt/tomcat/ROOT.zip
RUN cd  /opt/tomcat && jar -xf ROOT.zip
ADD /java-agent.zip /opt/tomcat/java-agent.zip
RUN cd /opt/tomcat && jar -xf java-agent.zip
ADD /bin/run.sh /run.sh
RUN chmod a+x /run.sh
#RUN rm /opt/tomcat/ROOT.zip

CMD /run.sh
##到此结束


##编译成镜像
sh build.sh

5.1.5 安装zrlog应用

使用docker 启动容器

# docker run -itd -p 28080:8080 -e DOCKER_MODE='true' zrlog /run.sh
eee130a11c58faccdae4ba4bba49f249e0b41069ca56d14c92be2998dce4dcd1

 访问,首先查看zrlog对外映射端口

docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS         PORTS                     NAMES
eee130a11c58   zrlog     "/run.sh"   3 seconds ago   Up 2 seconds   0.0.0.0:28080->8080/tcp   happy_brown

 访问zrlog:http://192.168.1.230:28080/install/

5.1.6 使用helm安装mysql

# helm search repo mysql
NAME                                          	CHART VERSION	APP VERSION	DESCRIPTION                                       
aliyun/mysql                                  	0.3.5        	           	Fast, reliable, scalable, and easy to use open-...
bitnami/mysql                                 	9.14.1       	8.0.35     	MySQL is a fast, reliable, scalable, and easy t...
prometheus-community/prometheus-mysql-exporter	2.1.0        	v0.15.0    	A Helm chart for prometheus mysql exporter with...
aliyun/percona                                	0.3.0        	           	free, fully compatible, enhanced, open source d...
aliyun/percona-xtradb-cluster                 	0.0.2        	5.7.19     	free, fully compatible, enhanced, open source d...
bitnami/phpmyadmin                            	13.0.0       	5.2.1      	phpMyAdmin is a free software tool written in P...
aliyun/gcloud-sqlproxy                        	0.2.3        	           	Google Cloud SQL Proxy                            
aliyun/mariadb                                	2.1.6        	10.1.31    	Fast, reliable, scalable, and easy to use open-...
bitnami/mariadb                               	14.1.0       	11.1.2     	MariaDB is an open source, community-developed ...
bitnami/mariadb-galera                        	10.0.3       	11.1.2     	MariaDB Galera is a multi-primary database clus...
[root@master-1-230 13.3]# helm pull --untar bitnami/mysql
[root@master-1-230 13.3]# cd mysql/
[root@master-1-230 13.3]#vi values.yaml  
定义  storageClass: "nfs-client" 
[root@master-1-230 mysql]# helm install zrlog-mysql .
NAME: zrlog-mysql
LAST DEPLOYED: Sun Nov  5 20:57:03 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: mysql
CHART VERSION: 9.14.1
APP VERSION: 8.0.35

** Please be patient while the chart is being deployed **

Tip:

  Watch the deployment status using the command: kubectl get pods -w --namespace default

Services:

  echo Primary: zrlog-mysql.default.svc.cluster.local:3306

Execute the following to get the administrator credentials:

  echo Username: root
  MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default zrlog-mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d)

To connect to your database:

  1. Run a pod that you can use as a client:

      kubectl run zrlog-mysql-client --rm --tty -i --restart='Never' --image  docker.io/bitnami/mysql:8.0.35-debian-11-r0 --namespace default --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash

  2. To connect to primary service (read/write):

      mysql -h zrlog-mysql.default.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
[root@master-1-230 mysql]# kubectl  get pod  -o wide|grep mysql
zrlog-mysql-0                                0/1     Running            0               107s    10.244.154.8     node-1-233     <none>           <none>

[root@master-1-230 mysql]# kubectl  get svc |grep mysql
zrlog-mysql                                   ClusterIP      10.110.175.140   <none>        3306/TCP                                                         5m36s
zrlog-mysql-headless                          ClusterIP      None             <none>        3306/TCP                                                         5m36s
[root@master-1-230 mysql]# 

[root@master-1-230 mysql]# 
[root@master-1-230 mysql]# MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default zrlog-mysql -o jsonpath="{.data.mysql-root-password}" | base64 -d)
[root@master-1-230 mysql]# echo $MYSQL_ROOT_PASSWORD
64T2LBgJZg
[root@master-1-230 mysql]# kubectl run zrlog-mysql-client --rm --tty -i --restart='Never' --image  docker.io/bitnami/mysql:8.0.35-debian-11-r0 --namespace default --env MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD --command -- bash
If you don't see a command prompt, try pressing enter.
I have no name!@zrlog-mysql-client:/$ mysql -h zrlog-mysql.default.svc.cluster.local -uroot -p"$MYSQL_ROOT_PASSWORD"
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 8.0.35 Source distribution

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database zrlog;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_database        |
| mysql              |
| performance_schema |
| sys                |
| zrlog              |
+--------------------+
6 rows in set (0.03 sec)

mysql>

 

 

 

 

 

 

 

 

5.1.7 访问skywalking ui

http://192.168.1.230:8083/general