Kubernetes(k8s)中文文件 Kubernetes在Hazelcast平臺上部署原生雲應用_Kubernetes中文社群
譯者:賈瀾鵬
這篇文件主要是描述Kubernetes在Hazelcast平臺上部署原生雲應用的方法。當我們提到原生雲應用時,意味著我們的應用程式是執行在一個叢集之上,同時使用這個叢集的基礎設施實現這個應用程式。值得注意的是,在此情況下,一個定製化的Hazelcast載入程式
被用來使Hazelcast可以動態的發現已經加入叢集的Hazelcast節點。
當拓撲結構發生變化時,需要Hazelcast節點自身進行交流和處理。
本文件同樣也嘗試去解釋Kubernetes的核心元件:Pods、Service和ReplicationController。
前提
下面的例子假定你已經安裝了Kubernetes叢集並且可以執行。同時你也已經在你的路徑下安裝了kubectl命令列工具。
給急性子的備註
下面的介紹會有點長,如果你想跳過直接開始的話,請看結尾處的“太長不讀版”。
資源
免費的資源如下:
簡單的單排程單元的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: hazelcast
name: hazelcast
spec:
ports:
- port: 5701
selector:
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: hazelcast
name: hazelcast
spec:
replicas: 1
selector:
name: hazelcast
template:
metadata:
labels:
name: hazelcast
spec:
containers:
- resources:
limits:
cpu: 0.1
image: quay.io/pires/hazelcast-kubernetes:0.5
name: hazelcast
env:
- name: "DNS_DOMAIN"
value: "cluster.local"
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- containerPort: 5701
name: 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.spring[email protected]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]:5701
Member [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