k8s部署Hazelcast分布式缓存中间件
這篇文檔主要是描述Kubernetes在Hazelcast平臺(tái)上部署原生云應(yīng)用的方法。當(dāng)我們提到原生云應(yīng)用時(shí),意味著我們的應(yīng)用程序是運(yùn)行在一個(gè)集群之上,同時(shí)使用這個(gè)集群的基礎(chǔ)設(shè)施實(shí)現(xiàn)這個(gè)應(yīng)用程序。值得注意的是,在此情況下,一個(gè)定制化的Hazelcast引導(dǎo)程序被用來(lái)使Hazelcast可以動(dòng)態(tài)的發(fā)現(xiàn)已經(jīng)加入集群的Hazelcast節(jié)點(diǎn)。
當(dāng)拓?fù)浣Y(jié)構(gòu)發(fā)生變化時(shí),需要Hazelcast節(jié)點(diǎn)自身進(jìn)行交流和處理。
本文檔同樣也嘗試去解釋Kubernetes的核心組件:Pods、Service和ReplicationController。
前提
下面的例子假定你已經(jīng)安裝了Kubernetes集群并且可以運(yùn)行。同時(shí)你也已經(jīng)在你的路徑下安裝了kubectl命令行工具。
給急性子的備注
下面的介紹會(huì)有點(diǎn)長(zhǎng),如果你想跳過(guò)直接開始的話,請(qǐng)看結(jié)尾處的“太長(zhǎng)不讀版”。
資源
免費(fèi)的資源如下:
- Hazelcast節(jié)點(diǎn)發(fā)現(xiàn) – https://github.com/pires/hazelcast-kubernetes-bootstrapper
- Dockerfile文件 –https://github.com/pires/hazelcast-kubernetes
- 官方的Docker鏡像 – https://quay.io/repository/pires/hazelcast-kubernetes
簡(jiǎn)單的單調(diào)度單元的Hazelcast節(jié)點(diǎn)
在Kubernetes中,最小的應(yīng)用單元就是Pod。一個(gè)Pod就是同一個(gè)主機(jī)調(diào)度下的一個(gè)或者多個(gè)容器。在一個(gè)Pod中的所有容器共享同一個(gè)網(wǎng)絡(luò)命名空間,同時(shí)可以有選擇性的共享同一個(gè)數(shù)據(jù)卷。
在這種情況下,我們不能單獨(dú)運(yùn)行一個(gè)Hazelcast Pod,因?yàn)樗陌l(fā)現(xiàn)機(jī)制依賴于Service的定義。
添加一個(gè)Hazelcast 服務(wù)
在Hazelcast中,一個(gè)Service被描述為執(zhí)行同一任務(wù)的Pods集合。比如,一個(gè)Hazelcast集群中的節(jié)點(diǎn)集合。Service的一個(gè)重要用途就是通過(guò)建立一個(gè)均衡負(fù)載器將流量均勻的分到集合中的每一個(gè)成員。此外,Service還可以作為一個(gè)標(biāo)準(zhǔn)的查詢器,使動(dòng)態(tài)變化的Pod集合提供有效通過(guò)Kubernetes的API。實(shí)際上,這個(gè)就是探索機(jī)制的工作原理,就是在service的基礎(chǔ)上去發(fā)現(xiàn)Hazelcast Pods。 下面是對(duì)Service的描述:
apiVersion: v1 kind: Service metadata: labels: name: hazelcastname: hazelcast spec:ports:- port: 5701selector: name: hazelcast這里值得注意的是selector(選擇器)。在標(biāo)簽的上層有一個(gè)查詢器,它標(biāo)識(shí)了被Service所覆蓋的Pods集合。在這種情況下,selector就是代碼中name: hazelcast。在接下來(lái)的 Replication Controller說(shuō)明書中,你會(huì)看到Pods中有對(duì)應(yīng)的標(biāo)簽,那么它就會(huì)被這個(gè)Service中對(duì)應(yīng)的成員變量所選中。
創(chuàng)建該Serviced的命令如下:
$ kubectl create -f examples/hazelcast/hazelcast-service.yaml添加一個(gè)拷貝節(jié)點(diǎn)
Kubernetes和Hazelcast真正強(qiáng)大的地方在于它們可以輕松的建立一個(gè)可拷貝的、大小可調(diào)的Hazelcast集群。
在Kubernetes中,存在一個(gè)叫做Replication Controller的管理器,專門用來(lái)管理相同Pods的拷貝集合。和Service一樣,它也存在一個(gè)在集合成員變量中定義的選擇查詢器。和Service不同的是,它對(duì)拷貝的個(gè)數(shù)有要求,會(huì)通過(guò)創(chuàng)建或者刪除Pods來(lái)確保當(dāng)前Pods的數(shù)量符合要求。
Replication Controllers會(huì)通過(guò)匹配響應(yīng)的選擇查詢器來(lái)確認(rèn)要接收的Pods,下面我們將創(chuàng)建一個(gè)單拷貝的Replication Controller去接收已經(jīng)存在的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在這段代碼中,有一些需要注意的東西。首先要注意的是,我們運(yùn)行的是quay.io/pires/hazelcast-kubernetes image, tag 0.5。這個(gè)busybox安裝在JRE8上。盡管如此,它還是添加了一個(gè)用戶端的應(yīng)用程序,從而可以發(fā)現(xiàn)集群中的Hazelcast節(jié)點(diǎn)并且引導(dǎo)一個(gè)Hazelcast實(shí)例。HazelcastDiscoveryController通過(guò)內(nèi)置的搜索服務(wù)器來(lái)探索Kubernetes API Server,之后用Kubernetes API來(lái)發(fā)現(xiàn)新的節(jié)點(diǎn)。
你可能已經(jīng)注意到了,我們會(huì)告知Kubernetes,容器會(huì)暴露Hazelcast端口。最終,我們需要告訴集群的管理器,我們需要一個(gè)CPU核。
對(duì)于Hazelcast Pod而言,Replication Controller塊的配置基本相同,以上就是聲明,它只是給管理器提供一種簡(jiǎn)單的建立新節(jié)點(diǎn)的方法。其它的部分就是包含了Controller選擇條件的selector,以及配置Pod數(shù)量的replicas,在這個(gè)例子中數(shù)量為1。
最后,我們需要根據(jù)你的Kubernetes集群的DNS配置來(lái)設(shè)置DNS_DOMAIN的環(huán)境變量。
創(chuàng)建該控制器的命令:
$ kubectl create -f examples/hazelcast/hazelcast-controller.yaml當(dāng)控制器成功的準(zhǔn)備好后,你就可以查詢服務(wù)端點(diǎn):
$ 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發(fā)現(xiàn)那些被Replication Controller建立的Pods。
這下變的更加有趣了。讓我們把集群提高到2個(gè)Pod。
$ kubectl scale rc hazelcast --replicas=2現(xiàn)在,如果你去列出集群中的Pods,你應(yīng)該會(huì)看到2個(gè)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如果想確保每一個(gè)Pods都在工作,你可以通過(guò)log命令來(lái)進(jìn)行日志檢查,如下:
$ 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個(gè)Pods:
$ kubectl scale rc hazelcast --replicas=4然后通過(guò)剛才的操作去檢查這4個(gè)成員是否連接。
太長(zhǎng)不讀版
對(duì)于那些急性子,下面是這一章所用到的所有命令:
# 建立一個(gè)service去跟蹤所有的Hazelcast Nodes kubectl create -f examples/hazelcast/hazelcast-service.yaml# 建立一個(gè)Replication Controller去拷貝Hazelcast Nodes kubectl create -f examples/hazelcast/hazelcast-controller.yaml# 升級(jí)成2個(gè)節(jié)點(diǎn) kubectl scale rc hazelcast --replicas=2# 升級(jí)成4個(gè)節(jié)點(diǎn) kubectl scale rc hazelcast --replicas=4參考鏈接:
https://www.kubernetes.org.cn/doc-40
總結(jié)
以上是生活随笔為你收集整理的k8s部署Hazelcast分布式缓存中间件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: win10 docker desktop
- 下一篇: docker运行redis:window