W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
本教程描述拉如何在 Kubernetes 上運行 Apache Cassandra。 數(shù)據(jù)庫 Cassandra 需要永久性存儲提供數(shù)據(jù)持久性(應(yīng)用“狀態(tài)”)。 在此示例中,自定義 Cassandra seed provider 使數(shù)據(jù)庫在加入 Cassandra 集群時發(fā)現(xiàn)新的 Cassandra 實例。
使用"StatefulSets"可以更輕松地將有狀態(tài)的應(yīng)用程序部署到你的 Kubernetes 集群中。
說明:
Cassandra 和 Kubernetes 都使用術(shù)語“節(jié)點(node)”來表示集群的成員。 在本教程中,屬于 StatefulSet 的 Pod 是 Cassandra 節(jié)點,并且是 Cassandra 集群的成員(稱為 “ring”)。 當這些 Pod 在你的 Kubernetes 集群中運行時,Kubernetes 控制平面會將這些 Pod 調(diào)度到 Kubernetes 的 節(jié)點上。
當 Cassandra 節(jié)點啟動時,使用 seed列表 來引導(dǎo)發(fā)現(xiàn) ring 中其他節(jié)點。 本教程部署了一個自定義的 Cassandra seed provider,使數(shù)據(jù)庫可以發(fā)現(xiàn)新的 Cassandra Pod 出現(xiàn)在 Kubernetes 集群中。
你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:
要完成本教程,你應(yīng)該已經(jīng)熟悉 Pod, Service 和 StatefulSet。
在 Kubernetes 中,一個 Service 描述了一組執(zhí)行相同任務(wù)的 Pod。
以下 Service 用于在 Cassandra Pod 和集群中的客戶端之間進行 DNS 查找:
apiVersion: v1
kind: Service
metadata:
labels:
app: cassandra
name: cassandra
spec:
clusterIP: None
ports:
- port: 9042
selector:
app: cassandra
創(chuàng)建一個 Service 來跟蹤 ?cassandra-service.yaml
? 文件中的所有 Cassandra StatefulSet:
kubectl apply -f https://k8s.io/examples/application/cassandra/cassandra-service.yaml
獲取 Cassandra Service。
kubectl get svc cassandra
響應(yīng)是:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cassandra ClusterIP None <none> 9042/TCP 45s
如果沒有看到名為 ?cassandra
?的服務(wù),則表示創(chuàng)建失敗。
下面包含的 StatefulSet 清單創(chuàng)建了一個由三個 Pod 組成的 Cassandra ring。
說明: 本示例使用 Minikube 的默認配置程序。 請為正在使用的云更新以下 StatefulSet。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: cassandra
labels:
app: cassandra
spec:
serviceName: cassandra
replicas: 3
selector:
matchLabels:
app: cassandra
template:
metadata:
labels:
app: cassandra
spec:
terminationGracePeriodSeconds: 1800
containers:
- name: cassandra
image: gcr.io/google-samples/cassandra:v13
imagePullPolicy: Always
ports:
- containerPort: 7000
name: intra-node
- containerPort: 7001
name: tls-intra-node
- containerPort: 7199
name: jmx
- containerPort: 9042
name: cql
resources:
limits:
cpu: "500m"
memory: 1Gi
requests:
cpu: "500m"
memory: 1Gi
securityContext:
capabilities:
add:
- IPC_LOCK
lifecycle:
preStop:
exec:
command:
- /bin/sh
- -c
- nodetool drain
env:
- name: MAX_HEAP_SIZE
value: 512M
- name: HEAP_NEWSIZE
value: 100M
- name: CASSANDRA_SEEDS
value: "cassandra-0.cassandra.default.svc.cluster.local"
- name: CASSANDRA_CLUSTER_NAME
value: "K8Demo"
- name: CASSANDRA_DC
value: "DC1-K8Demo"
- name: CASSANDRA_RACK
value: "Rack1-K8Demo"
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
readinessProbe:
exec:
command:
- /bin/bash
- -c
- /ready-probe.sh
initialDelaySeconds: 15
timeoutSeconds: 5
# 這些卷掛載是持久的。它們類似內(nèi)聯(lián)申領(lǐng),但并不完全相同,
# 因為這些卷掛載的名稱需要與 StatefulSet 中某 Pod 卷完全匹配。
volumeMounts:
- name: cassandra-data
mountPath: /cassandra_data
# 這些將被控制器轉(zhuǎn)換為卷申領(lǐng),并掛載在上述路徑。
# 請勿將此設(shè)置用于生產(chǎn)環(huán)境,除非使用了 GCEPersistentDisk 或其他 SSD 持久盤。
volumeClaimTemplates:
- metadata:
name: cassandra-data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: fast
resources:
requests:
storage: 1Gi
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: fast
provisioner: k8s.io/minikube-hostpath
parameters:
type: pd-ssd
使用 ?cassandra-statefulset.yaml
? 文件創(chuàng)建 Cassandra StatefulSet :
# 如果你能未經(jīng)修改地 apply cassandra-statefulset.yaml,請使用此命令
kubectl apply -f https://k8s.io/examples/application/cassandra/cassandra-statefulset.yaml
如果你為了適合你的集群需要修改 ?cassandra-statefulset.yaml
?, 下載 https://k8s.io/examples/application/cassandra/cassandra-statefulset.yaml, 然后 apply 修改后的清單。
# 如果使用本地的 cassandra-statefulset.yaml ,請使用此命令
kubectl apply -f cassandra-statefulset.yaml
kubectl get statefulset cassandra
響應(yīng)應(yīng)該與此類似:
NAME DESIRED CURRENT AGE
cassandra 3 0 13s
?StatefulSet
?資源會按順序部署 Pod。
kubectl get pods -l="app=cassandra"
響應(yīng)應(yīng)該與此類似:
NAME READY STATUS RESTARTS AGE
cassandra-0 1/1 Running 0 1m
cassandra-1 0/1 ContainerCreating 0 8s
這三個 Pod 要花幾分鐘的時間才能部署。部署之后,相同的命令將返回類似于以下的輸出:
NAME READY STATUS RESTARTS AGE
cassandra-0 1/1 Running 0 10m
cassandra-1 1/1 Running 0 9m
cassandra-2 1/1 Running 0 8m
kubectl exec -it cassandra-0 -- nodetool status
響應(yīng)應(yīng)該與此類似:
Datacenter: DC1-K8Demo
======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns (effective) Host ID Rack
UN 172.17.0.5 83.57 KiB 32 74.0% e2dd09e6-d9d3-477e-96c5-45094c08db0f Rack1-K8Demo
UN 172.17.0.4 101.04 KiB 32 58.8% f89d6835-3a42-4419-92b3-0e62cae1479c Rack1-K8Demo
UN 172.17.0.6 84.74 KiB 32 67.1% a6a1e8c2-3dc5-4417-b1a0-26507af2aaad Rack1-K8Demo
使用 ?kubectl edit
? 修改 Cassandra StatefulSet 的大小。
kubectl edit statefulset cassandra
此命令你的終端中打開一個編輯器。需要更改的是 ?replicas
?字段。下面是 StatefulSet 文件的片段示例:
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: StatefulSet
metadata:
creationTimestamp: 2016-08-13T18:40:58Z
generation: 1
labels:
app: cassandra
name: cassandra
namespace: default
resourceVersion: "323"
uid: 7a219483-6185-11e6-a910-42010a8a0fc0
spec:
replicas: 3
StatefulSet 現(xiàn)在可以擴展到運行 4 個 Pod。
kubectl get statefulset cassandra
響應(yīng)應(yīng)該與此類似:
NAME DESIRED CURRENT AGE
cassandra 4 4 36m
刪除或縮小 StatefulSet 不會刪除與 StatefulSet 關(guān)聯(lián)的卷。 這個設(shè)置是出于安全考慮,因為你的數(shù)據(jù)比自動清除所有相關(guān)的 StatefulSet 資源更有價值。
警告:
根據(jù)存儲類和回收策略,刪除 PersistentVolumeClaims 可能導(dǎo)致關(guān)聯(lián)的卷也被刪除。 千萬不要認為其容量聲明被刪除,你就能訪問數(shù)據(jù)。
grace=$(kubectl get pod cassandra-0 -o=jsonpath='{.spec.terminationGracePeriodSeconds}') \
&& kubectl delete statefulset -l app=cassandra \
&& echo "Sleeping ${grace} seconds" 1>&2 \
&& sleep $grace \
&& kubectl delete persistentvolumeclaim -l app=cassandra
kubectl delete service -l app=cassandra
本教程中的 Pod 使用來自 Google 容器鏡像庫 的 ?gcr.io/google-samples/cassandra:v13
? 鏡像。上面的 Docker 鏡像基于
debian-base, 并且包含 OpenJDK 8。
該映像包括來自 Apache Debian 存儲庫的標準 Cassandra 安裝。 通過使用環(huán)境變量,你可以更改插入到 ?cassandra.yaml
? 中的值。
環(huán)境變量 | 默認值 |
---|---|
CASSANDRA_CLUSTER_NAME
|
'Test Cluster'
|
CASSANDRA_NUM_TOKENS
|
32
|
CASSANDRA_RPC_ADDRESS
|
0.0.0.0
|
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: