[root@master02 trident-installer]# ./tridentctl install --dry-run -n trident -d
DEBU Initialized logging. logLevel=debug
DEBU Running outside a pod, creating CLI-based client.
DEBU Initialized Kubernetes CLI client. cli=oc flavor=openshift <span class="hljs-keyword">namespace</span>=trident version=<span class="hljs-number">1.11</span><span class="hljs-number">.0</span>+d4cacc0
DEBU Validated installation environment. installationNamespace=trident kubernetesVersion=
DEBU Deleted Kubernetes configmap. label=<span class="hljs-string">"app=trident-installer.netapp.io"</span> <span class="hljs-keyword">namespace</span>=trident
DEBU Namespace exists. <span class="hljs-keyword">namespace</span>=trident
DEBU Deleted Kubernetes object by YAML.
DEBU Deleted installer cluster role binding.
DEBU Deleted Kubernetes object by YAML.
DEBU Deleted installer cluster role.
DEBU Deleted Kubernetes object by YAML.
DEBU Deleted installer service account.
DEBU Removed security context constraint user. scc=privileged user=trident-installer
DEBU Created Kubernetes object by YAML.
INFO Created installer service account. serviceaccount=trident-installer
DEBU Created Kubernetes object by YAML.
INFO Created installer cluster role. clusterrole=trident-installer
DEBU Created Kubernetes object by YAML.
INFO Created installer cluster role binding. clusterrolebinding=trident-installer
INFO Added security context constraint user. scc=privileged user=trident-installer
DEBU Created Kubernetes configmap from directory. label=<span class="hljs-string">"app=trident-installer.netapp.io"</span> name=trident-installer <span class="hljs-keyword">namespace</span>=trident path=/root/trident-installer/setup
INFO Created installer configmap. configmap=trident-installer
DEBU Created Kubernetes object by YAML.
INFO Created installer pod. pod=trident-installer
INFO Waiting <span class="hljs-keyword">for</span> Trident installer pod to start.
DEBU Trident installer pod <span class="hljs-keyword">not</span> yet started, waiting. increment=<span class="hljs-number">280.357322</span>ms message=<span class="hljs-string">"pod not yet started (Pending)"</span>
DEBU Trident installer pod <span class="hljs-keyword">not</span> yet started, waiting. increment=<span class="hljs-number">523.702816</span>ms message=<span class="hljs-string">"pod not yet started (Pending)"</span>
DEBU Trident installer pod <span class="hljs-keyword">not</span> yet started, waiting. increment=<span class="hljs-number">914.246751</span>ms message=<span class="hljs-string">"pod not yet started (Pending)"</span>
DEBU Trident installer pod <span class="hljs-keyword">not</span> yet started, waiting. increment=<span class="hljs-number">1.111778662</span>s message=<span class="hljs-string">"pod not yet started (Pending)"</span>
DEBU Pod started. phase=Succeeded
INFO Trident installer pod started. <span class="hljs-keyword">namespace</span>=trident pod=trident-installer
DEBU Getting logs. cmd=<span class="hljs-string">"oc --namespace=trident logs trident-installer -f"</span>
DEBU Initialized logging. logLevel=debug
DEBU Running in a pod, creating API-based client. <span class="hljs-keyword">namespace</span>=trident
DEBU Initialized Kubernetes API client. cli=oc flavor=openshift <span class="hljs-keyword">namespace</span>=trident version=v1<span class="hljs-number">.11</span><span class="hljs-number">.0</span>+d4cacc0
DEBU Validated installation environment. installationNamespace=trident kubernetesVersion=v1<span class="hljs-number">.11</span><span class="hljs-number">.0</span>+d4cacc0
DEBU Parsed requested volume size. quantity=<span class="hljs-number">2</span>Gi
DEBU Dumping RBAC fields. ucpBearerToken= ucpHost= useKubernetesRBAC=<span class="hljs-literal">true</span>
DEBU Namespace exists. <span class="hljs-keyword">namespace</span>=trident
DEBU PVC does <span class="hljs-keyword">not</span> exist. pvc=trident
DEBU PV does <span class="hljs-keyword">not</span> exist. pv=trident
INFO Starting storage driver. backend=/setup/backend.json
DEBU config: {<span class="hljs-string">"Endpoint"</span>:<span class="hljs-string">"https://admin:root1234@99.248.106.82/json-rpc/11.0"</span>,<span class="hljs-string">"InitiatorIFace"</span>:<span class="hljs-string">"default"</span>,<span class="hljs-string">"SVIP"</span>:<span class="hljs-string">"99.248.82.55:3260"</span>,<span class="hljs-string">"TenantName"</span>:<span class="hljs-string">"trident"</span>,<span class="hljs-string">"Types"</span>:[{<span class="hljs-string">"Qos"</span>:{<span class="hljs-string">"burstIOPS"</span>:<span class="hljs-number">4000</span>,<span class="hljs-string">"maxIOPS"</span>:<span class="hljs-number">2000</span>,<span class="hljs-string">"minIOPS"</span>:<span class="hljs-number">1000</span>},<span class="hljs-string">"Type"</span>:<span class="hljs-string">"Bronze"</span>},{<span class="hljs-string">"Qos"</span>:{<span class="hljs-string">"burstIOPS"</span>:<span class="hljs-number">8000</span>,<span class="hljs-string">"maxIOPS"</span>:<span class="hljs-number">6000</span>,<span class="hljs-string">"minIOPS"</span>:<span class="hljs-number">4000</span>},<span class="hljs-string">"Type"</span>:<span class="hljs-string">"Silver"</span>},{<span class="hljs-string">"Qos"</span>:{<span class="hljs-string">"burstIOPS"</span>:<span class="hljs-number">10000</span>,<span class="hljs-string">"maxIOPS"</span>:<span class="hljs-number">8000</span>,<span class="hljs-string">"minIOPS"</span>:<span class="hljs-number">6000</span>},<span class="hljs-string">"Type"</span>:<span class="hljs-string">"Gold"</span>}],<span class="hljs-string">"UseCHAP"</span>:<span class="hljs-literal">true</span>,<span class="hljs-string">"storageDriverName"</span>:<span class="hljs-string">"solidfire-san"</span>,<span class="hljs-string">"version"</span>:<span class="hljs-number">1</span>}
DEBU Storage prefix is absent, will use <span class="hljs-keyword">default</span> prefix.
DEBU Parsed commonConfig: {Version:<span class="hljs-number">1</span> StorageDriverName:solidfire-san BackendName: Debug:<span class="hljs-literal">false</span> DebugTraceFlags:<span class="hljs-built_in">map</span>[] DisableDelete:<span class="hljs-literal">false</span> StoragePrefixRaw:[] StoragePrefix:<nil> SerialNumbers:[] DriverContext: LimitVolumeSize:}
DEBU Initializing storage driver. driver=solidfire-san
DEBU Configuration defaults Size=<span class="hljs-number">1</span>G StoragePrefix= UseCHAP=<span class="hljs-literal">true</span>
DEBU Parsed into solidfireConfig DisableDelete=<span class="hljs-literal">false</span> StorageDriverName=solidfire-san Version=<span class="hljs-number">1</span>
DEBU Decoded to &{CommonStorageDriverConfig:<span class="hljs-number">0xc42064e0a0</span> TenantName:trident EndPoint:https:<span class="hljs-comment">//admin:root1234@99.248.106.82/json-rpc/11.0 SVIP:99.248.82.55:3260 InitiatorIFace:default Types:0xc4206d26e0 LegacyNamePrefix: AccessGroups:[] UseCHAP:true DefaultBlockSize:0 SolidfireStorageDriverConfigDefaults:{CommonStorageDriverConfigDefaults:{Size:1G}}} </span>
DEBU Set <span class="hljs-keyword">default</span> block size. defaultBlockSize=<span class="hljs-number">512</span>
DEBU Using SF API version from config file. version=<span class="hljs-number">11.0</span>
DEBU Initializing SolidFire API client. cfg=<span class="hljs-string">"{trident https://admin:root1234@99.248.106.82/json-rpc/11.0 99.248.82.55:3260 default 0xc4206d26e0 [] 512 map[]}"</span> endpoint=<span class="hljs-string">"https://admin:root1234@99.248.106.82/json-rpc/11.0"</span> svip=<span class="hljs-string">"99.248.82.55:3260"</span>
ERRO Error detected in API response. ID=<span class="hljs-number">637</span> code=<span class="hljs-number">500</span> message=xUnknownAccount name=xUnknownAccount
DEBU Account <span class="hljs-keyword">not</span> found, creating. error=<span class="hljs-string">"device API error: xUnknownAccount"</span> tenantName=trident
DEBU Created account. accountID=<span class="hljs-number">0</span> tenantName=trident
DEBU SolidFire driver initialized. AccountID=<span class="hljs-number">2</span> InitiatorIFace=<span class="hljs-keyword">default</span>
DEBU Using CHAP, skipped Volume Access Group logic. AccessGroups=<span class="hljs-string">"[]"</span> SVIP=<span class="hljs-string">"99.248.82.55:3260"</span> UseCHAP=<span class="hljs-literal">true</span> driver=solidfire-san
DEBU Added pool <span class="hljs-keyword">for</span> SolidFire backend. attributes=<span class="hljs-string">"map[media:{Offers: ssd} IOPS:{Min: 1000, Max: 2000} snapshots:{Offer: true} clones:{Offer: true} encryption:{Offer: false} provisioningType:{Offers: thin} backendType:{Offers: solidfire-san}]"</span> backend=solidfire_99<span class="hljs-number">.248</span><span class="hljs-number">.82</span><span class="hljs-number">.55</span> pool=Bronze
DEBU Added pool <span class="hljs-keyword">for</span> SolidFire backend. attributes=<span class="hljs-string">"map[clones:{Offer: true} encryption:{Offer: false} provisioningType:{Offers: thin} backendType:{Offers: solidfire-san} media:{Offers: ssd} IOPS:{Min: 4000, Max: 6000} snapshots:{Offer: true}]"</span> backend=solidfire_99<span class="hljs-number">.248</span><span class="hljs-number">.82</span><span class="hljs-number">.55</span> pool=Silver
DEBU Added pool <span class="hljs-keyword">for</span> SolidFire backend. attributes=<span class="hljs-string">"map[snapshots:{Offer: true} clones:{Offer: true} encryption:{Offer: false} provisioningType:{Offers: thin} backendType:{Offers: solidfire-san} media:{Offers: ssd} IOPS:{Min: 6000, Max: 8000}]"</span> backend=solidfire_99<span class="hljs-number">.248</span><span class="hljs-number">.82</span><span class="hljs-number">.55</span> pool=Gold
DEBU Storage driver initialized. driver=solidfire-san
INFO Storage driver loaded. driver=solidfire-san
INFO Dry run completed, no problems found.
DEBU Received EOF from pod logs. container= pod=trident-installer
INFO Waiting <span class="hljs-keyword">for</span> Trident installer pod to finish.
DEBU Pod finished. phase=Succeeded
INFO Trident installer pod finished. <span class="hljs-keyword">namespace</span>=trident pod=trident-installer
DEBU Deleted Kubernetes pod. label=<span class="hljs-string">"app=trident-installer.netapp.io"</span> <span class="hljs-keyword">namespace</span>=trident
INFO Deleted installer pod. pod=trident-installer
DEBU Deleted Kubernetes configmap. label=<span class="hljs-string">"app=trident-installer.netapp.io"</span> <span class="hljs-keyword">namespace</span>=trident
INFO Deleted installer configmap. configmap=trident-installer
INFO In-cluster installation completed.
DEBU Deleted Kubernetes object by YAML.
INFO Deleted installer cluster role binding.
DEBU Deleted Kubernetes object by YAML.
INFO Deleted installer cluster role.
DEBU Deleted Kubernetes object by YAML.
INFO Deleted installer service account.
INFO Removed security context constraint user. scc=privileged user=trident-installer
- 正式安装
$ ./tridentctl install -n trident
该步骤是真正的执行。会创建serviceaccount, clusterrolebinding,configmap配置,trident-install pod(该pod在部署完trident deployment后会删除)等, 并会创建一个pv与trident pvc进行初始化操作,最终会创建trident deployment,完成trident的安装。
- trident的安装支持自定义一些配置。
- --etcd-image可指定etcd的镜像(默认是quay.io/coreos/etcd,下载会比较慢)
- --trident-image指定trident的镜像
- --volume-size指定trident持久存储的大小(默认为2GiB)
- --volume-name指定volume名字(默认是etcd-vol)
- --pv指定pv名字(默认是trident)
- --pvc指定pvc名字(默认是trident)
- --generate-custom-yaml将使用的所有配置进行导出到一个setup文件夹,不会对集群做任何操作
- --use-custom-yaml安装setup下的所有yaml文件进行部署trident
以下是执行的日志
[root@master02 trident-installer]# ./tridentctl install -n trident
INFO Created installer service account. serviceaccount=trident-installer
INFO Created installer cluster role. clusterrole=trident-installer
INFO Created installer cluster role binding. clusterrolebinding=trident-installer
INFO Added security context constraint user. scc=privileged user=trident-installer
INFO Created installer configmap. configmap=trident-installer
INFO Created installer pod. pod=trident-installer
INFO Waiting <span class="hljs-keyword">for</span> Trident installer pod to start.
INFO Trident installer pod started. <span class="hljs-keyword">namespace</span>=trident pod=trident-installer
INFO Starting storage driver. backend=/setup/backend.json
INFO Storage driver loaded. driver=solidfire-san
INFO Starting Trident installation. <span class="hljs-keyword">namespace</span>=trident
INFO Created service account.
INFO Created cluster role.
INFO Created cluster role binding.
INFO Added security context constraint user. scc=anyuid user=trident
INFO Created PVC.
INFO Controller serial numbers. serialNumbers=<span class="hljs-string">"4BZXJB2,85Q8JB2,4BXXJB2,4BXTJB2"</span>
INFO Created iSCSI CHAP secret. secret=trident-chap-solidfire<span class="hljs-number">-99</span><span class="hljs-number">-248</span><span class="hljs-number">-82</span><span class="hljs-number">-55</span>-trident
INFO Created PV. pv=trident
INFO Waiting <span class="hljs-keyword">for</span> PVC to be bound. pvc=trident
INFO Created Trident deployment.
INFO Waiting <span class="hljs-keyword">for</span> Trident pod to start.
INFO Trident pod started. <span class="hljs-keyword">namespace</span>=trident pod=trident<span class="hljs-number">-57</span>ccdff48f-gtflx
INFO Waiting <span class="hljs-keyword">for</span> Trident REST interface.
INFO Trident REST interface is up. version=<span class="hljs-number">18.10</span><span class="hljs-number">.0</span>
INFO Trident installation succeeded.
INFO Waiting <span class="hljs-keyword">for</span> Trident installer pod to finish.
INFO Trident installer pod finished. <span class="hljs-keyword">namespace</span>=trident pod=trident-installer
INFO Deleted installer pod. pod=trident-installer
INFO Deleted installer configmap. configmap=trident-installer
INFO In-cluster installation completed.
INFO Deleted installer cluster role binding.
INFO Deleted installer cluster role.
INFO Deleted installer service account.
INFO Removed security context constraint user. scc=privileged user=trident-installer
- 执行完install后,trident并不会安装之前配置的backend,需要另外再单独添加。(个人觉得netapp这点考虑得有点多余,因为dry-run的时候已经对backend.json作了检查了,直接install将它添加上岂不是更方便)
$ ./tridentctl -n trident create backend -f setup/backend.json
$ ./tridentctl -n trident get backend
+------------------------+----------------+--------+---------+
<span class="hljs-params">| NAME |</span> STORAGE DRIVER <span class="hljs-params">| ONLINE |</span> VOLUMES <span class="hljs-params">|
+------------------------+----------------+--------+---------+
|</span> solidfire_99.<span class="hljs-number">248.82</span>.<span class="hljs-number">55</span> <span class="hljs-params">| solidfire-san |</span> <span class="hljs-literal">true</span> <span class="hljs-params">| 0 |</span>
+------------------------+----------------+--------+---------+
- 添加基本的storageclass
将sample-input/storage-class-basic.yaml.templ中的BACKEND_TYPE用指定的backend中的STORAGE DRIVER值替换(此例中为solidfire-san)
$ cat sample-input/storage-<span class="hljs-class"><span class="hljs-keyword">class</span>-<span class="hljs-title">basic</span>.<span class="hljs-title">yaml</span>.<span class="hljs-title">templ</span></span>
<span class="hljs-symbol">apiVersion:</span> storage.k8s.io/v1
<span class="hljs-symbol">kind:</span> StorageClass
<span class="hljs-symbol">metadata:</span>
<span class="hljs-symbol">name:</span> basic
<span class="hljs-symbol">provisioner:</span> netapp.io/trident
<span class="hljs-symbol">parameters:</span>
<span class="hljs-symbol">backendType:</span> <span class="hljs-string">"__BACKEND_TYPE__"</span>
$ sed <span class="hljs-string">"s/__BACKEND_TYPE__/solidfire-san/"</span> sample-input/storage-<span class="hljs-class"><span class="hljs-keyword">class</span>-<span class="hljs-title">basic</span>.<span class="hljs-title">yaml</span>.<span class="hljs-title">templ</span> | <span class="hljs-title">oc</span> <span class="hljs-title">create</span> -<span class="hljs-title">f</span> -</span>
- 根据backend中的Type创建对应的storageclass
$ cat storage-<span class="hljs-class"><span class="hljs-keyword">class</span>-<span class="hljs-title">gold</span>.<span class="hljs-title">yaml</span></span>
<span class="hljs-symbol">apiVersion:</span> storage.k8s.io/v1
<span class="hljs-symbol">kind:</span> StorageClass
<span class="hljs-symbol">metadata:</span>
<span class="hljs-symbol">name:</span> gold
<span class="hljs-symbol">annotations:</span>
storageclass.kubernetes.io/is-default-<span class="hljs-class"><span class="hljs-keyword">class</span>: "<span class="hljs-title">true</span>"</span>
<span class="hljs-symbol">provisioner:</span> netapp.io/trident
<span class="hljs-symbol">parameters:</span>
<span class="hljs-symbol">storagePools:</span> <span class="hljs-string">"solidfire_99.248.82.55:Gold"</span> <span class="hljs-comment"># solidfire_99.248.82.55为backend name;Gold为指定的Type</span>
$ oc create -f storage-<span class="hljs-class"><span class="hljs-keyword">class</span>-<span class="hljs-title">gold</span>.<span class="hljs-title">yaml</span></span>
查看当前的storageclass
$ oc get sc
NAME PROVISIONER AGE
basic netapp.io/trident <span class="hljs-number">2</span><span class="hljs-function">h
<span class="hljs-title">gold</span> <span class="hljs-params">(<span class="hljs-keyword">default</span>)</span> netapp.io/trident 1h
</span>
使用:创建PVC
- 创建第一个PVC
$ cat test-pvc.yaml
<span class="hljs-symbol">apiVersion:</span> v1
<span class="hljs-symbol">kind:</span> PersistentVolumeClaim
<span class="hljs-symbol">metadata:</span>
<span class="hljs-symbol">annotations:</span>
volume.beta.kubernetes.io/storage-<span class="hljs-class"><span class="hljs-keyword">class</span>: <span class="hljs-title">gold</span></span>
volume.beta.kubernetes.io/storage-<span class="hljs-symbol">provisioner:</span> netapp.io/trident
trident.netapp.io/<span class="hljs-symbol">reclaimPolicy:</span> <span class="hljs-string">"Retain"</span>
<span class="hljs-symbol">name:</span> testpvc
<span class="hljs-symbol">namespace:</span> test
<span class="hljs-symbol">spec:</span>
<span class="hljs-symbol">accessModes:</span>
- ReadWriteOnce
<span class="hljs-symbol">resources:</span>
<span class="hljs-symbol">requests:</span>
<span class="hljs-symbol">storage:</span> <span class="hljs-number">1</span>Gi
$ oc create -f test-pvc.yaml
PVC创建的说明:
- volume.beta.kubernetes.io/storage-class为10,11步创建的storageclass
- volume.beta.kubernetes.io/storage-provisioner指定为netapp的trident
- trident.netapp.io/reclaimPolicy指定创建PV的reclaimPolicy,默认为"Delete",支持"Delete"和"Retain",不支持"Recycle"
- accessModes因SolidFire是块存储,只支持ReadWriteOnce
SolidFire功能测试
快照恢复数据
创建快照

创建快照