<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>gluster | 伪架构师</title>
    <link>/tags/gluster/</link>
      <atom:link href="/tags/gluster/index.xml" rel="self" type="application/rss+xml" />
    <description>gluster</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Wed, 01 Jun 2016 22:57:51 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>gluster</title>
      <link>/tags/gluster/</link>
    </image>
    
    <item>
      <title>Kubernetes 中使用 Gluster FS</title>
      <link>/post/glusterfs-in-kubernetes/</link>
      <pubDate>Wed, 01 Jun 2016 22:57:51 +0800</pubDate>
      <guid>/post/glusterfs-in-kubernetes/</guid>
      <description>

&lt;p&gt;以 RC 形式运行在 Kubernetes 集群中的 Pod，会因为 Scale 等需要在不同的 Node 之间发生迁移，因此需要有独立于 Node 文件系统的共享存储服务，同时这一存储服务也应该符合集群的运行需要，简单的 NFS 不管是效率上还是可靠性上，都是不具备这一能力的。这里以 &lt;a href=&#34;https://www.gluster.org/&#34; target=&#34;_blank&#34;&gt;Gluster FS&lt;/a&gt;  作为存储引擎，为容器集群提供云存储服务。&lt;/p&gt;

&lt;p&gt;K8S 的存储卷使用稍有点古怪，Gluster FS 的使用，需要首先定义一个 &lt;a href=&#34;http://kubernetes.io/docs/user-guide/services/&#34; target=&#34;_blank&#34;&gt;Endpoint + Service&lt;/a&gt; 形式的代理，来定义 Gluster FS 集群，然后就可以通过&lt;a href=&#34;http://blog.fleeto.us/translation/persistent-volumes&#34; target=&#34;_blank&#34;&gt;持久卷&lt;/a&gt;或者用 Pod 直接加载了。&lt;/p&gt;

&lt;h2 id=&#34;定义-service&#34;&gt;定义 Service&lt;/h2&gt;

&lt;p&gt;首先用一个 YML 文件来定义 Endpoint 和 Service：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;---
kind: List
apiVersion: v1
items:
- kind: Endpoints
  apiVersion: v1
  metadata:
    name: service_name
  subsets:
  - addresses:
    - ip: 12.34.56.78
    ports:
    - port: 111
- kind: Service
  apiVersion: v1
  metadata:
    name: service_name
  spec:
    ports:
      - port: 111
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Port 可随意填写&lt;/li&gt;
&lt;li&gt;Service Name 需要一致，这个值将会用到后面的引用中&lt;/li&gt;
&lt;li&gt;ip：Gluster FS 的 IP 地址&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;定义文件生成结束后，利用 &lt;code&gt;kubectl create -f xx.yaml&lt;/code&gt; 的方式加载到集群之中。可以用 &lt;code&gt;kubectl get svc,endpoints&lt;/code&gt; 来验证结果。&lt;/p&gt;

&lt;p&gt;接下来有两种加载方式可以选择：持久卷和 Pod 直接加载。&lt;/p&gt;

&lt;h2 id=&#34;pod-直接加载&#34;&gt;Pod 直接加载&lt;/h2&gt;

&lt;p&gt;可以在 Pod 中直接定义一个 Gluster FS 格式的卷来进行加载：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;spec:
containers:
- name: nginx-docker-images
  image: nginx:latest
  volumeMounts:
    - mountPath: /glusterfs
      name: test-volume
volumes:
  - name: test-volume
    glusterfs:
      endpoints: glusterfs-cluster
      path: gv0
      readOnly: false
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;endpoints: 这里指定的就是上一届中定义的服务名称&lt;/li&gt;
&lt;li&gt;path: gluster fs 中的卷名称&lt;/li&gt;
&lt;li&gt;readOnly: 是否只读加载&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&#34;持久卷加载&#34;&gt;持久卷加载&lt;/h2&gt;

&lt;p&gt;首先定义一个持久卷：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;kind: PersistentVolume
apiVersion: v1
metadata:
  name: gluster-volumen-gv01
spec:
  capacity:
    storage: 1Mi
  accessModes:
    - ReadWriteMany
  glusterfs:
    endpoints: glusterfs-svc
    path: gv0
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;内容同上面的 Pod 卷定义大同小异，具体参数可以参考持久卷的相关文档。&lt;/p&gt;

&lt;p&gt;然后定义一个 PVC&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: myclaim2m
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Mi
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最后，在 Pod 中利用 PVC 来进行卷加载&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;volumes:
  - name: test-volume
    persistentVolumeClaim:
      # 上面定义的 PVC 名称
      claimName: myclaim1m
&lt;/code&gt;&lt;/pre&gt;
</description>
    </item>
    
  </channel>
</rss>
