【重识云原生】第六章容器基础6.4.10.4节——StatefulSet实操案例-使用 StatefulSet 部署Cassandra
《重识云原生系列》专题索引:
- 第一章——不谋全局不足以谋一域
- 第二章计算第1节——计算虚拟化技术总述
- 第二章计算第2节——主流虚拟化技术之VMare ESXi
- 第二章计算第3节——主流虚拟化技术之Xen
- 第二章计算第4节——主流虚拟化技术之KVM
- 第二章计算第5节——商用云主机方案
- 第二章计算第6节——裸金属方案
- 第三章云存储第1节——分布式云存储总述
- 第三章云存储第2节——SPDK方案综述
- 第三章云存储第3节——Ceph统一存储方案
- 第三章云存储第4节——OpenStack Swift 对象存储方案
- 第三章云存储第5节——商用分布式云存储方案
- 第四章云网络第一节——云网络技术发展简述
- 第四章云网络4.2节——相关基础知识准备
- 第四章云网络4.3节——重要网络协议
- 第四章云网络4.3.1节——路由技术简述
- 第四章云网络4.3.2节——VLAN技术
- 第四章云网络4.3.3节——RIP协议
- 第四章云网络4.3.4节——OSPF协议
- 第四章云网络4.3.5节——EIGRP协议
- 第四章云网络4.3.6节——IS-IS协议
- 第四章云网络4.3.7节——BGP协议
- 第四章云网络4.3.7.2节——BGP协议概述
- 第四章云网络4.3.7.3节——BGP协议实现原理
- 第四章云网络4.3.7.4节——高级特性
- 第四章云网络4.3.7.5节——实操
- 第四章云网络4.3.7.6节——MP-BGP协议
- 第四章云网络4.3.8节——策略路由
- 第四章云网络4.3.9节——Graceful Restart(平滑重启)技术
- 第四章云网络4.3.10节——VXLAN技术
- 第四章云网络4.3.10.2节——VXLAN Overlay网络方案设计
- 第四章云网络4.3.10.3节——VXLAN隧道机制
- 第四章云网络4.3.10.4节——VXLAN报文转发过程
- 第四章云网络4.3.10.5节——VXlan组网架构
- 第四章云网络4.3.10.6节——VXLAN应用部署方案
- 第四章云网络4.4节——Spine-Leaf网络架构
- 第四章云网络4.5节——大二层网络
- 第四章云网络4.6节——Underlay 和 Overlay概念
- 第四章云网络4.7.1节——网络虚拟化与卸载加速技术的演进简述
- 第四章云网络4.7.2节——virtio网络半虚拟化简介
- 第四章云网络4.7.3节——Vhost-net方案
- 第四章云网络4.7.4节vhost-user方案——virtio的DPDK卸载方案
- 第四章云网络4.7.5节vDPA方案——virtio的半硬件虚拟化实现
- 第四章云网络4.7.6节——virtio-blk存储虚拟化方案
- 第四章云网络4.7.8节——SR-IOV方案
- 第四章云网络4.7.9节——NFV
- 第四章云网络4.8.1节——SDN总述
- 第四章云网络4.8.2.1节——OpenFlow概述
- 第四章云网络4.8.2.2节——OpenFlow协议详解
- 第四章云网络4.8.2.3节——OpenFlow运行机制
- 第四章云网络4.8.3.1节——Open vSwitch简介
- 第四章云网络4.8.3.2节——Open vSwitch工作原理详解
- 第四章云网络4.8.4节——OpenStack与SDN的集成
- 第四章云网络4.8.5节——OpenDayLight
- 第四章云网络4.8.6节——Dragonflow
第四章云网络4.9.1节——网络卸载加速技术综述
第四章云网络4.9.2节——传统网络卸载技术
第四章云网络4.9.3.1节——DPDK技术综述
第四章云网络4.9.3.2节——DPDK原理详解
第四章云网络4.9.4.1节——智能网卡SmartNIC方案综述
第四章云网络4.9.4.2节——智能网卡实现
第六章容器6.1.1节——容器综述
第六章容器6.1.2节——容器安装部署
第六章容器6.1.3节——Docker常用命令
第六章容器6.1.4节——Docker核心技术LXC
第六章容器6.1.5节——Docker核心技术Namespace
第六章容器6.1.6节—— Docker核心技术Chroot
第六章容器6.1.7.1节——Docker核心技术cgroups综述
第六章容器6.1.7.2节——cgroups原理剖析
第六章容器6.1.7.3节——cgroups数据结构剖析
第六章容器6.1.7.4节——cgroups使用
第六章容器6.1.8节——Docker核心技术UnionFS
第六章容器6.1.9节——Docker镜像技术剖析
第六章容器6.1.10节——DockerFile解析
第六章容器6.1.11节——docker-compose容器编排
第六章容器6.1.12节——Docker网络模型设计
第六章容器6.2.1节——Kubernetes概述
第六章容器6.2.2节——K8S架构剖析
第六章容器6.3.1节——K8S核心组件总述
第六章容器6.3.2节——API Server组件
第六章容器6.3.3节——Kube-Scheduler使用篇
第六章容器6.3.4节——etcd组件
第六章容器6.3.5节——Controller Manager概述
第六章容器6.3.6节——kubelet组件
第六章容器6.3.7节——命令行工具kubectl
第六章容器6.3.8节——kube-proxy
第六章容器6.4.1节——K8S资源对象总览
第六章容器6.4.2.1节——pod详解
第六章容器6.4.2.2节——Pod使用(上)
第六章容器6.4.2.3节——Pod使用(下)
第六章容器6.4.3节——ReplicationController
第六章容器6.4.4节——ReplicaSet组件
第六章容器基础6.4.5.1节——Deployment概述
第六章容器基础6.4.5.2节——Deployment配置详细说明
第六章容器基础6.4.5.3节——Deployment实现原理解析
第六章容器基础6.4.6节——Daemonset
第六章容器基础6.4.7节——Job
第六章容器基础6.4.8节——CronJob
1 示例:使用 StatefulSet 部署 Cassandra
本教程描述了如何在 Kubernetes 上运行 Apache Cassandra。 数据库 Cassandra 需要永久性存储提供数据持久性(应用状态)。 在此示例中,自定义 Cassandra seed provider 使数据库在接入 Cassandra 集群时能够发现新的 Cassandra 实例。
使用StatefulSet可以更轻松地将有状态的应用程序部署到你的 Kubernetes 集群中。 有关本教程中使用的功能的更多信息, 请参阅 StatefulSet。说明:
Cassandra 和 Kubernetes 都使用术语节点来表示集群的成员。 在本教程中,属于 StatefulSet 的 Pod 是 Cassandra 节点,并且是 Cassandra 集群的成员(称为 ring)。 当这些 Pod 在你的 Kubernetes 集群中运行时,Kubernetes 控制平面会将这些 Pod 调度到 Kubernetes 的 节点上。
当 Cassandra 节点启动时,使用 seed 列表来引导发现 ring 中的其他节点。 本教程部署了一个自定义的 Cassandra seed provider, 使数据库可以发现 Kubernetes 集群中出现的新的 Cassandra Pod。
1.1 教程目标
- 创建并验证 Cassandra 无头(headless)Service。
- 使用 StatefulSet 创建一个 Cassandra ring。
- 验证 StatefulSet。
- 修改 StatefulSet。
- 删除 StatefulSet 及其 Pod。
1.2 准备开始
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
- Killercoda
- 玩转 Kubernetes
要完成本教程,你应该已经熟悉 Pod、 Service 和 StatefulSet。
1.3 为 Cassandra 创建无头(headless) Services
在 Kubernetes 中,一个 Service 描述了一组执行相同任务的 Pod。
以下 Service 用于在 Cassandra Pod 和集群中的客户端之间进行 DNS 查找:application/cassandra/cassandra-service.yaml
apiVersion: v1
kind: Service
metadata: labels: app: cassandra name: cassandra
spec: clusterIP: None ports: - port: 9042 selector: app: cassandra
创建一个 Service 来跟踪 cassandra-service.yaml 文件中的所有 Cassandra StatefulSet:
kubectl apply -f https://k8s.io/examples/application/cassandra/cassandra-service.yaml
1.4 验证(可选)
获取 Cassandra Service。
kubectl get svc cassandra
响应是:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cassandra ClusterIP None <none> 9042/TCP 45s
如果没有看到名为 cassandra 的服务,则表示创建失败。 请阅读调试服务,以解决常见问题。
1.5 使用 StatefulSet 创建 Cassandra Ring
下面包含的 StatefulSet 清单创建了一个由三个 Pod 组成的 Cassandra ring。
说明: 本示例使用 Minikube 的默认配置程序。 请为正在使用的云更新以下 StatefulSet。application/cassandra/cassandra-statefulset.yaml
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 # 这些卷挂载是持久的。它们类似内联申领,但并不完全相同, # 因为这些卷挂载的名称需要与 StatefulSet 中某 Pod 卷完全匹配。 volumeMounts: - name: cassandra-data mountPath: /cassandra_data # 这些将被控制器转换为卷申领,并挂载在上述路径。 # 请勿将此设置用于生产环境,除非使用了 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 文件创建 Cassandra StatefulSet:
# 如果你能未经修改地应用 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, 然后应用修改后的清单。
# 如果使用本地的 cassandra-statefulset.yaml ,请使用此命令
kubectl apply -f cassandra-statefulset.yaml
1.6 验证 Cassandra StatefulSet
1. 获取 Cassandra StatefulSet:
kubectl get statefulset cassandra
响应应该与此类似:
NAME DESIRED CURRENT AGE
cassandra 3 0 13s
StatefulSet 资源会按顺序部署 Pod。
2. 获取 Pod 查看已排序的创建状态:
kubectl get pods -l="app=cassandra"
响应应该与此类似:
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
3. 运行第一个 Pod 中的 Cassandra nodetool, 以显示 ring 的状态。
kubectl exec -it cassandra-0 -- nodetool status
响应应该与此类似:
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
1.7 修改 Cassandra StatefulSet
使用 kubectl edit 修改 Cassandra StatefulSet 的大小。
1. 运行以下命令:
kubectl edit statefulset cassandra
此命令你的终端中打开一个编辑器。需要更改的是 replicas 字段。下面是 StatefulSet 文件的片段示例:
# 请编辑以下对象。以 '#' 开头的行将被忽略,
# 且空文件将放弃编辑。如果保存此文件时发生错误,
# 将重新打开并显示相关故障。
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
2. 将副本数(replicas)更改为 4,然后保存清单。
StatefulSet 现在可以扩展到运行 4 个 Pod。
3. 获取 Cassandra StatefulSet 验证更改:
kubectl get statefulset cassandra
响应应该与此类似:
NAME DESIRED CURRENT AGE
cassandra 4 4 36m
1.8 清理现场
删除或缩小 StatefulSet 不会删除与 StatefulSet 关联的卷。 这个设置是出于安全考虑,因为你的数据比自动清除所有相关的 StatefulSet 资源更有价值。
警告:
根据存储类和回收策略,删除 PersistentVolumeClaims 可能导致关联的卷也被删除。 千万不要认为其容量声明被删除,你就能访问数据。
1. 运行以下命令(连在一起成为一个单独的命令)删除 Cassandra StatefulSet 中的所有内容:
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
2. 运行以下命令,删除你为 Cassandra 设置的 Service:
kubectl delete service -l app=cassandra
1.9 Cassandra 容器环境变量
本教程中的 Pod 使用来自 Google 容器镜像库 的 gcr.io/google-samples/cassandra:v13 镜像。上面的 Docker 镜像基于 debian-base, 并且包含 OpenJDK 8。
该镜像包括来自 Apache Debian 存储库的标准 Cassandra 安装。 通过使用环境变量,你可以更改插入到 cassandra.yaml 中的值。
环境变量 |
默认值 |
CASSANDRA_CLUSTER_NAME |
'Test Cluster' |
CASSANDRA_NUM_TOKENS |
32 |
CASSANDRA_RPC_ADDRESS |
0.0.0.0 |
参考链接
示例:使用 StatefulSet 部署 Cassandra | Kubernetes
StatefulSet 基础 | Kubernetes
示例:使用 StatefulSet 部署 Cassandra | Kubernetes
运行一个有状态的应用程序 | Kubernetes
Statefulset详细解析 - 不懂123 - 博客园
k8s中statefulset资源类型的深入理解
十,StatefulSet简介及简单使用 - 戴红领巾的少年 - 博客园
k8s之StatefulSet详解_最美dee时光的博客-CSDN博客_statefulset
【重识云原生】第六章容器基础6.4.10.4节——StatefulSet实操案例-使用 StatefulSet 部署Cassandra相关推荐
- 【重识云原生】第六章容器基础6.4.9.2节——使用 Service 连接到应用
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
- 【重识云原生】第一章——不谋全局不足以谋一域
云原生体系知识地图大纲: 锲子 云原生概念这几年非常火爆,本人因有幸参与公司云原生转型项目调研,开始接触这一庞大技术体系,再通过与同业.各大头部云厂商超过150场的密集研讨交流,方得初窥全貌.同时 ...
- 【重识云原生】第二章计算第一节——计算虚拟化技术总述
云平台计算领域知识地图: 楔子:计算虚拟化技术算是云计算技术的擎天之柱,其前两代技术的演进一直引领着云计算的发展,即便到了云原生时代,其作用依然举足轻重. 一.计算虚拟化技术总述 1.1 虚拟化技 ...
- 【重识云原生】第六章容器基础6.4.7.1节——K8S Job组件
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
- 【重识云原生】第六章容器基础6.4.5.2节——Deployment配置详细说明
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
- 【重识云原生】第六章容器基础6.4.5.3节——Deployment实现原理解析
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
- 【重识云原生】第六章容器基础6.4.5.1节——Deployment概述
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
- 【重识云原生】第六章容器基础6.4.9.6节——Service 与 Pod 的DNS
1 Service 与 Pod 的 DNS Kubernetes 为 Service 和 Pod 创建 DNS 记录. 你可以使用一致的 DNS 名称而非 IP 地址访问 Service. Kuber ...
- 【重识云原生】第六章容器6.3.5节——Controller Manager概述
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
- 【重识云原生】第三章云存储3.5节——商用分布式云存储方案
<重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...
最新文章
- 『Numpy』常用方法记录
- JavaScript中的call、apply、bind深入理解
- wireshrk中的名词说明
- Vim as Python IDE on windows
- 从阿里中台战略看企业IT架构转型之道(下)
- php mysql 拼音首字母,Mysql应用MySQL查询汉字的拼音首字母实例教程
- SpringBoot总结之CommandLineRunner
- liunx Swap 分区的作用
- Windows server 2016 安装小度WiFi网卡驱动
- AUTOCAD——合并图层
- 如何注册Gitlab/被墙如何注册
- Flutter 利用 FFI,绕过 Android JNI 直接调用 C++ 层!
- 蓝牙耳机哪款好?佩戴舒适的无线蓝牙耳机推荐
- 2020年度英国商业大奖获奖名单公布
- 寄快递没有那么贵,大件这样寄才便宜!!!
- 【驾驶技巧】 汽车驾驶经验交流——倒车技巧
- VBA Instr()函数 返回搜索到的字符位置 - VBA函数学习笔记(三)
- python有一门课不及格的学生_有一门课不及格的学生(c++)
- 网络请求框架:Okhttp:Call对象实现请求源码解析【四】
- Win10下应用程序默认管理员权限运行
热门文章
- FOJ1303——Calendar
- z5s+android+4.4,中兴NX403a(Nubia Z5S Mini Android 4.4)刷Recovery教程
- 怎样做一个软件注册程序
- Linux用户和组权限管理
- python求矩阵逆、伪逆、转置、矩阵乘法
- 蓝桥杯单片机(十二)PCF8591(D/A转换)
- ios隐私政策_新的iOS 14已经揭露了严重的隐私问题
- Learning through Auxiliary Tasks——辅助任务学习or自监督学习中的pretext
- 4399测试工程师笔试题
- opencv获取不规则图像