IBM Kubernetes Service跨区域集群及持久化存储方案(二)

上一篇文中,介绍了IKS使用COS作为跨区域方案,这是一种快捷、方便和高效的方式,性价比也非常高。那如果要追求极致的性能就需要使用专注于Kubernetes平台的企业级存储方案。运行在Kubernetes上的企业应用程序有不可改变的业务需求,如高可用性、数据安全、备份和灾难恢复、严格的性能SLA和混合/多云操作。Portworx企业版正是为这些基于容器应用而设计的。它包含了面向Kubernetes的Portworx存储平台的最可扩展和最健壮的功能,能够为更高级别的数据保护和自动化添加容灾、备份和自动化容量管理。每个集群可扩展到1000个节点和100万个卷。

我们在上一篇文中创建IKS集群时,主机选择了SDS(软件定义存储)的类型,现在我们先了解一下为什么需要SDS。

SDS抽象了各种类型、大小的存储设备,或者来自于附加到集群中的工作节点上的不同厂商的存储设备。在硬盘上有可用存储空间的工作节点作为节点加入存储集群。在这个集群中,物理存储被虚拟化,并作为一个虚拟存储池呈现给用户。存储集群通过SDS软件进行管理。如果数据必须存储在存储集群上,则由SDS软件决定数据的存储位置,以实现最高的可用性。虚拟存储附带了一组通用的功能和服务,用户只需要使用这些功能和服务,而不必关心实际的底层存储架构。使用Kubernetes需要的工作节点类型取决于用户使用的基础设施提供者。如果用户想在IBM Cloud上有一个典型的集群,那么IBM Kubernetes Service可以提供裸金属类型的工作节点,它针对软件定义存储(SDS)的使用进行了优化,在经典集群中,当使用带有10 Gpbs网络速度的SDS工作节点主机时,Portworx能够提供最佳性能。

下来我们在现有的集群来搭建跨区域存储Portworx。

 然后,我们可以进入目录或者直接从连接访问Portworx下单页面:https://cloud.ibm.com/catalog/services/portworx-enterprise

第一步我们需要选择区域,由于我的IKS集群建在达拉斯,如果追求最佳的性能,就需要在相同区域创建Portworx。

第二步需要选择套餐,两个都是企业版,不同的是第一个带有DR和IBM Key Protect功能,文本只是测试跨区域存储方案,仅选择企业版。

第三步我们要填入服务名称,比如我这里填写的Portworx Enterprise-den,也可以根据需要选择资源组。

第四步填一下Portworx的集群名,这个名在IKS集群中是唯一的,所以请保证唯一性,比如我在此处填写的是pxden。

第五步我们要填入管理员提供的或者自己的API key,通过下面的方式查看API Key

先进入IAM-用户:https://cloud.ibm.com/iam/users

选择自己的账号

创建新的API Key,复制并妥善保存好。

然后我们还是回到创建Portworx,第六步填入API key,然后会出现“Kubernetes or OpenShift cluster name”这栏,可以选择的现有的IKS集群,目前我只有一个集群,所以会自动填入:

第七步选择Portworx的键值数据库,为了方便测试,我仅选用内建的KVDB。如果是生产环境,建议先在账号下创建"IBM Database for Etcd",然后再创建Portworx时选择Etcd作为键值数据库,具体要求可以通过文档查看:https://cloud.ibm.com/docs/containers?topic=containers-portworx#portworx_database

第八步是指定Portworx的加密方式,可以使用Kubernetes原生的Secret,如果企业对加密有更高要求或者需要符合合规要求,可以使用IBM Key Protect或Hyper Protect Crypto服务,具体信息可以参考文档:https://cloud.ibm.com/docs/openshift?topic=openshift-portworx#encrypt_volumes

第九步,可以考虑是否启用Container Storage Interface(CSI)

最后,点击“创建”开始部署,Portworx集群的部署是由Helm构建的,整个过程需要挺长时间,大概10-15分钟后,我们能看到资源列表中部署完成。

看到“活动”后,我们用kubectl去查看一下部署情况:kubectl get pods -n kube-system | grep 'portworx\|stork'

可以发现部署了portworx和stork,分别是portworx,portworx-api,stork和stork-scheduler,每个组件有3个服务,共12个pods。

然后我们学习下怎么使用pxctl,选择一个portworx pod进去查看当前pod上portworx的状态:kubectl exec portworx-6b45b -it -n kube-system -- /opt/pwx/bin/pxctl status

可以看到状态是“PX is operational”,表示在运行,还有许可证信息。除了当前Pod所在主机的信息和存储位置和大小,还能看到整个存储集群的信息。

如果单独查看集群的信息,可以进pod执行命令:kubectl exec -it portworx-6b45b -n kube-system -- /opt/pwx/bin/pxctl cluster provision-status

既然已经装好Portworx,我们来看下如果使用这个跨区域存储吧。这次我们会集合Stork来使用,Stork是Portworx用于Kubernetes的存储调度程序,它有助于实现Portworx与Kubernetes的更紧密集成,它允许用户将pods与他们的数据放在一起,在存储错误的情况下提供无缝的pods迁移,并使创建和恢复Portworx卷的快照变得更容易。从刚才的部署的pod中可以看到Stork由两个组件组成,Stork调度程序和扩展程序,这两个组件都以HA模式运行,默认情况下有3个副本。

首先我们新建一个yaml文件mysql.ymal,将同时创建PX StorageClass,PVC和一个MySQL deployment,看下yaml构成。

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
   name: mysql-data
   annotations:
     volume.beta.kubernetes.io/storage-class: px-mysql-sc
spec:
   accessModes:
     - ReadWriteOnce
   resources:
     requests:
       storage: 2Gi
---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
    name: px-mysql-sc
provisioner: kubernetes.io/portworx-volume
parameters:
   repl: "2"
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
        version: "1"
    spec:
      schedulerName: stork
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-data

上述yaml规范将创建一个加载Portworx PVC的mysql deloyment有两个副本,其中mysql pod将在集群中一个副本所在的节点上调度,如果其中一个节点没有足够的资源,那么将在集群中的其他节点上调度它。为了使用Stork调度器来调度给定的pod,在pod规范中指定调度器的名称"schedulerName: stork"。

然后我们创建这个yaml文件: kubectl create -f mysql.yaml

创建完,我们查看下StorageClass,PVC,deployment和pod。

现在我们了解了如何使用Portworx建StorageClass和PVC来挂载到应用。

Stork除了调度以外,还能实现生成快照和从快照还原,接下来我们演示用Stork来给刚建mysql数据库做快照和还原。

首先我们新建一个snapshot.yaml,内容如下,然后创建:kubectl create -f snapshot.yaml

apiVersion: volumesnapshot.external-storage.k8s.io/v1
kind: VolumeSnapshot
metadata:
  name: mysql-snapshot
  namespace: default
spec:
  persistentVolumeClaimName: mysql-data

创建后查看下volumesnapshot和volumesnapshotdatas:

kubectl get volumesnapshot

kubectl get volumesnapshotdatas

有可以describe一下连带一起创建的快照数据volumesnapshotdatas:kubectl describe volumesnapshotdatas

由于在创建快照的yaml中指定了"persistentVolumeClaimName: mysql-data",所以在上图中能看到快照对应的PVC是挂在mysql上的PVC:persistentVolumeClaimName: mysql-data,还能看到存储快照的id,位置和时间等信息。

下一步我们做一下从快照恢复,新建一个recover.yaml文件,内容如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-snap-clone
  annotations:
    snapshot.alpha.kubernetes.io/snapshot: mysql-snapshot
spec:
  accessModes:
     - ReadWriteOnce
  storageClassName: px-mysql-sc
  resources:
    requests:
      storage: 2Gi

我们务必要使用annotations,指定snapshot.alpha.kubernetes.io/snapshot为mysql-snapshot,就是刚才创建的snapshot中的name。storageClassName可以用刚才创建的px-mysql-sc,也可以用portworx默认的一些StorageClass。

接着执行命名:kubectl create -f recover.yaml。

然后再次查看PVC,可以看到新的PVC:mysql-snap-clone创建好了。

随后我们更新deployment mysql的volumes,执行kubectl edit deploy mysql

pvc把mysql-data替换成mysql-snap-clone并保存,最后再验证一下:kubectl get deploy mysql -oyaml

这样就实现了Stork对数据库存储创建快照和从快照还原的功能,使用Portworx+Stork就是如此简单。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值