Kubernetes环境与应用程序的相关追踪

首先

在这篇文章中,我们将解释如何在Kubernetes的动态应用运行环境中,通过New Relic APM来追踪应用程序的运行信息。

背景和目标

在Kubernetes环境下,可以实现根据服务需求灵活分配资源的同时,应用程序的运行环境也会流动地切换。

在相同的环境下,应用程序错误跟踪不仅需要追踪错误内容,还需要准确了解该应用程序在何处运行。通过了解应用程序的运行环境,包括哪个主机、哪个Pod、哪个容器,可以快速进行调试和故障排除。

在New Relic中,默认具有检测正在运行的应用程序所在的服务器或容器的功能,但它只提供实时运行信息。出现错误的应用程序在10分钟前或30分钟前的故障时,并不一定在相同的环境中。

然而,通过结合Kubernetes的Downward API和New Relic Agent API,可以将Kubernetes的编排层信息(Pod、Host IP、Namespace等)作为自定义参数添加到New Relic APM Agent收集的应用程序指标中。

通过这个方法,你可以记录和了解每个Pod和每个主机上的应用程序发生的错误以及错误的具体内容。

我想解释一下与先前设定相同的元素技术,并解释在流动的Kubernetes环境中如何使用New Relic APM进行应用程序错误跟踪。

另外,我们将使用由New Relic公司的Cray Smith先生创建的Node.js应用程序作为示例应用程序。

下行API的定义

通过Kubernetes的Downward API,容器可以获取有关其所运行的集群或Pod的信息。通过Downward API,可以通过环境变量将Pod的信息等传递给容器。

在应用程序清单文件的env部分中,可以将想要注册为环境变量的编排层信息添加到其中作为设置方法。这次将添加Kubernetes节点名称、主机IP、Pod名称、Pod命名空间、Pod IP以及Pod服务的各个信息,以便容器中的应用程序能够识别它们。

        env:
        - name: K8S_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName
        - name: K8S_HOST_IP
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        - name: K8S_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: K8S_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: K8S_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: K8S_POD_SERVICE_ACCOUNT
          valueFrom:
            fieldRef:
              fieldPath: spec.serviceAccountName

新的Relic Agent API 设置

接下来,我们将通过使用New Relic代理API来设置自定义参数。由于样例应用程序是使用Node.js编写的,因此本次将提供使用New Relic Node.js代理API的示例。

通过将下面的代码添加到应用程序文件中,您可以在监视的应用程序内的所有事务跟踪结果中添加作为自定义参数的Downward API指定的值。newrelic.addCustomParameters()将被用于注释所有express.js Web转换(和错误)的Kubernetes元数据。

var CUSTOM_PARAMETERS = {
    'K8S_NODE_NAME': process.env.K8S_NODE_NAME,
    'K8S_HOST_IP': process.env.K8S_HOST_IP,
    'K8S_POD_NAME': process.env.K8S_POD_NAME,
    'K8S_POD_NAMESPACE': process.env.K8S_POD_NAMESPACE,
    'K8S_POD_IP': process.env.K8S_POD_IP,
    'K8S_POD_SERVICE_ACCOUNT': process.env.K8S_POD_SERVICE_ACCOUNT,
    'K8S_POD_TIER': process.env.K8S_POD_TIER
};

app.use(function(req, res, next) {
  newrelic.addCustomParameters(CUSTOM_PARAMETERS);
  next();
});

通过APM错误分析对错误进行追踪。

将经过上述配置的应用程序部署在Kubernetes上。
在APM错误分析界面中查看错误内容时,现在会显示Pod信息和主机信息作为属性。

スクリーンショット 2017-12-19 12.49.59.png

另外,在APM错误概况文件中,会利用各种属性,通过机器学习自动地对错误的特定分布进行概况记录。这可以显示出在Kubernetes上特定的Pod或主机上发生了多少错误。

スクリーンショット 2017-12-20 10.51.42.png

使用INSIGHTS NRQL进行图形绘制

接下来,我们将使用New Relic的仪表板服务INSIGHTS来进行图形绘制。
通过INSIGHTS,我们可以利用通过APM Agent发送的带有自定义参数的指标,并使用名为NRQL的命令绘制图形。

如果您想要根据不同的Pod名称来检查应用事务的性能,您只需在Insights上执行以下自定义NRQL(New Relic Query Language)查询即可绘制图表。

SELECT percentile(duration, 95) from Transaction where appName='newrelic-k8s-node-redis' and name='WebTransaction/Expressjs/GET//'FACET K8S_POD_NAME TIMESERIES auto
スクリーンショット 2017-12-20 12.16.37.png

1. 另外1. 监控基础设施亦需对Kubernetes进行监测。

尽管与本投稿的主题无关,但是New Relic有一个名为INFRASTRUCTURE的资源监视服务。它可以监视Kubernetes的Master和Worker主机,当然也可以监视容器级别的监视。通过使用Daemonset,可以自动在每个主机上进行安装。步骤如下所示:

①. 安装 Kubernetes 的 Git插件


$ git clone https://github.com/kubernetes/kubernetes.git

②. 创建New Relic基础设施配置

$ cd kubernetes/examples/newrelic-infrastructure/
$ vi nrconfig.env
  #--REQUIRED--
  # Put your license key in this variable
  export NRIA_LICENSE_KEY=“自身のNew Relic ライセンスキー”

创建Kubernetes配置文件。

$cp newrelic-config-template.yaml newrelic-config.yaml
$kubectl create -f newrelic-config.yaml

创建 Daemonset

$ kubectl create -f newrelic-infra-daemonset.yaml

在INFRASTRUCTURE页面上进行确认。

确保在New Relic INFRASTRUCTURE页面上看到主机显示。

スクリーンショット 2017-12-20 11.27.04.png

然后,在”进程”选项卡中,可以查看主机上每个容器的资源状况。通过使用”按组”功能并指定containerName,可以绘制每个容器的图表。

image.png

选项一:额外篇2:使用 INSIGHTS 创建 Kubernetes 集成仪表板。

尽管不符合本文的主要说明,但通过New Relic INSIGHTS的仪表盘功能,我想将我们迄今已可视化的Kubernetes监控信息整合成一幅图像展示出来。

在中国本土以中文习母语的情况下,提供以下改写的一个选项:
INSIGHTS会以一种统一的方式显示Kubernetes环境中宿主机和容器的资源使用情况,运行于该环境中的应用程序的指标,以及Pod的错误数量等Kubernetes不同层级上的信息。

从基础设施中获取Kubernetes环境中主机和容器的资源使用情况,从APM中获取在同一Kubernetes环境下运行的应用程序的各种指标,还通过使用INSIGHTS的NRQL将以pod名称为单位显示的错误指标图形化,并将其放在仪表板上。

image.png

结束时

我們描述了從New Relic的Kubernetes應用程序錯誤跟踪中衍生出的容器和主機資源監控,以及將它們集中可視化的儀表板。在Kubernetes環境中,需要與傳統環境不同的監控方法,希望能對使用New Relic在該環境中進行監控提供一些幫助。

广告
将在 10 秒后关闭
bannerAds