让我们使用Splunk来监控Kubernetes的日志和指标吧
我尝试使用Splunk将在Kubernetes上运行的容器环境可视化。
首先,我将介绍数据获取的方法并写一篇文章。
我想要将其系列化,并写一篇关于可视化和监控的文章。
— 2018/07/09 追記 —
我已经撰写了一篇关于可视化和监控的文章,使用Splunk来可视化和监控Kubernetes集群环境的日志和指标。
首先
Splunk索引的数据大致可以分为以下四种类型。
-
- CPU和内存等资源使用情况的度量
-
- 节点、Pod、Service、Namespace等对象信息
-
- 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の設定自体はカンタン
-
- Appをインストールする
-
- インデックスを作成
- HECを有効にする
就只是这样而已。
SpkunkにAppをインストール
Let’s install the Splunk Add-on for Kubernetes and Splunk Analysis Workspace. 让我们安装Splunk的Kubernetes附加组件和Splunk分析工作区。
インデックス作成
ログ系のインデックスとメトリクスのインデックスを作ります。
メトリクスは従来のログ用インデックスとは別に保存する必要があるため、別々に作ります。
顺便提一下,最好按照集群的单位来创建索引。
在Splunk界面中,转到“设置”>“索引”。
创建新索引。
使HEC生效
使用一个HEC代币即可获得日志和指标两者的收益。
因此,只需创建一个代币。
请前往下一步,指定源类型和索引。
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")
确认指标
最後に
これでデータは入ってきますが、ダッシュボード等の可視化は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 しなおしたら上手くいきました。
除了其他麻煩之外,按照上述步驟應該是可以的。很簡單吧?
おまけ
关于这个问题,稍后会在另一篇文章中提及。
我安装了Nginx Ingress并将日志导入Splunk中,所以稍后可能会写一篇相关文章。