近期在阿里云上部署OCP需要用到NAS,其中遇到NAS无法扩容的问题,在此简单笔记。
1、部署NAS
参照github.com\kubernetes-sigs\alibaba-cloud-csi-driver\docs\nas.md部署说明,需要执行以下步骤:
# kubectl create -f ./deploy/rbac.yaml
# kubectl create -f ./deploy/nas/nas-plugin.yaml
# kubectl create -f ./deploy/nas/nas-provisioner.yaml
执行完以上步骤,会在kube-system下面部署一个daemonset csi-plugin和一个deployment csi-provisioner。
这时还缺少SC,在github.com\kubernetes-sigs\alibaba-cloud-csi-driver\examples\nas\dynamic目录可以找到所需的SC文件,按需修改直接部署即可。
到此,通过创建PVC实现NAS申请已能够实现。
2 NAS扩容
在修改PVC进行扩容时却发现提示不支持,问题主要有两点,但阿里云官方文档当前未见详细说明。
(1)SC缺少allowVolumeExpansion: true字段,会提示“only dynamically provisioned pvc can be resized”,SC中加上即可。
(2)SC加上允许扩容后,PVC是可以被更新了,但等了很久发现实际容量并未被更新。排查如下:
检查源码github.com\kubernetes-sigs\alibaba-cloud-csi-driver\pkg\nas\controllerserver.go,发现是有扩容方法的。
func (cs *controllerServer) ControllerExpandVolume(ctx context.Context, req *csi.ControllerExpandVolumeRequest,
) (*csi.ControllerExpandVolumeResponse, error) {
log.Infof("ControllerExpandVolume: starting to expand nas volume with %v", req)
volSizeBytes := int64(req.GetCapacityRange().GetRequiredBytes())
pvObj, err := getPvObj(req.VolumeId)
if err != nil {
return nil, fmt.Errorf("ControllerExpandVolume: nas volume(%s) expand error: %s", req.VolumeId, err.Error())
}
if _, ok := pvObj.Spec.CSI.VolumeAttributes["volumeCapacity"]; ok {
err = setNasVolumeCapacityWithID(pvObj, cs.crdClient, volSizeBytes)
if err != nil {
log.Errorf("ControllerExpandVolume: nas volume(%s) expand error: %s", req.VolumeId, err.Error())
return nil, fmt.Errorf("ControllerExpandVolume: nas volume(%s) expand error: %s", req.VolumeId, err.Error())
}
log.Infof("ControllerExpandVolume: Successful expand nas quota volume(%s) to size %d", req.VolumeId, volSizeBytes)
} else if mountType, ok := pvObj.Spec.CSI.VolumeAttributes["mountType"]; ok && mountType == "losetup" {
log.Infof("ControllerExpandVolume: Successful expand nas losetup volume(%s) to size %d", req.VolumeId, volSizeBytes)
} else {
return nil, fmt.Errorf("ControllerExpandVolume: nas volume(%s) not support expand", req.VolumeId)
}
return &csi.ControllerExpandVolumeResponse{CapacityBytes: volSizeBytes, NodeExpansionRequired: true}, nil
}
检查Deployment日志,发现扩容逻辑未被触发(找不到任何日志)。
后来在alibaba-cloud-csi-driver\deploy\ack\upgrade\upgrade.md找到以下内容:
CSI-Plugin、CSI-Provisioner两个插件的阿里云发布镜像都是:acs/csi-plugin:{version},部署模板中的其他镜像说明如下:
acs/csi-node-driver-registrar:负责csi-plugin插件注册的sidecar容器;Refer
acs/csi-provisioner:数据卷动态创建的sidecar,负责调用CreateVolume等接口;Refer
acs/csi-attacher:数据卷挂载的sidecar,负责调用ControllerPublishVolume接口;Refer
acs/csi-resizer:数据卷扩容的sidecar,负责调用ControllerExpandVolume接口;Refer
acs/csi-snapshotter:数据卷快照sidecar,负责创建volumeSnapshotContent对象;Refer
acs/snapshot-controller:数据卷快照sidecar,负责调用CreateSnapshot接口;Refer
才发现想要调用ControllerExpandVolume接口是需要额外部署插件的,只是。。。(为何要隐藏的如此之深,一个NAS的扩容放到ACK的目录下),于是按图索骥,找到最新的镜像地址。

接下来呢,还需要找到部署的yaml,同样藏在ACK下面,alibaba-cloud-csi-driver\deploy\ack\csi-provisioner.yaml中间有一段。
- name: external-nas-resizer
image: registry.cn-hangzhou.aliyuncs.com/acs/csi-resizer:v1.1.0-7b30758-aliyun
args:
- "--v=5"
- "--csi-address=\$(ADDRESS)"
- "--leader-election"
env:
- name: ADDRESS
value: /var/lib/kubelet/csi-provisioner/nasplugin.csi.alibabacloud.com/csi.sock
imagePullPolicy: "Always"
volumeMounts:
- name: nas-provisioner-dir
mountPath: /var/lib/kubelet/csi-provisioner/nasplugin.csi.alibabacloud.com
更新了deployment中的yaml后部署会得到三个container,external-nas-provisioner、
external-nas-resizer、csi-provisioner。
至此,差不多是可以实现NAS扩容了,但也不是没有问题了,因为更新PVC后会发现并不是立即就能扩容成功,二是会看到一个message:
waiting for user to (re-)start a pod to finish file system resize of volume on mode
关于这一点,在文档里也能找到踪迹alibaba-cloud-csi-driver\docs\disk-resizer.md
// phase2: restart Pod, expand filesystem;
# kubectl delete pod dynamic-create-6d5dc9bb7d-lvhgz
pod "dynamic-create-6d5dc9bb7d-lvhgz" deleted
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-disk-new Bound pvc-8db30f1a-ad23-11e9-ae51-00163e105050 30Gi RWO alicloud-disk-expand 6m13s
# kubectl exec -ti dynamic-create-6d5dc9bb7d-5gzq2 df | grep data
/dev/vdd 30832548 45036 30771128 1% /data
意思是只有这个PVC被挂载到pod,且重启pod才会生效扩容操作。
至此,关于阿里云上部署NAS搞定了。
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我可以在Azure网站上部署RubyonRails吗? 最佳答案 还没有。目前仅支持.NET和PHP。 关于ruby-on-rails-RubyonRails可以部署在Azure网站上吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/12964010/
我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.
前置步骤我们都操作完了,这篇开始介绍jenkins的集成。话不多说,看操作1、登录进入jenkins后会让你选择安装插件,选择第一个默认的就行。安装完成后设置账号密码,重新登录。2、配置JDK和Git都需要执行路径,所以需要先把执行路径找到,先进入服务器的docker容器,2.1JDK的路径root@69eef9ee86cf:/usr/bin#echo$JAVA_HOME/usr/local/openjdk-82.2Git的路径root@69eef9ee86cf:/#whichgit/usr/bin/git3、先配置JDK和Git。点击:ManageJenkins>>GlobalToolCon
深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal
作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于