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

最近刚完成IBM公有云上Kubernetes Service的测试,想分享一下企业如何使用IBM Kubernetes Service(IKS)部署高可用集群以及持久化存储。使用Kubernetes,如果创建高可用生产环境,通常会建在3个以上的高可用区域内,所以我们选用跨区域部署,而持久化存储也需要有跨区域部署的特性。我们先来看一下IKS集群以及对应存储的架构图。

可以看到IBM的持久化存储还是挺多的,单个区域的可以用NFS和块存储,跨区域的可以挂对象存储、企业级的Portworx,当然也可以用数据库这种方式。

下面我们就来讨论和学习一下跨区域部署和持久化存储,考虑到数据库本身有太多复杂性,本文仅介绍挂载对象存储和Portwox。首先我们需要创建IKS,需要选择SDS的类型,我们需要确保账户已启用VRF和服务端点。VRF需要等待技术支持开启,然后再启用服务端点。

进入目录选择或者直接访问链接创建IKS集群:https://cloud.ibm.com/kubernetes/catalog/create

选用经典架构中的软件定义存储的物理机作为IKS集群,构建在达拉斯3个可用区(AZ)中,每个AZ中先创建一个Worker Node。

“工作程序池”也就是Worker Node,先修改节点数为1,然后可以“更改类型”,选用软件定义存储的物理机作为工作节点,可以提供非常高的性能,它支持最高单台28物理核心,512GB内存,2TB HDD主磁盘,最高1.9TB SSD辅助磁盘,最高4*3.8TB SSD本地存储器,还有最重要的是物理机提供的10Gbps的网络速度。在本次测试中,我们使用‘ms3c.16×64 1.9tb ssd’的规格,因为安装portworx时需要SDS的Worker Node。

下一步我们可以根据需要启用本地磁盘加密以及是否启用专用和公共端点,填写集群名称和标签后,就可以“创建”集群了。

物理机集群的创建通常是5小时左右。中小规模的业务或考虑弹性负载时,可以创建或添加共享型的虚拟机作为Worker Node,部署的时间会很快,通常在15分钟左右。部署中我们可以看到各种状态,完成后就如下图。

下一步,进入目录筛选“存储”,可以看到对象存储和Portworx。

首先我们创建对象存储(COS),生产使用我们要选择“标准”套餐,资源组要可以和之前创建的IKS集群相同,填写完资源名称和标签,就可以快速“创建”对象存储实例了。

然后我们创建存储区,每家云厂商英文都是Bucket,在IBM COS中叫存储区,也有的叫数据桶。第一步选择“定制存储区”。

存储区名称唯一不能冲突,还有一些命名规则需要注意。然后选择“区域”,对象存储会部署在3个高可用区内,由于我IKS在达拉斯,所以理论上选相同或较近的位置。IBM最近推出了COS的智能分层类型,可用按实际使用量来核算,所以很省成本。其他一些规则如果需要就加上,不需要可以创建后设置。最后一步“创建存储区”。

创建后会进入到存储区,我们首先创建一个服务凭证,这服务凭证可以设置在API,客户端或者IKS中来接入COS进行操作。

创建服务凭证过程中,可以选择角色为管理员,自动生成,还需要注意:点击高级选项,开启HMAC。

创建后,我们可以查看或复制凭证,这个json文件中的信息后面我们会用到。

COS为IKS服务提供了一个对象存储的插件(Cloud Object Storage plug-in),通过此插件可以构建各层级的StorageClass提供给Kubernetes使用,插件通过上一步创建的服务凭证来访问对象存储实例和实例中的存储区。

在安装COS Plug-in之前,首先需要在IKS中新建一个secret:cos-write-access,COS提供两种方式的秘钥认证和授权,一个是API Key,另一个是HMAC(S3),使用任何一种方式都行。

API Key:

ibmcloud resource service-instance <service_name> | grep GUID

kubectl create secret generic cos-write-access --type=ibm/ibmc-s3fs --from-literal=api-key=<api_key> --from-literal=service-instance-id=<service_instance_guid>

HMAC

kubectl create secret generic cos-write-access --type=ibm/ibmc-s3fs --from-literal=access-key=<access_key_ID> --from-literal=secret-key=<secret_access_key>

查看Secret是否创建成功:kubectl get secret

下一步我们安装ibmc Helm plug-in 和 ibm-object-storage-plugin,首先需要确保本地机器上装了helm3,如果没有可以到官网上下载:Releases · helm/helm · GitHub

接着安装ibm的helm repo,需要依次执行下面几条命令:

helm repo add ibm-helm https://raw.githubusercontent.com/IBM/charts/master/repo/ibm-helm

helm repo update

helm plugin uninstall ibmc

helm fetch --untar ibm-helm/ibm-object-storage-plugin

helm plugin install ./ibm-object-storage-plugin/helm-ibmc

安装完成后使用helm ibmc --help查看

接着使用ibmc安装COS插件:helm ibmc install ibm-object-storage-plugin ./ibm-object-storage-plugin --set license=true

装完查看plugin是否安装成功:kubectl get pod --all-namespaces -o wide | grep object

同时也检查集群中的存储类:kubectl get storageclass | grep s3

下一步我们来看看怎么使用存储类,有两种方式,一种是动态部署,另一种是静态部署。

首先做一个动态部署,需要先建一个虚拟持久卷PVC,可以参考下面的内容创建个yaml文件,使用的存储类ibmc-s3fs-standard-cross-region对应的是COS标准类型,跨区域:美国南部(达拉斯)。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-den
  namespace: default
  labels:
    nginx: k8s
  annotations:
    ibm.io/auto-create-bucket: "true"
    ibm.io/auto-delete-bucket: "false"
    ibm.io/bucket: "nginx-den"
    ibm.io/secret-name: "cos-write-access"
    ibm.io/endpoint: "https://s3.us-south.cloud-object-storage.appdomain.cloud"
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: ibmc-s3fs-standard-cross-region

然后使用命令:kubectl create -f mypvc.yaml

完成后可以看到创建的PVC

随后我们建个deployment挂上这个PVC,可以创建个mydeploy.yaml文件,内容如下。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
      volumes:
      - name: www
        persistentVolumeClaim:
          claimName: pvc-den

 执行:kubectl create -f mydeploy.ymal,并查看:kubectl get pod |grep nginx

我们试着进一个pod然后在/usr/share/nginx/html中创建个文件。

1. kubectl exec -it nginx-deployment-6ccd459ddb-87s8f -- /bin/bash

2. cd /usr/share/nginx/html

3. echo "welcome" > index.html

下一步我们回到对象存储管理页面进行验证,可以看到创建PV和PVC时,已经自动新建了一个跨区域的数据桶:nginx-den

 进入数据桶后也能看到刚才创建的文件:index.html

使用COS还可以在StatefulSet中挂载PVC和SC,你可以参考下面的yaml来试试吧

apiVersion: v1
kind: Service
metadata:
  name: nginx-01
  namespace: den-test
  labels:
    app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx-v01 # must match spec.template.metadata.labels and spec.selector.matchLabels in stateful set YAML
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web-v01
  namespace: den-test
spec:
  selector:
    matchLabels:
      app: nginx-v01 # must match spec.template.metadata.labels in stateful set YAML and metadata.labels in service YAML
  serviceName: "nginx-v01"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx-v01 # must match spec.selector.matchLabels in stateful set YAML and metadata.labels in service YAML
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: mypvc
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: mypvc
      annotations:
        ibm.io/auto-create-bucket: "true"
        ibm.io/auto-delete-bucket: "false"
        ibm.io/bucket: "den-nginx-bucket"
        ibm.io/secret-name: "cos-secret-den"
        volume.beta.kubernetes.io/storage-class: "ibmc-s3fs-standard-perf-cross-region"
        volume.beta.kubernetes.io/storage-provisioner: "ibm.io/ibmc-s3fs"
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "ibmc-s3fs-standard-perf-cross-region"
      resources:
        requests:
          storage: 2Gi

 到此,大家应该已经掌握了使用COS实现IKS跨区域的存储,我会在下一篇文章中继续介绍Portworx和使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值