<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>elastic search | 伪架构师</title>
    <link>/tags/elastic-search/</link>
      <atom:link href="/tags/elastic-search/index.xml" rel="self" type="application/rss+xml" />
    <description>elastic search</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Fri, 03 Nov 2017 04:49:29 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>elastic search</title>
      <link>/tags/elastic-search/</link>
    </image>
    
    <item>
      <title>K8S 上 Elastic Search 集群的通信加密、认证和清理</title>
      <link>/post/es-on-k8s-auth-cleanup/</link>
      <pubDate>Fri, 03 Nov 2017 04:49:29 +0800</pubDate>
      <guid>/post/es-on-k8s-auth-cleanup/</guid>
      <description>

&lt;p&gt;Kubernetes 的 Release 文件包中，一直包含了使用 Elastic Search 方案进行日志处理的简单例子，
这个例子非常简陋外加版本较旧，处于“能用”的状态而已。&lt;/p&gt;

&lt;p&gt;而近期的版本中这一情况发生了变化，原来的 &lt;code&gt;elasticsearch&lt;/code&gt; 中新增了一个子目录：
&lt;code&gt;production_cluster&lt;/code&gt;，&lt;code&gt;README.md&lt;/code&gt;中的介绍是：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A more robust example that follows Elasticsearch best-practices of separating nodes concern is also available.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这个听起来就厉害了，关键字：robuts，best-practice。&lt;/p&gt;

&lt;p&gt;顺藤摸瓜找到了作者的 github 地址：&lt;code&gt;https://github.com/pires/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;这一集群的特点是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ES 集群分为 Master/Client/Data 三组，各司其职，各自可以设置自己的资源使用，参数配置等。&lt;/li&gt;
&lt;li&gt;提供了 StatefulSet 形式的数据节点，便于数据持久化的支持。&lt;/li&gt;
&lt;li&gt;采用 Curator 的 CronJob，用于数据的清理。&lt;/li&gt;
&lt;li&gt;自定义的 Elastic Search 镜像。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这一些功能自然是极好的，然而因为 X-Pack 的授权问题，使得两个重要的功能： https 通信和认证落了空，还好发现了一个替代方案：&lt;a href=&#34;https://github.com/floragunncom/search-guard&#34; target=&#34;_blank&#34;&gt;Search Guard&lt;/a&gt;，
简单说来，这一方案提供了免费的认证和 https 通信方案，并且提供了更多的商业支持特性。具体能力范围可以参看官网，下面基于 Pries 的 ES 5.6.3 版本，来把假设在 Kubernetes 集群上的 ES 集群进行加固。&lt;/p&gt;

&lt;h2 id=&#34;环境准备&#34;&gt;环境准备&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes 集群：1.7.x

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kube-apiserver&lt;/code&gt;启动参数中加入&lt;code&gt;--runtime-config=batch/v2alpha1=true&lt;/code&gt;用于支持后面的 CronJob 对象&lt;/li&gt;
&lt;li&gt;集群存储，用于满足 PVC 需求（可选）&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Docker：用于自定义镜像的构建&lt;/li&gt;
&lt;li&gt;源代码：

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/pires/kubernetes-elasticsearch-cluster&#34; target=&#34;_blank&#34;&gt;https://github.com/pires/kubernetes-elasticsearch-cluster&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/fluent/fluentd-kubernetes-daemonset.git&#34; target=&#34;_blank&#34;&gt;https://github.com/fluent/fluentd-kubernetes-daemonset.git&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;镜像的构建&#34;&gt;镜像的构建&lt;/h2&gt;

&lt;p&gt;Search Guard 的安装分为插件安装、初始化和集群设置三个步骤，Pries 镜像中推荐的插件安装方式仅能完成第一步骤，因此这里做一些定制，将前两个步骤在镜像中直接完成。&lt;/p&gt;

&lt;p&gt;这里我们使用 Pries 镜像为基础：&lt;/p&gt;

&lt;h3 id=&#34;dockerfile&#34;&gt;Dockerfile&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-dockerfile&#34;&gt;FROM quay.io/pires/docker-elasticsearch-kubernetes:5.6.3
COPY prepare.sh /tmp
RUN sh /tmp/prepare.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&#34;prepare-sh&#34;&gt;prepare.sh&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/sh
set -xe
export NODE_NAME=&amp;quot;MASTER&amp;quot; # 占位符
# 插件安装
bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.6.3-16

# 初始化
chmod a+x plugins/search-guard-5/tools/install_demo_configuration.sh
plugins/search-guard-5/tools/install_demo_configuration.sh -y

# 清理不必要的配置
sed -i  &#39;s/network.host.*0$//&#39; config/elasticsearch.yml
sed -i  &#39;s/cluster.name.*demo$//&#39; config/elasticsearch.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#34;运行-es-集群&#34;&gt;运行 ES 集群&lt;/h2&gt;

&lt;p&gt;运行集群之前，注意三处需要修改：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;镜像名称。&lt;/li&gt;

&lt;li&gt;&lt;p&gt;环境变量加入：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;- name: &amp;quot;NETWORK_HOST&amp;quot;
value: &amp;quot;_eth0_&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;因为 Search Guard 的加入，Client 的可用检测是失效的，因此需要删除。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;kubectl apply -f es-discovery-svc.yaml
kubectl apply -f es-svc.yaml
kubectl apply -f es-master.yaml
kubectl apply -f es-client.yaml
kubectl apply -f es-data.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;集群启动之后会处于不可用状态，需要进行 Search guard 设置，使用 kubectl 命令进入任意一个 Master 节点的 Shell，编辑如下文件：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-bash&#34;&gt;#!/bin/bash
/elasticsearch/plugins/search-guard-5/tools/sgadmin.sh \
-cd /elasticsearch/plugins/search-guard-5/sgconfig \
-ks /elasticsearch/config/kirk.jks  -arc \
-ts /elasticsearch/config/truststore.jks -nhnv -icl \
-h 172.200.62.7
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-icl&lt;/code&gt; 参数用于禁止证书 CN 的检查。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-h&lt;/code&gt; 指定该 Pod 的地址。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-arc&lt;/code&gt; 接受状态为 RED 的集群操作。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这样就完成了 ES 集群的初始化设置，并且开始运行。
这时我们如果访问其服务，例如：&lt;code&gt;https://node.port:9200&lt;/code&gt;，如果弹出安全警告，在选择不检查证书之后，会弹出验证窗口，输入预置的：&lt;code&gt;admin/admin&lt;/code&gt; 就能看到正常的 API 页面了。&lt;/p&gt;

&lt;h2 id=&#34;fluentd&#34;&gt;Fluentd&lt;/h2&gt;

&lt;p&gt;因为我们的 Fluentd 需要访问 https 协议的有认证要求的 ES 集群，所以这里使用 ConfigMap 的方式，为 Fluentd 加载修改好的配置文件。&lt;/p&gt;

&lt;p&gt;首先使用 &lt;code&gt;docker cp&lt;/code&gt; 命令，或者直接从源码中获取 fluent.conf 和 kubernetes.conf 两个文件。&lt;/p&gt;

&lt;p&gt;在 fluent.conf 的 es 配置中加入 &lt;code&gt;ssl_verify false&lt;/code&gt; 一行。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;--from-file&lt;/code&gt; 开关将上文中的两个配置文件加入 ConfigMap。&lt;/p&gt;

&lt;p&gt;修改 DaemonSet 的源码：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;...
# 接入配置
- name: FLUENT_ELASTICSEARCH_SCHEME
  value: &amp;quot;https&amp;quot;
- name: FLUENT_ELASTICSEARCH_USER
  value: &amp;quot;admin&amp;quot;
- name: FLUENT_ELASTICSEARCH_PASSWORD
  value: &amp;quot;admin&amp;quot;
...
# 配置文件

volumeMounts:
...
- name: etc
  mountPath: /fluentd/etc
terminationGracePeriodSeconds: 30
volumes:
...
- name: etc
configMap:
  name: fluentd-config
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这样，Fluentd 就能成功连接 es 并发送日志了。&lt;/p&gt;

&lt;h2 id=&#34;kibana&#34;&gt;Kibana&lt;/h2&gt;

&lt;p&gt;和 Fluentd 的情况类似，也需要创建他的配置文件，并在 kibana.yml 原有内容基础上增加几行：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;elasticsearch.username: &amp;quot;admin&amp;quot;
elasticsearch.password: &amp;quot;admin&amp;quot;
elasticsearch.ssl.verificationMode: none
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;另外在他的 Deployment 描述中，需要将 ES 集群接口地址改为 https 协议。&lt;/p&gt;

&lt;p&gt;启用后，打开 Kibana 页面，就会弹出认证要求。&lt;/p&gt;

&lt;h2 id=&#34;curator&#34;&gt;Curator&lt;/h2&gt;

&lt;p&gt;编辑 es-curator-config.yml，修改：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;use_ssl: True
ssl_no_validate: True
http_auth: admin:admin
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后创建 ConfigMap 和 Cronjob 对象即可。&lt;/p&gt;

&lt;h2 id=&#34;补充&#34;&gt;补充&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;sgadmin 及其配置有着相当丰富的功能，例如用户和角色的管理等。&lt;/p&gt;&lt;/li&gt;

&lt;li&gt;&lt;p&gt;证书也是可以使用合法证书进行替代的，不一定需要使用自这个过程中生成的自签名证书。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
