Skip to main content

One post tagged with "kubegems"

View All Tags

· One min read
LinkMaq

Nacos 介绍

Nacos 是阿里云开源一款在微服务场景下用于处理应用配置发布管理和服务注册管理的服务平台。其主要提供了如下几个特性:

  • 服务发现和服务健康监测

基于 DNS 和 RPC 的服务发现。服务提供者使用 原生SDKOpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODOHTTP&API查找和发现服务。

  • 动态配置服务

动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

  • 动态 DNS 服务

动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。

  • 服务及其元数据管理

Nacos 从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

KubeGems 中的 Nacos

KubeGems 自v1.21版本之后开启了对 Nacos 配置中心的支持,并利用了内置 Plugins CRD 实现了对 Nacos 的快速启动。

KubeGems 中的 Nacos 安装源来至官方社区提供https://github.com/nacos-group/nacos-k8s,并在 plugin crd 中来管理部署的版本。用过 Nacos 的同学可能知道,其内部的数据模型主要围绕dataidgroupnamespace这 3 个进行操作。由于 KubeGems 的设计是一个支持多租户的平台,所以在应用 nacos 数据模型时,按照了 tenant + project来区分内部的命名空间。

启用和配置插件

KubeGems 启用 Nacos 需要具备系统管理员的权限进行操作。管理员进入管理后台的“插件管理”,点击“启用“按钮“即可开启Nacos。

直到出现如下状态,代表插件运行正常

此时,我们就可以在租户的环境中开始使用 Nacos 服务

个性化配置

Nacos插件的配置以 CRD 的形式存放在 nacos命名空间中,我们可以通过命令kubectl edit plugin nacos -n nacos对插件进行个性化配置。

apiVersion: plugins.kubegems.io/v1beta1
kind: Plugin
metadata:
finalizers:
- plugins.kubegems.io/finalizer
generation: 1
name: nacos
namespace: nacos
spec:
kind: helm
path: helm
url: https://github.com/nacos-group/nacos-k8s.git
values:
namespace: nacos
global:
mode: cluster
nacos:
replicaCount: 1
image:
repository: registry.cn-beijing.aliyuncs.com/kubegems/nacos-server
tag: v2.1.1
plugin:
image:
repository: registry.cn-beijing.aliyuncs.com/kubegems/nacos-peer-finder-plugin
persistence:
data:
storageClassName: local-path
enabled: true
service:
type: ClusterIP
version: master

提示:KubeGems的插件 CRD 由 https://github.com/kubegems/bundle-controller提供支持,我们也可以直接使用 bundle-controller 在非 kubegems 集群中管理插件。

集群部署

Nacos集群由社区提供支持部署,kubegems 默认将 nacos 的全局运行模式设置为“cluster”,如果您需要扩展成多集群,只需修改replicaCount的副本数为 3 即可。

开放集群外访问

Nacos 插件默认运行在 Kubernetes 内部,如果需要在集群外访问 Nacos 需借助网关实现。管理员可以在后台创建一条基于默认网关的 ingress 来代理 nacos api。过程如下:

第一步: 进入路由功能页面,选择 nacos 命名空间

第二步:创建并提交一条路由规则,用于 nacos 的代理

第三步:获取访问地址

提示:Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成

使用配置中心

进入应用环境下的“应用配置”,可以点击右上角的“获取访问信息”查看当前环境下的 nacos sdk 所需的配置信息

配置管理

点击“创建配置项”就可以创建配置

配置历史与回滚

监听列表

运行测试

我们用 nacos-sdk-go/v1来做一个简单的认证

package main

import (
"fmt"
"time"

"github.com/nacos-group/nacos-sdk-go/clients"
"github.com/nacos-group/nacos-sdk-go/common/constant"
"github.com/nacos-group/nacos-sdk-go/vo"
)

func main() {
sc := []constant.ServerConfig{
{
IpAddr: "nacos.kubegems.io",
Port: 31956,
},
}

cc := constant.ClientConfig{
NamespaceId: "69f7325702bc396a8773f9a0a94eea310b21ec39", //namespace id
TimeoutMs: 5000,
NotLoadCacheAtStart: true,
LogDir: "/tmp/nacos/log",
CacheDir: "/tmp/nacos/cache",
LogLevel: "debug",
}
client, err := clients.NewConfigClient(
vo.NacosClientParam{
ClientConfig: &cc,
ServerConfigs: sc,
},
)

if err != nil {
panic(err)
}

content, err := client.GetConfig(vo.ConfigParam{
DataId: "test",
Group: "e3",
})
fmt.Println("GetConfig,config :" + content)

err = client.ListenConfig(vo.ConfigParam{
DataId: "test",
Group: "e3",
OnChange: func(namespace, group, dataId, data string) {
fmt.Println("config changed group:" + group + ", dataId:" + dataId + ", content:" + data)
},
})
time.Sleep(300 * time.Second)
}

以下是运行情况

总结

本文主要介绍了在 KubeGems 中启用并使用Nacos插件作为应用的配置中心的基本管理功能。Nacos 是一个非常棒的应用配置管理平台,KubeGems 团队将持续关注此项目,并为用户在 Kubernetes 集群提供更友好的支持。

· One min read
LinkMaq

Kind是Kubernetes In Docker的缩写,通过使用 Docker ,它能快速的拉起一套 Kubernetes 服务。因此它在Kubernetes功能测试和二开等领域被广泛使用。

KubeGems是一款以围绕 Kubernetes 通过自研和集成云原生项目而构建的通用性开源 PaaS 云管理平台。经过我们内部近一年的持续迭代,当前 KubeGems 的核心功能已经初步具备多云多租户场景下的统一管理。并通过插件化的方式,在用户界面中灵活控制包括 监控系统日志系统微服务治理 等众多插件的启用和关闭。

本文将指导用户使用 Kind 快速部署一个 KubeGems v1.21的版本用于本地测试。

安装 Kind

在 Linux 上

curl -Lo ./kind https://github.com/kubegems/kind/releases/download/v0.15.0-alpha-kubegems/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

在 MacOS 上

# for Intel Macs
[ $(uname -m) = x86_64 ]&& curl -Lo ./kind https://github.com/kubegems/kind/releases/download/v0.15.0-alpha-kubegems/kind-darwin-amd64
# for M1 / ARM Macs
[ $(uname -m) = arm64 ] && curl -Lo ./kind https://github.com/kubegems/kind/releases/download/v0.15.0-alpha-kubegems/kind-darwin-arm64
chmod +x ./kind
mv ./kind /some-dir-in-your-PATH/kind

在 Windows 上

curl.exe -Lo kind-windows-amd64.exe ./kind https://github.com/kubegems/kind/releases/download/v0.15.0-alpha-kubegems/kind-windows-amd64
Move-Item .\kind-windows-amd64.exe c:\some-dir-in-your-PATH\kind.exe

创建服务

Single Cluster

和创建 Kubernetes 集群一样,使用命令kind create cluster就能快速拉起一个 Kubernetes 服务并部署 KubeGems image-20220805141017484.png

由于不需要定制kindest/node镜像,所以 KubeGems安装全程需要连接公网下载所需的镜像。在启动完成之前会有许多 Pod 的状态为 CrashLoopBackOff,这是由于其依赖的服务(mysql、redis、gitea、argocd 等)还在启动中,这是正常的,请耐心等待。

kubegems 所有服务部署并启动完成后会有如下 pod

image-20220805141327441.png

当容器状态全部Running后,使用 port-forward 将 KubeGems Dashboard 服务映射到本地

kubectl port-forward svc/kubegems-dashboard :80 -n kubegems                           

Forwarding from 127.0.0.1:52302 -> 8000
Forwarding from [::1]:52302 -> 8000

此时,我们打开浏览器访问 http://localhost:52302即可访问 KubeGems,默认用户admin 默认密码demo!@#admin

使用 Kind 生成的 KubeConfig文件导入集群是,注意修改集群 Server 地址为内部地址http://kubernetes.default:443

image-20220805144837887.png

Mutil Cluster

如果您需要使用 Kind 部署一个 Kubernetes 集群,那么可以按照如下配置

cat ./kind.yaml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

并通过命令 kind create cluster --config kind.yaml

image-20220805143833694.png

打开 KubeGems 后台并导入集群后,我们便可以在机器列表中查看集群内主机数量

image-20220805145229274.png

指定 Kubernetes版本创建 KubeGems

如果您要在指定的 Kubernetes 版本中创建 KubeGems,只需要kind 在创建过程中指定kindest/node镜像版本即可

kind create cluster  --image kindest/node:v1.23.6

启用插件

默认情况下 KubeGems 只做了最小化安装,如果您要启用更多功能,可在管理员后台的组件管理中启用相关插件

image-20220805145350662.png


· One min read
liutao

Apache Skywalking 专门为微服务架构和云原生架构系统而设计并且支持分布式链路追踪的APM系统。Apache Skywalking 通过加载探针的方式收集应用调用链路信息,并对采集的调用链路信息进行分析,生成应用间关系和服务间关系以及服务指标。Apache Skywalking 目前支持多种语言,其中包括 Java.Net CoreNode.jsGo 语言。本文将从以 KubeGems 应用商店出发,来快速搭建一套Skywalking,希望能够帮助到大家。

安装SkyWalking OAP

KubeGems应用商店(HelmChart)是一个描述Kubernetes相关资源的文件集合,单个应用可以用来部署某些复杂的HTTP服务器以及Web全栈应用、数据库、缓存等

  1. Elasticsearch安装

在KubeGems应用商店中找到Elasticsearch

选择部署7.13.2版本,填写必要的【项目】、【环境】等信息

img

为方便演示,Master、ES副本数都配置为1,可根据实际需要配置参数,还可以修改 Values 中的配置

SkyWalking 初始化 ElasticSearch index 的是默认规则是 1 副本 1 分片,实际在使用中ElasticSearch 的实例数最好大于 2 个

img

点击部署,ES服务搭建完成。

img

  1. SkyWalking安装

同样在应用商店找到skywalking应用,填写基本信息,进入详细配置页,将数据设置为ES应用名称与端口

img

点击部署,可以看到skywalking-oap、skywalking-ui服务已经部署完成

img

在KubeGems控制台,找到容器服务-->运行时-->路由,创建路由,将skywalking-ui服务地址进行域名映射。我这里直接采用随机域名,用户可以根据自己公司内的域名手动配置。

img

在浏览器中打开路由访问地址,已经能正常看skywalking-ui的页面了

img

img

skywalking服务搭建完成啦,是不是非常的快速方便,哈哈哈哈哈😄

SkyWalking Agent

所谓Agent是指SkyWalking从各个平台(Java Python等)收集监控数据的代理,此处我们以为Java应用为例,收集Java应用产生的各种监控数据

SkyWalking的数据采集主要是通过业务探针(Agent)来实现的,针对不同的编程语言SkyWalking提供了对应的Agent实现。Java微服务接入SkyWalking可以使用“SkyWalking Java Agent”来上报监控数据。

这就需要Java微服务在部署启动的过程中需要获取 SkyWalking Java Agent 探针包,并在启动参数中通过--javaagent:xxx进行参数指定。而具体的集成方式大致有以下四种:

  • 使用官方提供的基础镜像;

  • 将agent包构建到已存在的基础镜像中;

  • 将agent包放到共享volume中;

  • 通过sidecar 模式挂载agent;

其中前两种方式主要是通过在构建Docker镜像的过程中将Agent依赖打包集成到Java服务的Docker镜像中,而sidecar模式则是利用k8s的相关特性来实现在容器启动时挂载Agent相关依赖。

为什么选择sidecar

Sidecard主要原理是通过Kubernetes的初始化容器initContainers来实现的,initContainers是一种专用容器,它应用容器启动之前运行,可以用于完成应用启动前的必要初始化工作。如果微服务是直接部署在 Kubernetes 集群,那么采用 sidecar 模式来使用 SkyWalking Agent会更加方便,因为这种方式不需要修改原来的基础镜像,也不需要重新构建新的服务镜像,而是会以sidecar模式,通过共享的volume将agent所需的相关文件直接挂载到已经存在的服务镜像中。

初始化容器InitContainers

InitContainers 就是用来做初始化工作的容器,可以是一个或者多个,如果有多个的话,这些容器会按定义的顺序依次执行,只有所有的initContainers执行完后,主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据卷和网络命名空间的,所以initContainers里面产生的数据可以被主容器使用到的

自定义SkyWalking Agent镜像

  • 下载SkyWalking官方发行包,并解压到指定目录
#下载skywalking-8.6.0 for es7版本的发布包,与部署的skywalking后端版本一致
$ wget https://archive.apache.org/dist/skywalking/8.6.0/apache-skywalking-apm-8.6.0.tar.gz

#将下载的发布包解压到当前目录
$ tar -zxvf apache-skywalking-apm-es7-8.6.0.tar.gz
  • 修改配置,编辑config/agent.config文件,以下只列出部分配置项
# The agent namespace
# agent.namespace=${SW_AGENT_NAMESPACE:default-namespace}
# 表示提供相同功能/逻辑的逻辑组的服务名称
agent.service_name=${SW_AGENT_NAME:Your_ApplicationName}

# OAP服务地址,修改默认地址为skywalking-oap服务名
collector.backend_service=${SW_AGENT_COLLECTOR_BACKEND_SERVICES:skywalking-oap:11800}
# 日志文件名
logging.file_name=${SW_LOGGING_FILE_NAME:skywalking-api.log}
# 日志级别:TRACE、DEBUG、INFO、WARN、ERROR、OFF。
logging.level=${SW_LOGGING_LEVEL:INFO}
# 最大历史日志文件。发生翻转时,如果日志文件超过此数量,则最旧的文件将被删除。默认情况下,负数或零表示关闭。
logging.max_history_files=${SW_LOGGING_MAX_HISTORY_FILES:10}
# 挂载插件的特定文件夹。安装文件夹中的插件可以工作。
plugin.mount=${SW_MOUNT_FOLDERS:plugins,activations,bootstrap-plugins}
# 排除插件目录中定义的一些插件
# plugin.exclude_plugins=${SW_EXCLUDE_PLUGINS:}
  • 构建skywalking-agent sidecar 镜像并push至hub私有镜像仓库

在前面步骤中解压的skywalking发行包,进入agent目录编写Dockerfile文件

FROM busybox:latest
RUN set -eux && mkdir -p /usr/skywalking/agent/
COPY . /usr/skywalking/agent/
WORKDIR /
  • 完成Docker文件编写后,执行镜像构建命令:
# 构建镜像,注意最后一个.
docker build -t <your-registry>/skywalking-agent-sidecar:8.6.0 .
# 镜像推送至私有Harbor仓库
docker push <your-registry>/skywalking-agent-sidecar:8.6.0

sidecar挂载

在KubeGems中找到 【工作负载】,编辑更新工作负载进入到容器镜像页面

设置SW环境变量,编辑工作容器

  • SW_AGENT_NAME=\<YourApplicationName>
  • JAVA_TOOL_OPTIONS=-javaagent:/usr/skywalking/agent/skywalking-agent.jar

添加容器镜像,选择初始化容器将skywalking-agent-sidecard镜像进行挂载,并添加启动命令

sh -c /usr/skywalking/agent/* /skywalking/agent

img

挂载emptyDir卷

img

点击确定保存工作负载信息,自动重启后进入应用容器,可以看到agent目标已经加载到容器中了

root@pod-7bc77468ff-7b4xt:/# cd /usr/skywalking/agent/
root@pod-7bc77468ff-7b4xt:/usr/skywalking/agent# ll

total 17716
drwxrwxrwx 9 root root 194 May 19 08:14 ./
drwxr-xr-x 3 root root 27 May 19 08:14 ../
-rw-r--r-- 1 root root 114 May 19 08:14 Dockerfile
drwxr-xr-x 2 root root 4096 May 19 08:14 activations/
drwxr-xr-x 2 root root 85 May 19 08:14 bootstrap-plugins/
drwxr-xr-x 2 root root 64 May 19 08:14 config/
drwxr-xr-x 2 root root 32 May 19 08:14 logs/
drwxr-xr-x 2 root root 4096 May 19 08:14 optional-plugins/
drwxr-xr-x 2 root root 45 May 19 08:14 optional-reporter-plugins/
drwxr-xr-x 2 root root 4096 May 19 08:14 plugins/
-rw-r--r-- 1 root root 18121582 May 19 08:14 skywalking-agent.jar

此时打开skywalking-ui,已经可以看到监控数据了

img

SkyWalking动态配置

SkyWalking配置主要是通过application.yml操作系统环境变量设置的,其中一些还支持来自上游管理系统的动态设置。上游服务支持包括Zookeeper、Etcd、Consul、Apollo、Nacos、K8s-configmap等。

目前SkyWalking支持以下动态配置

配置说明
agent-analyzer.default.slowDBAccessThresholdreceiver-trace/default/slowDBAccessThreshold慢数据库语句的阈值,覆盖application.yml.
agent-analyzer.default.uninstrumentedGateways未检测的网关覆盖gateways.yml.
alarm.default.alarm-settings警报设置将覆盖alarm-settings.yml
core.default.apdexThresholdapdex 阈值设置,将覆盖service-apdex-threshold.yml.
core.default.endpoint-name-grouping端点名称分组设置,将覆盖endpoint-name-grouping.yml.
agent-analyzer.default.sampleRate跟踪采样,覆盖receiver-trace/default/sampleRate.application.yml
agent-analyzer.default.slowTraceSegmentThreshold设置这个关于延迟的阈值将使慢跟踪段在花费更多时间时被采样,即使采样机制被激活。默认值为-1,这意味着不会对慢速跟踪进行采样。单位,毫秒。的覆盖receiver-trace/default/slowTraceSegmentThresholdapplication.yml
configuration-discovery.default.agentConfigurationsConfigurationDiscovery 设置

k8s-configmap

很多应用在其初始化或运行期间要依赖一些配置信息。大多数时候, 存在要调整配置参数所设置的数值的需求。 ConfigMap 是 Kubernetes 用来向应用 Pod 中注入配置数据的方法。

本文介绍如何通过KubGems平台动态配置SkyWalking参数

  • KubGems工作台 --> 配置中心 --> 配置 --> 创建配置
  • 添加参数及告警规则配置

img

  • 编辑yaml,添加修改app、compoent标签值
kind: ConfigMap
apiVersion: v1
metadata:
name: skywalking-dynamic-config
namespace: default
creationTimestamp: '2022-05-16T11:14:23Z'
labels:
component: oap
data:
agent-analyzer.default.sampleRate: '7000'
agent-analyzer.default.slowDBAccessThreshold: default:250,mongodb:100
alarm.default.alarm-settings: >-
rules:
# Rule unique name, must be ended with `_rule`.
service_resp_time_rule:
metrics-name: service_resp_time
op: ">"
threshold: 2000
period: 10
count: 3
silence-period: 5
message: 最近3分钟内服务 {name} 的平均响应时间超过2秒
  • 修改skywalking-oap环境变量信息,使用k8s-configmap配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: skywalking-oap
labels:
app: skywalking
app.kubernetes.io/instance: skywalking
.........

env:

.....

- name: SW_CLUSTER_K8S_LABEL

value: app=skywalking,component=oap

- name: SW_CONFIGURATION

value: k8s-configmap

SW_CONFIGURATION= k8s-configmap,动态配置采用k8s-configmap SW_CLUSTER_K8S_LABEL= app=collector,release=skywalking,根据这个值自动选择合适的configmap

  • 重启skywalking-oap,配置生效

SkyWalking配置优化

OAP优化

skywalking写入ES的操作是使用了ES的批量写入接口,我们要做的是调整相关参数尽量降低ES索引的写入频率。 参数调整主要是针对skywalking的配置文件`application.yml,相关参数如下:

storage:
elasticsearch:
bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:4000} # Execute the bulk every 2000 requests
bulkSize: ${SW_STORAGE_ES_BULK_SIZE:40} # flush the bulk every 20mb
flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:30} # flush the bulk every 10 seconds whatever the number of requests
concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:4} # the number of concurrent requests
metadataQueryMaxSize: ${SW_STORAGE_ES_QUERY_MAX_SIZE:8000}

调整 bulkActions 默认2000次请求批量写入一次改到4000次;

  • bulkSize批量刷新从20M一次到40M一次;

  • flushInterval每10秒刷新一次堆改为每30秒刷新;

  • concurrentRequests查询的最大数量由5000改为8000。

过滤不需要监控的接口

  • 制作agent镜像时,将apm-trace-ignore-plugin-8.6.0.jar复制到\plugins下面

  • config目录下新建一个配置文件 apm-trace-ignore-plugin.config,文件内容为:

trace.ignore_path=${SW_AGENT_TRACE_IGNORE_PATH:/actuator,/actuator/**,/admin/**,/nacos/**}

设置采样率

在默认情况下,SkyWalking会采集所有追踪的数据。但是如果系统比较复杂,采集的端点比较多的时候,可能存储压力比较大,这个时候我们可以修改配置,只存储部分的调用链路信息。比如:50%。 设置采样率的时候并不会影响相关指标的计算。包括服务,服务实例,端点,拓扑图等相关指标的计算还是使用完整的数据计算的。

在k8s-configmap中,添加配置项,设置采样率为70%:

agent-analyzer.default.sampleRate: '7000'

总结

本文用于指导用于在 KubeGems 中快速部署并运行 SkyWalking服务,用户可在研发环境中快速启用此功能来验证 APM 相关功能。更多关于KubeGems 与 SkyWalking 的配置优化,我们会持续更新,敬请关注。