让我们使用Splunk来监控Kubernetes的日志和指标吧

我尝试使用Splunk将在Kubernetes上运行的容器环境可视化。
首先,我将介绍数据获取的方法并写一篇文章。

我想要将其系列化,并写一篇关于可视化和监控的文章。

— 2018/07/09 追記 —
我已经撰写了一篇关于可视化和监控的文章,使用Splunk来可视化和监控Kubernetes集群环境的日志和指标。

首先

Splunk索引的数据大致可以分为以下四种类型。

    1. CPU和内存等资源使用情况的度量

 

    1. 节点、Pod、Service、Namespace等对象信息

 

    1. Kubelet、代理、API服务器的日志

 

    容器的日志

环境准备

接下来是环境准备。

Splunk环境

操作系统:亚马逊EC2上的Amazon Linux
Splunk Enterprise 7.1.1

以下是我使用的应用程序:
Splunk Add-on for Kubernetes v1.0.0
https://splunkbase.splunk.com/app/3976/
它只包含与k8s相关的资源类型和最基本的配置。
由于没有包含仪表板,所以我打算自己创建一个。

Splunk分析工作区v0.18.4测试版
https://splunkbase.splunk.com/app/3976/
即使还处于测试版,但可以通过简单的GUI操作快速创建指标图表。

あと、これも
Splunk Connect for Kubernetes
https://github.com/splunk/splunk-connect-for-kubernetes
KubeletやKube-Proxyのログ、コンテナのログ、PodやNode等のメトリクスを自動的に取得してSplunkにインデックスしてくれる代物です。
YAMLで設定作って kubectl 使ってKubernetesクラスター環境にデプロイします。

连接器使用数据获取的Pod,通过fluentd将数据通过POST方式发送到Splunk的HTTP Event Collector终端点。

Kubernetes环境

这次我们使用 Heptio 的 CloudFormation 模板在 AWS 上构建了一个验证环境。

操作系统:Ubuntu 16.04.4 LTS
Kubelet 版本:v1.10.3

我们是以Master x 1 / Node x 2的架构构建的。

斯普朗克设置

Splunkの設定自体はカンタン

    1. Appをインストールする

 

    1. インデックスを作成

 

    HECを有効にする

就只是这样而已。

SpkunkにAppをインストール

Let’s install the Splunk Add-on for Kubernetes and Splunk Analysis Workspace. 让我们安装Splunk的Kubernetes附加组件和Splunk分析工作区。

インデックス作成

ログ系のインデックスとメトリクスのインデックスを作ります。
メトリクスは従来のログ用インデックスとは別に保存する必要があるため、別々に作ります。

顺便提一下,最好按照集群的单位来创建索引。

在Splunk界面中,转到“设置”>“索引”。
创建新索引。

Screen Shot 2018-06-22 4.04.42 PM.png
Screen Shot 2018-06-22 4.05.48 PM.png

使HEC生效

Screen Shot 2018-06-22 4.09.02 PM.png

使用一个HEC代币即可获得日志和指标两者的收益。
因此,只需创建一个代币。

Screen Shot 2018-06-22 4.12.25 PM.png

请前往下一步,指定源类型和索引。

Screen Shot 2018-06-22 4.12.44 PM.png
Screen Shot 2018-06-22 4.14.49 PM.png

Splunk的设置已经完成了。

Kubernetes的配置

创建Kubernetes集群

我使用Heptio在AWS上进行了部署,根据模板使用CloudFormation进行集群创建(详细内容省略)。

本地准备

将kubectl和helm安装到本地终端(Mac)上。
这样就可以在本地而无需通过SSH登录,进行Kubernetes操作。

kubectl 安装

首先使用brew命令安装kubectl(参考:Kubernetes文档)。

brew install kubectl

接下来,从之前所创建的Heptio Kubernetes中下载kubeconfig文件,
然后创建一个适用于Kubernetes的文件夹并将其放入其中。

SSH_KEY="<path/to/varMyKey.pem>"; scp -i $SSH_KEY -o ProxyCommand="ssh -i \"${SSH_KEY}\" ubuntu@<BastionHostPublicIP> nc %h %p" ubuntu@<MasterPrivateIP>:~/kubeconfig ./kubeconfig

设置将下载的kubeconfig文件设为环境变量。

export KUBECONFIG=$(pwd)/kubeconfig

試しにNode取得
コマンド実行はkubeconfig置いてあるディレクトリで実行すべし

kubectl get nodes

安装helm

helm 是在 Kubernetes 上用于包管理的工具,类似于 yum。

使用brew来安装Helm(参考:Helm文档)

brew install kubernetes-helm

请确认Helm版本。

$ helm version
Client: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.9.1", GitCommit:"20adb27c7c5868466912eebdf6664e7390ebe710", GitTreeState:"clean"}

バージョンは後で使うのでメモしておきましょう。

Splunk Connect for Kubernetes的配置。

终于来到正题了。

安装 Tiller

为实现Kubernetes的基于RBAC的访问控制,需要创建Tiller来允许使用Helm工具。

创建用于安装Splunk Connect for Kubernetes的命名空间。

kubectl create ns splunk-connect-k8s

接下来是Tiller的YAML文件在这里。

# https://docs.helm.sh/using_helm/#example-service-account-with-cluster-admin-role

apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: splunk-connect-k8s
  #namespace: kube-system
  #namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: tiller
  #namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: splunk-connect-k8s
    #namespace: kube-system
    #namespace: default

让我们试着制作耕犁。

kubectl create -f tiller.yaml

Helm初始化

使用`helm init`进行初始设置。

$ helm init --service-account tiller --tiller-namespace splunk-connect-k8s --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
$HELM_HOME has been configured at /Users/splunk/.helm.

Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.

Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!

请用您当前的Helm版本替换2.9.1这部分。

确认是否已创建了 tiller 服务账户。

$ kubectl get sa -n splunk-connect-k8s
NAME      SECRETS   AGE
default   1         1d
tiller    1         1d

连接Kubernetes的设置和安装

在Splunk的官方GitHub上,提供了包含图表模板和变量设置示例的样本。
https://github.com/splunk/splunk-connect-for-kubernetes/tree/master/helm-chart

splunk-kubernetes-logging はコンテナやk8s関連のログ
splunk-kubernetes-metrics はNodeやPodのメトリクス
splunk-kubernetes-objects はk8s関連オブジェクトの詳細情報

こちらのYAMLを使って Splunk Connect for Kubernetes をインストールします。

#global settings
global:
  logLevel: info
  splunk:
    hec:
      protocol: https
      insecureSSL: false
      host: splunk_hec_endpoint_hostname
      token: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX

#local config for logging chart
splunk-kubernetes-logging:
  journalLogPath: /run/log/journal
  splunk:
    hec:
      indexName: k8s_events

#local config for objects chart      
splunk-kubernetes-objects:
  rbac:
    create: true
  serviceAccount:
    create: true
    name: splunk-kubernetes-objects
  kubernetes:
    insecureSSL: true
  objects:
    core:
      v1:
        - name: pods
          #interval: 30
        - name: namespaces
          #interval: 30
        - name: nodes
          #interval: 60
        - name: services
          #interval: 30
        - name: config_maps
          #interval: 30
        - name: secrets
          #interval: 30
        #- name: volumes
          #interval: 30
        - name: persistent_volumes
          #interval: 30
        - name: service_accounts
          #interval: 30
        - name: persistent_volume_claims
          #interval: 30
        - name: resource_quotas
          #interval: 30
        - name: component_statuses
          #interval: 30
        - name: events
          mode: watch
    apps:
      v1:
        - name: deployments
          #interval: 30
        - name: daemon_sets
          #interval: 30
        - name: replica_sets
          #interval: 30
        - name: stateful_sets
          #interval: 30
  splunk:
    hec:
      indexName: k8s_events    

#local config for metrics chart
splunk-kubernetes-metrics:
  rbac:
    create: true
  serviceAccount:
    create: true
    name: splunk-kubernetes-metrics
  splunk:
    hec:
      indexName: k8s_metrics

splunk_hec_endpoint_hostname はSplunkでHECを受けるホスト名(もしくはFQDNやIPアドレス)
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX は先のステップで作成したHECトークンを指定

indexName には作成したインデックス名を指定
splunk-kubernetes-logging と splunk-kubernetes-objects はログ用のインデックス (ここでは k8s_events)
-splunk-kubernetes-metrics はメトリクス用のインデックス (ここでは k8s_metrics)

helm install で変数設定したYAMLを使って Splunk Connect for Kubernetes をインストール

$ helm install --name kikeyama -f my_values.yaml --namespace splunk-connect-k8s --tiller-namespace splunk-connect-k8s https://github.com/splunk/splunk-connect-for-kubernetes/releases/download/v1.0.0/splunk-connect-for-kubernetes-1.0.0.tgz
NAME:   kikeyama
LAST DEPLOYED: Tue Jun 19 23:08:56 2018
NAMESPACE: splunk-connect-k8s
STATUS: DEPLOYED

RESOURCES:
==> v1/ServiceAccount
NAME                       SECRETS  AGE
splunk-kubernetes-metrics  1        4s
splunk-kubernetes-objects  1        4s

==> v1/ClusterRole
NAME                                AGE
kikeyama-splunk-kubernetes-objects  4s

==> v1/ClusterRoleBinding
NAME                                AGE
kikeyama-splunk-kubernetes-metrics  4s
kikeyama-splunk-kubernetes-objects  4s

==> v1beta1/DaemonSet
NAME                                DESIRED  CURRENT  READY  UP-TO-DATE  AVAILABLE  NODE SELECTOR  AGE
kikeyama-splunk-kubernetes-logging  3        3        0      3           0          <none>         4s

==> v1beta1/Deployment
NAME                                DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
kikeyama-splunk-kubernetes-metrics  1        1        1           0          4s
kikeyama-splunk-kubernetes-objects  1        1        1           0          4s

==> v1/Pod(related)
NAME                                                 READY  STATUS             RESTARTS  AGE
kikeyama-splunk-kubernetes-logging-bl8q5             0/1    ContainerCreating  0         4s
kikeyama-splunk-kubernetes-logging-vqls4             0/1    ContainerCreating  0         4s
kikeyama-splunk-kubernetes-logging-xt7b4             0/1    ContainerCreating  0         4s
kikeyama-splunk-kubernetes-metrics-8695547795-kj62z  0/2    ContainerCreating  0         4s
kikeyama-splunk-kubernetes-objects-7b89c55dc8-7pnht  0/1    ContainerCreating  0         4s

==> v1/Secret
NAME                                TYPE    DATA  AGE
kikeyama-splunk-kubernetes-logging  Opaque  1     4s
kikeyama-splunk-kubernetes-metrics  Opaque  1     4s
kikeyama-splunk-kubernetes-objects  Opaque  1     4s

==> v1/ConfigMap
NAME                                DATA  AGE
kikeyama-splunk-kubernetes-logging  7     4s
kikeyama-splunk-kubernetes-metrics  1     4s
kikeyama-splunk-kubernetes-objects  1     4s


NOTES:


███████╗██████╗ ██╗     ██╗   ██╗███╗   ██╗██╗  ██╗██╗    
██╔════╝██╔══██╗██║     ██║   ██║████╗  ██║██║ ██╔╝╚██╗   
███████╗██████╔╝██║     ██║   ██║██╔██╗ ██║█████╔╝  ╚██╗  
╚════██║██╔═══╝ ██║     ██║   ██║██║╚██╗██║██╔═██╗  ██╔╝  
███████║██║     ███████╗╚██████╔╝██║ ╚████║██║  ██╗██╔╝
╚══════╝╚═╝     ╚══════╝ ╚═════╝ ╚═╝  ╚═══╝╚═╝  ╚═╝╚═╝

Listen to your data.

Splunk Connect for Kubernetes is spinning up in your cluster.
After a few minutes, you should see data being indexed in your Splunk.

If you get stuck, we're here to help.
Look for answers here: http://docs.splunk.com

请将“kikeyama”一词替换为您自己喜欢的名字。
这将成为Pod名称的前缀。

確認

Splunk Connect for Kubernetes的Pod已被创建如下。

$ kubectl get pods -n splunk-connect-k8s
NAME                                                  READY     STATUS    RESTARTS   AGE
kikeyama-splunk-kubernetes-logging-bl8q5              1/1       Running   0          2d
kikeyama-splunk-kubernetes-logging-vqls4              1/1       Running   0          2d
kikeyama-splunk-kubernetes-logging-xt7b4              1/1       Running   0          2d
kikeyama-splunk-kubernetes-metrics-8695547795-kj62z   2/2       Running   0          2d
kikeyama-splunk-kubernetes-objects-7b89c55dc8-7pnht   1/1       Running   0          2d
tiller-deploy-7f9d844969-wns69                        1/1       Running   0          2d

The correct paraphrase in Chinese would be: “斯柏林克确认” (Sī bó kè .

Splunkにログインして確認してみましょう。

查看日志

让我们来看看以下SPL是否包含日志。

| tstats count latest(_time) as latest_time where index=k8s_events by index sourcetype 
| eval latest_time = strftime(latest_time, "%F %T")
Screen Shot 2018-06-22 5.50.37 PM.png

确认指标

Screen Shot 2018-06-22 5.54.03 PM.png
kubernetes_metrics_by_pod.png

最後に

これでデータは入ってきますが、ダッシュボード等の可視化はAdd-onに用意されていないので、自作する必要があります。
また、 Splunk Add-on for Kubernetes はSplunk製なのでサポートされるっぽいですが、 Splunk Connect for Kubernetes はGitHubに公開されているのみでコミュニティサポートになるようです。

ちなみに、自分でセットアップしてたときは helm install 実行時にRBACでひっかかったのか、何回もpermission errorが出て苦労しました。

$ helm install --name kikeyama --namespace splunk-connect-k8s -f my_values.yaml https://github.com/splunk/splunk-connect-for-kubernetes/releases/download/v1.0.0/splunk-connect-for-kubernetes-1.0.0.tgz
Error: release kikeyama failed: namespaces "splunk-connect-k8s" is forbidden: User "system:serviceaccount:kube-system:default" cannot get namespaces in the namespace "splunk-connect-k8s"

こちら を参考に helm init しなおしたら上手くいきました。

除了其他麻煩之外,按照上述步驟應該是可以的。很簡單吧?

おまけ

kubernetes_overview_20180622.png

关于这个问题,稍后会在另一篇文章中提及。

我安装了Nginx Ingress并将日志导入Splunk中,所以稍后可能会写一篇相关文章。

广告
将在 10 秒后关闭
bannerAds