k8s部署Hazelcast分布式缓存中间件
這篇文檔主要是描述Kubernetes在Hazelcast平臺上部署原生云應用的方法。當我們提到原生云應用時,意味著我們的應用程序是運行在一個集群之上,同時使用這個集群的基礎設施實現這個應用程序。值得注意的是,在此情況下,一個定制化的Hazelcast引導程序被用來使Hazelcast可以動態的發現已經加入集群的Hazelcast節點。
當拓撲結構發生變化時,需要Hazelcast節點自身進行交流和處理。
本文檔同樣也嘗試去解釋Kubernetes的核心組件:Pods、Service和ReplicationController。
前提
下面的例子假定你已經安裝了Kubernetes集群并且可以運行。同時你也已經在你的路徑下安裝了kubectl命令行工具。
給急性子的備注
下面的介紹會有點長,如果你想跳過直接開始的話,請看結尾處的“太長不讀版”。
資源
免費的資源如下:
- Hazelcast節點發現 – https://github.com/pires/hazelcast-kubernetes-bootstrapper
- Dockerfile文件 –https://github.com/pires/hazelcast-kubernetes
- 官方的Docker鏡像 – https://quay.io/repository/pires/hazelcast-kubernetes
簡單的單調度單元的Hazelcast節點
在Kubernetes中,最小的應用單元就是Pod。一個Pod就是同一個主機調度下的一個或者多個容器。在一個Pod中的所有容器共享同一個網絡命名空間,同時可以有選擇性的共享同一個數據卷。
在這種情況下,我們不能單獨運行一個Hazelcast Pod,因為它的發現機制依賴于Service的定義。
添加一個Hazelcast 服務
在Hazelcast中,一個Service被描述為執行同一任務的Pods集合。比如,一個Hazelcast集群中的節點集合。Service的一個重要用途就是通過建立一個均衡負載器將流量均勻的分到集合中的每一個成員。此外,Service還可以作為一個標準的查詢器,使動態變化的Pod集合提供有效通過Kubernetes的API。實際上,這個就是探索機制的工作原理,就是在service的基礎上去發現Hazelcast Pods。 下面是對Service的描述:
apiVersion: v1 kind: Service metadata: labels: name: hazelcastname: hazelcast spec:ports:- port: 5701selector: name: hazelcast這里值得注意的是selector(選擇器)。在標簽的上層有一個查詢器,它標識了被Service所覆蓋的Pods集合。在這種情況下,selector就是代碼中name: hazelcast。在接下來的 Replication Controller說明書中,你會看到Pods中有對應的標簽,那么它就會被這個Service中對應的成員變量所選中。
創建該Serviced的命令如下:
$ kubectl create -f examples/hazelcast/hazelcast-service.yaml添加一個拷貝節點
Kubernetes和Hazelcast真正強大的地方在于它們可以輕松的建立一個可拷貝的、大小可調的Hazelcast集群。
在Kubernetes中,存在一個叫做Replication Controller的管理器,專門用來管理相同Pods的拷貝集合。和Service一樣,它也存在一個在集合成員變量中定義的選擇查詢器。和Service不同的是,它對拷貝的個數有要求,會通過創建或者刪除Pods來確保當前Pods的數量符合要求。
Replication Controllers會通過匹配響應的選擇查詢器來確認要接收的Pods,下面我們將創建一個單拷貝的Replication Controller去接收已經存在的Hazelcast Pod。
apiVersion: v1 kind: ReplicationController metadata: labels: name: hazelcastname: hazelcast spec: replicas: 1selector: name: hazelcasttemplate: metadata: labels: name: hazelcastspec: containers: - resources:limits:cpu: 0.1image: quay.io/pires/hazelcast-kubernetes:0.5name: hazelcastenv:- name: "DNS_DOMAIN"value: "cluster.local"- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceports: - containerPort: 5701name: hazelcast在這段代碼中,有一些需要注意的東西。首先要注意的是,我們運行的是quay.io/pires/hazelcast-kubernetes image, tag 0.5。這個busybox安裝在JRE8上。盡管如此,它還是添加了一個用戶端的應用程序,從而可以發現集群中的Hazelcast節點并且引導一個Hazelcast實例。HazelcastDiscoveryController通過內置的搜索服務器來探索Kubernetes API Server,之后用Kubernetes API來發現新的節點。
你可能已經注意到了,我們會告知Kubernetes,容器會暴露Hazelcast端口。最終,我們需要告訴集群的管理器,我們需要一個CPU核。
對于Hazelcast Pod而言,Replication Controller塊的配置基本相同,以上就是聲明,它只是給管理器提供一種簡單的建立新節點的方法。其它的部分就是包含了Controller選擇條件的selector,以及配置Pod數量的replicas,在這個例子中數量為1。
最后,我們需要根據你的Kubernetes集群的DNS配置來設置DNS_DOMAIN的環境變量。
創建該控制器的命令:
$ kubectl create -f examples/hazelcast/hazelcast-controller.yaml當控制器成功的準備好后,你就可以查詢服務端點:
$ kubectl get endpoints hazelcast -o json {"kind": "Endpoints","apiVersion": "v1","metadata": {"name": "hazelcast","namespace": "default","selfLink": "/api/v1/namespaces/default/endpoints/hazelcast","uid": "094e507a-2700-11e5-abbc-080027eae546","resourceVersion": "4094","creationTimestamp": "2015-07-10T12:34:41Z","labels": {"name": "hazelcast"}},"subsets": [{"addresses": [{"ip": "10.244.37.3","targetRef": {"kind": "Pod","namespace": "default","name": "hazelcast-nsyzn","uid": "f57eb6b0-2706-11e5-abbc-080027eae546","resourceVersion": "4093"}}],"ports": [{"port": 5701,"protocol": "TCP"}]}] }你可以看到Service發現那些被Replication Controller建立的Pods。
這下變的更加有趣了。讓我們把集群提高到2個Pod。
$ kubectl scale rc hazelcast --replicas=2現在,如果你去列出集群中的Pods,你應該會看到2個Hazelcast Pods:
$ kubectl get pods NAME READY STATUS RESTARTS AGE hazelcast-nanfb 1/1 Running 0 40s hazelcast-nsyzn 1/1 Running 0 2m kube-dns-xudrp 3/3 Running 0 1h如果想確保每一個Pods都在工作,你可以通過log命令來進行日志檢查,如下:
$ kubectl log hazelcast-nanfb hazelcast 2015-07-10 13:26:34.443 INFO 5 --- [ main] com.github.pires.hazelcast.Application : Starting Application on hazelcast-nanfb with PID 5 (/bootstrapper.jar started by root in /) 2015-07-10 13:26:34.535 INFO 5 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@42cfcf1: startup date [Fri Jul 10 13:26:34 GMT 2015]; root of context hierarchy 2015-07-10 13:26:35.888 INFO 5 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup 2015-07-10 13:26:35.924 INFO 5 --- [ main] c.g.p.h.HazelcastDiscoveryController : Asking k8s registry at https://kubernetes.default.svc.cluster.local.. 2015-07-10 13:26:37.259 INFO 5 --- [ main] c.g.p.h.HazelcastDiscoveryController : Found 2 pods running Hazelcast. 2015-07-10 13:26:37.404 INFO 5 --- [ main] c.h.instance.DefaultAddressPicker : [LOCAL] [someGroup] [3.5] Interfaces is disabled, trying to pick one address from TCP-IP config addresses: [10.244.77.3, 10.244.37.3] 2015-07-10 13:26:37.405 INFO 5 --- [ main] c.h.instance.DefaultAddressPicker : [LOCAL] [someGroup] [3.5] Prefer IPv4 stack is true. 2015-07-10 13:26:37.415 INFO 5 --- [ main] c.h.instance.DefaultAddressPicker : [LOCAL] [someGroup] [3.5] Picked Address[10.244.77.3]:5701, using socket ServerSocket[addr=/0:0:0:0:0:0:0:0,localport=5701], bind any local is true 2015-07-10 13:26:37.852 INFO 5 --- [ main] com.hazelcast.spi.OperationService : [10.244.77.3]:5701 [someGroup] [3.5] Backpressure is disabled 2015-07-10 13:26:37.879 INFO 5 --- [ main] c.h.s.i.o.c.ClassicOperationExecutor : [10.244.77.3]:5701 [someGroup] [3.5] Starting with 2 generic operation threads and 2 partition operation threads. 2015-07-10 13:26:38.531 INFO 5 --- [ main] com.hazelcast.system : [10.244.77.3]:5701 [someGroup] [3.5] Hazelcast 3.5 (20150617 - 4270dc6) starting at Address[10.244.77.3]:5701 2015-07-10 13:26:38.532 INFO 5 --- [ main] com.hazelcast.system : [10.244.77.3]:5701 [someGroup] [3.5] Copyright (c) 2008-2015, Hazelcast, Inc. All Rights Reserved. 2015-07-10 13:26:38.533 INFO 5 --- [ main] com.hazelcast.instance.Node : [10.244.77.3]:5701 [someGroup] [3.5] Creating TcpIpJoiner 2015-07-10 13:26:38.534 INFO 5 --- [ main] com.hazelcast.core.LifecycleService : [10.244.77.3]:5701 [someGroup] [3.5] Address[10.244.77.3]:5701 is STARTING 2015-07-10 13:26:38.672 INFO 5 --- [ cached1] com.hazelcast.nio.tcp.SocketConnector : [10.244.77.3]:5701 [someGroup] [3.5] Connecting to /10.244.37.3:5701, timeout: 0, bind-any: true 2015-07-10 13:26:38.683 INFO 5 --- [ cached1] c.h.nio.tcp.TcpIpConnectionManager : [10.244.77.3]:5701 [someGroup] [3.5] Established socket connection between /10.244.77.3:59951 2015-07-10 13:26:45.699 INFO 5 --- [ration.thread-1] com.hazelcast.cluster.ClusterService : [10.244.77.3]:5701 [someGroup] [3.5]Members [2] {Member [10.244.37.3]:5701Member [10.244.77.3]:5701 this }2015-07-10 13:26:47.722 INFO 5 --- [ main] com.hazelcast.core.LifecycleService : [10.244.77.3]:5701 [someGroup] [3.5] Address[10.244.77.3]:5701 is STARTED 2015-07-10 13:26:47.723 INFO 5 --- [ main] com.github.pires.hazelcast.Application : Started Application in 13.792 seconds (JVM running for 14.542)接著是4個Pods:
$ kubectl scale rc hazelcast --replicas=4然后通過剛才的操作去檢查這4個成員是否連接。
太長不讀版
對于那些急性子,下面是這一章所用到的所有命令:
# 建立一個service去跟蹤所有的Hazelcast Nodes kubectl create -f examples/hazelcast/hazelcast-service.yaml# 建立一個Replication Controller去拷貝Hazelcast Nodes kubectl create -f examples/hazelcast/hazelcast-controller.yaml# 升級成2個節點 kubectl scale rc hazelcast --replicas=2# 升級成4個節點 kubectl scale rc hazelcast --replicas=4參考鏈接:
https://www.kubernetes.org.cn/doc-40
總結
以上是生活随笔為你收集整理的k8s部署Hazelcast分布式缓存中间件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win10 docker desktop
- 下一篇: win10使用WSL安装CentOS7