2020-06-19 14:52:56 +08:00
<!DOCTYPE HTML>
< html lang = "zh-hans" >
< head >
< meta charset = "UTF-8" >
< meta content = "text/html; charset=utf-8" http-equiv = "Content-Type" >
< title > 在 OpenShift 中使用 GlusterFS 做持久化存储 · Kubernetes Handbook - Kubernetes中文指南/云原生应用架构实践手册 by Jimmy Song(宋净超)< / title >
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" / >
< meta name = "description" content = "" >
< meta name = "generator" content = "GitBook 3.2.3" >
< meta name = "author" content = "Jimmy Song( 宋净超) " >
< link rel = "stylesheet" href = "../gitbook/style.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-splitter/splitter.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-page-toc-button/plugin.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-image-captions/image-captions.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-back-to-top-button/plugin.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-search-plus/search.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-tbfed-pagefooter/footer.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-prism/prism-ghcolors.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-lightbox/css/lightbox.min.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-alerts/style.css" >
< link rel = "stylesheet" href = "../gitbook/gitbook-plugin-fontsettings/website.css" >
< meta name = "HandheldFriendly" content = "true" / >
< meta name = "viewport" content = "width=device-width, initial-scale=1, user-scalable=no" >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "apple-mobile-web-app-status-bar-style" content = "black" >
< link rel = "apple-touch-icon-precomposed" sizes = "152x152" href = "../gitbook/images/apple-touch-icon-precomposed-152.png" >
< link rel = "shortcut icon" href = "../gitbook/images/favicon.ico" type = "image/x-icon" >
< link rel = "next" href = "glusterd-2.0.html" / >
< link rel = "prev" href = "using-heketi-gluster-for-persistent-storage.html" / >
< link rel = "shortcut icon" href = '../favicon.ico' type = "image/x-icon" >
< link rel = "bookmark" href = '../favicon.ico' type = "image/x-icon" >
< style >
@media only screen and (max-width: 640px) {
.book-header .hidden-mobile {
display: none;
}
}
< / style >
< script >
window["gitbook-plugin-github-buttons"] = {"repo":"rootsongjc/kubernetes-handbook","types":["star"],"size":"small"};
< / script >
< / head >
< body >
< div class = "book" >
< div class = "book-summary" >
< div id = "book-search-input" role = "search" >
< input type = "text" placeholder = "输入并搜索" / >
< / div >
< nav role = "navigation" >
< ul class = "summary" >
< li >
< a href = "https://jimmysong.io" target = "_blank" class = "custom-link" > 回到主页< / a >
< / li >
< li >
< a href = "https://jimmysong.io/awesome-cloud-native" target = "_blank" class = "custom-link" > Awesome Cloud Native< / a >
< / li >
< li >
< a href = "https://cloudnative.to" target = "_blank" class = "custom-link" > 云原生社区< / a >
< / li >
< li >
< a href = "https://cloudnativeindustryalliance.github.io/whitepaper2020/" target = "_blank" class = "custom-link" > 中国云原生发展白皮书2020< / a >
< / li >
< li >
< a href = "https://jimmysong.io/guide-to-cloud-native-app/" target = "_blank" class = "custom-link" > 云原生应用白皮书< / a >
< / li >
< li class = "divider" > < / li >
< li class = "header" > 前言< / li >
< li class = "chapter " data-level = "1.1" data-path = "../" >
< a href = "../" >
< b > 1.1.< / b >
序言
< / a >
< / li >
< li class = "header" > 云原生< / li >
< li class = "chapter " data-level = "2.1" data-path = "../cloud-native/cloud-native-definition.html" >
< a href = "../cloud-native/cloud-native-definition.html" >
< b > 2.1.< / b >
云原生( Cloud Native) 的定义
< / a >
< / li >
< li class = "chapter " data-level = "2.2" data-path = "../cloud-native/cloud-native-philosophy.html" >
< a href = "../cloud-native/cloud-native-philosophy.html" >
< b > 2.2.< / b >
云原生的设计哲学
< / a >
< / li >
< li class = "chapter " data-level = "2.3" data-path = "../cloud-native/play-with-kubernetes.html" >
< a href = "../cloud-native/play-with-kubernetes.html" >
< b > 2.3.< / b >
Play with Kubernetes
< / a >
< / li >
< li class = "chapter " data-level = "2.4" data-path = "../cloud-native/cloud-native-local-quick-start.html" >
< a href = "../cloud-native/cloud-native-local-quick-start.html" >
< b > 2.4.< / b >
快速部署一个云原生本地实验环境
< / a >
< / li >
< li class = "chapter " data-level = "2.5" data-path = "../cloud-native/setup-kubernetes-with-rancher-and-aliyun.html" >
< a href = "../cloud-native/setup-kubernetes-with-rancher-and-aliyun.html" >
< b > 2.5.< / b >
使用 Rancher 在阿里云上部署 Kubenretes 集群
< / a >
< / li >
< li class = "chapter " data-level = "2.6" data-path = "../cloud-native/kubernetes-and-cloud-native-app-overview.html" >
< a href = "../cloud-native/kubernetes-and-cloud-native-app-overview.html" >
< b > 2.6.< / b >
Kubernetes 与云原生应用概览
< / a >
< / li >
< li class = "chapter " data-level = "2.7" data-path = "../cloud-native/from-kubernetes-to-cloud-native.html" >
< a href = "../cloud-native/from-kubernetes-to-cloud-native.html" >
< b > 2.7.< / b >
云原生应用之路 —— 从 Kubernetes 到 Cloud Native
< / a >
< / li >
< li class = "chapter " data-level = "2.8" data-path = "../cloud-native/cloud-native-programming-languages.html" >
< a href = "../cloud-native/cloud-native-programming-languages.html" >
< b > 2.8.< / b >
云原生编程语言
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "2.8.1" data-path = "../cloud-native/cloud-native-programming-language-ballerina.html" >
< a href = "../cloud-native/cloud-native-programming-language-ballerina.html" >
< b > 2.8.1.< / b >
云原生编程语言 Ballerina
< / a >
< / li >
< li class = "chapter " data-level = "2.8.2" data-path = "../cloud-native/cloud-native-programming-language-pulumi.html" >
< a href = "../cloud-native/cloud-native-programming-language-pulumi.html" >
< b > 2.8.2.< / b >
云原生编程语言 Pulumi
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "2.9" data-path = "../cloud-native/the-future-of-cloud-native.html" >
< a href = "../cloud-native/the-future-of-cloud-native.html" >
< b > 2.9.< / b >
云原生的未来
< / a >
< / li >
< li class = "chapter " data-level = "2.10" data-path = "../cloud-native/define-cloud-native-app.html" >
< a href = "../cloud-native/define-cloud-native-app.html" >
< b > 2.10.< / b >
定义云原生应用
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "2.10.1" data-path = "../cloud-native/workload.html" >
< a href = "../cloud-native/workload.html" >
< b > 2.10.1.< / b >
Workload
< / a >
< / li >
< li class = "chapter " data-level = "2.10.2" data-path = "../cloud-native/component.html" >
< a href = "../cloud-native/component.html" >
< b > 2.10.2.< / b >
Component
< / a >
< / li >
< li class = "chapter " data-level = "2.10.3" data-path = "../cloud-native/trait.html" >
< a href = "../cloud-native/trait.html" >
< b > 2.10.3.< / b >
Trait
< / a >
< / li >
< li class = "chapter " data-level = "2.10.4" data-path = "../cloud-native/application-scope.html" >
< a href = "../cloud-native/application-scope.html" >
< b > 2.10.4.< / b >
Application Scope
< / a >
< / li >
< li class = "chapter " data-level = "2.10.5" data-path = "../cloud-native/application-configuration.html" >
< a href = "../cloud-native/application-configuration.html" >
< b > 2.10.5.< / b >
Application Configuration
< / a >
< / li >
< / ul >
< / li >
< li class = "header" > 概念与原理< / li >
< li class = "chapter " data-level = "3.1" data-path = "../concepts/" >
< a href = "../concepts/" >
< b > 3.1.< / b >
Kubernetes 架构
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.1.1" data-path = "../concepts/concepts.html" >
< a href = "../concepts/concepts.html" >
< b > 3.1.1.< / b >
设计理念
< / a >
< / li >
< li class = "chapter " data-level = "3.1.2" data-path = "../concepts/etcd.html" >
< a href = "../concepts/etcd.html" >
< b > 3.1.2.< / b >
Etcd 解析
< / a >
< / li >
< li class = "chapter " data-level = "3.1.3" data-path = "../concepts/open-interfaces.html" >
< a href = "../concepts/open-interfaces.html" >
< b > 3.1.3.< / b >
开放接口
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.1.3.1" data-path = "../concepts/cri.html" >
< a href = "../concepts/cri.html" >
< b > 3.1.3.1.< / b >
CRI - Container Runtime Interface( 容器运行时接口)
< / a >
< / li >
< li class = "chapter " data-level = "3.1.3.2" data-path = "../concepts/cni.html" >
< a href = "../concepts/cni.html" >
< b > 3.1.3.2.< / b >
CNI - Container Network Interface( 容器网络接口)
< / a >
< / li >
< li class = "chapter " data-level = "3.1.3.3" data-path = "../concepts/csi.html" >
< a href = "../concepts/csi.html" >
< b > 3.1.3.3.< / b >
CSI - Container Storage Interface( 容器存储接口)
< / a >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.2" data-path = "../concepts/networking.html" >
< a href = "../concepts/networking.html" >
< b > 3.2.< / b >
Kubernetes 中的网络
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.2.1" data-path = "../concepts/flannel.html" >
< a href = "../concepts/flannel.html" >
< b > 3.2.1.< / b >
Kubernetes 中的网络解析 —— 以 flannel 为例
< / a >
< / li >
< li class = "chapter " data-level = "3.2.2" data-path = "../concepts/calico.html" >
< a href = "../concepts/calico.html" >
< b > 3.2.2.< / b >
Kubernetes 中的网络解析 —— 以 calico 为例
< / a >
< / li >
< li class = "chapter " data-level = "3.2.3" data-path = "../concepts/cilium.html" >
< a href = "../concepts/cilium.html" >
< b > 3.2.3.< / b >
具备 API 感知的网络和安全性管理开源软件 Cilium
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.2.3.1" data-path = "../concepts/cilium-concepts.html" >
< a href = "../concepts/cilium-concepts.html" >
< b > 3.2.3.1.< / b >
Cilium 架构设计与概念解析
< / a >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.3" data-path = "../concepts/objects.html" >
< a href = "../concepts/objects.html" >
< b > 3.3.< / b >
资源对象与基本概念解析
< / a >
< / li >
< li class = "chapter " data-level = "3.4" data-path = "../concepts/pod-state-and-lifecycle.html" >
< a href = "../concepts/pod-state-and-lifecycle.html" >
< b > 3.4.< / b >
Pod 状态与生命周期管理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.4.1" data-path = "../concepts/pod-overview.html" >
< a href = "../concepts/pod-overview.html" >
< b > 3.4.1.< / b >
Pod 概览
< / a >
< / li >
< li class = "chapter " data-level = "3.4.2" data-path = "../concepts/pod.html" >
< a href = "../concepts/pod.html" >
< b > 3.4.2.< / b >
Pod 解析
< / a >
< / li >
< li class = "chapter " data-level = "3.4.3" data-path = "../concepts/init-containers.html" >
< a href = "../concepts/init-containers.html" >
< b > 3.4.3.< / b >
Init 容器
< / a >
< / li >
< li class = "chapter " data-level = "3.4.4" data-path = "../concepts/pause-container.html" >
< a href = "../concepts/pause-container.html" >
< b > 3.4.4.< / b >
Pause 容器
< / a >
< / li >
< li class = "chapter " data-level = "3.4.5" data-path = "../concepts/pod-security-policy.html" >
< a href = "../concepts/pod-security-policy.html" >
< b > 3.4.5.< / b >
Pod 安全策略
< / a >
< / li >
< li class = "chapter " data-level = "3.4.6" data-path = "../concepts/pod-lifecycle.html" >
< a href = "../concepts/pod-lifecycle.html" >
< b > 3.4.6.< / b >
Pod 的生命周期
< / a >
< / li >
< li class = "chapter " data-level = "3.4.7" data-path = "../concepts/pod-hook.html" >
< a href = "../concepts/pod-hook.html" >
< b > 3.4.7.< / b >
Pod Hook
< / a >
< / li >
< li class = "chapter " data-level = "3.4.8" data-path = "../concepts/pod-preset.html" >
< a href = "../concepts/pod-preset.html" >
< b > 3.4.8.< / b >
Pod Preset
< / a >
< / li >
< li class = "chapter " data-level = "3.4.9" data-path = "../concepts/pod-disruption-budget.html" >
< a href = "../concepts/pod-disruption-budget.html" >
< b > 3.4.9.< / b >
Pod 中断与 PDB( Pod 中断预算)
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.5" data-path = "../concepts/cluster.html" >
< a href = "../concepts/cluster.html" >
< b > 3.5.< / b >
集群资源管理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.5.1" data-path = "../concepts/node.html" >
< a href = "../concepts/node.html" >
< b > 3.5.1.< / b >
Node
< / a >
< / li >
< li class = "chapter " data-level = "3.5.2" data-path = "../concepts/namespace.html" >
< a href = "../concepts/namespace.html" >
< b > 3.5.2.< / b >
Namespace
< / a >
< / li >
< li class = "chapter " data-level = "3.5.3" data-path = "../concepts/label.html" >
< a href = "../concepts/label.html" >
< b > 3.5.3.< / b >
Label
< / a >
< / li >
< li class = "chapter " data-level = "3.5.4" data-path = "../concepts/annotation.html" >
< a href = "../concepts/annotation.html" >
< b > 3.5.4.< / b >
Annotation
< / a >
< / li >
< li class = "chapter " data-level = "3.5.5" data-path = "../concepts/taint-and-toleration.html" >
< a href = "../concepts/taint-and-toleration.html" >
< b > 3.5.5.< / b >
Taint 和 Toleration( 污点和容忍)
< / a >
< / li >
< li class = "chapter " data-level = "3.5.6" data-path = "../concepts/garbage-collection.html" >
< a href = "../concepts/garbage-collection.html" >
< b > 3.5.6.< / b >
垃圾收集
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.6" data-path = "../concepts/controllers.html" >
< a href = "../concepts/controllers.html" >
< b > 3.6.< / b >
控制器
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.6.1" data-path = "../concepts/deployment.html" >
< a href = "../concepts/deployment.html" >
< b > 3.6.1.< / b >
Deployment
< / a >
< / li >
< li class = "chapter " data-level = "3.6.2" data-path = "../concepts/statefulset.html" >
< a href = "../concepts/statefulset.html" >
< b > 3.6.2.< / b >
StatefulSet
< / a >
< / li >
< li class = "chapter " data-level = "3.6.3" data-path = "../concepts/daemonset.html" >
< a href = "../concepts/daemonset.html" >
< b > 3.6.3.< / b >
DaemonSet
< / a >
< / li >
< li class = "chapter " data-level = "3.6.4" data-path = "../concepts/replicaset.html" >
< a href = "../concepts/replicaset.html" >
< b > 3.6.4.< / b >
ReplicationController 和 ReplicaSet
< / a >
< / li >
< li class = "chapter " data-level = "3.6.5" data-path = "../concepts/job.html" >
< a href = "../concepts/job.html" >
< b > 3.6.5.< / b >
Job
< / a >
< / li >
< li class = "chapter " data-level = "3.6.6" data-path = "../concepts/cronjob.html" >
< a href = "../concepts/cronjob.html" >
< b > 3.6.6.< / b >
CronJob
< / a >
< / li >
< li class = "chapter " data-level = "3.6.7" data-path = "../concepts/horizontal-pod-autoscaling.html" >
< a href = "../concepts/horizontal-pod-autoscaling.html" >
< b > 3.6.7.< / b >
Horizontal Pod Autoscaling
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.6.7.1" data-path = "../concepts/custom-metrics-hpa.html" >
< a href = "../concepts/custom-metrics-hpa.html" >
< b > 3.6.7.1.< / b >
自定义指标 HPA
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.6.8" data-path = "../concepts/admission-controller.html" >
< a href = "../concepts/admission-controller.html" >
< b > 3.6.8.< / b >
准入控制器( Admission Controller)
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.7" data-path = "../concepts/service-discovery.html" >
< a href = "../concepts/service-discovery.html" >
< b > 3.7.< / b >
服务发现
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.7.1" data-path = "../concepts/service.html" >
< a href = "../concepts/service.html" >
< b > 3.7.1.< / b >
Service
< / a >
< / li >
< li class = "chapter " data-level = "3.7.2" data-path = "../concepts/ingress.html" >
< a href = "../concepts/ingress.html" >
< b > 3.7.2.< / b >
Ingress
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.7.2.1" data-path = "../concepts/traefik-ingress-controller.html" >
< a href = "../concepts/traefik-ingress-controller.html" >
< b > 3.7.2.1.< / b >
Traefik Ingress Controller
< / a >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.8" data-path = "../concepts/authentication-and-permission.html" >
< a href = "../concepts/authentication-and-permission.html" >
< b > 3.8.< / b >
身份与权限控制
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.8.1" data-path = "../concepts/serviceaccount.html" >
< a href = "../concepts/serviceaccount.html" >
< b > 3.8.1.< / b >
ServiceAccount
< / a >
< / li >
< li class = "chapter " data-level = "3.8.2" data-path = "../concepts/rbac.html" >
< a href = "../concepts/rbac.html" >
< b > 3.8.2.< / b >
RBAC—— 基于角色的访问控制
< / a >
< / li >
< li class = "chapter " data-level = "3.8.3" data-path = "../concepts/network-policy.html" >
< a href = "../concepts/network-policy.html" >
< b > 3.8.3.< / b >
NetworkPolicy
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.9" data-path = "../concepts/storage.html" >
< a href = "../concepts/storage.html" >
< b > 3.9.< / b >
存储
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.9.1" data-path = "../concepts/secret.html" >
< a href = "../concepts/secret.html" >
< b > 3.9.1.< / b >
Secret
< / a >
< / li >
< li class = "chapter " data-level = "3.9.2" data-path = "../concepts/configmap.html" >
< a href = "../concepts/configmap.html" >
< b > 3.9.2.< / b >
ConfigMap
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.9.2.1" data-path = "../concepts/configmap-hot-update.html" >
< a href = "../concepts/configmap-hot-update.html" >
< b > 3.9.2.1.< / b >
ConfigMap 的热更新
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.9.3" data-path = "../concepts/volume.html" >
< a href = "../concepts/volume.html" >
< b > 3.9.3.< / b >
Volume
< / a >
< / li >
< li class = "chapter " data-level = "3.9.4" data-path = "../concepts/persistent-volume.html" >
< a href = "../concepts/persistent-volume.html" >
< b > 3.9.4.< / b >
Persistent Volume( 持久化卷)
< / a >
< / li >
< li class = "chapter " data-level = "3.9.5" data-path = "../concepts/storageclass.html" >
< a href = "../concepts/storageclass.html" >
< b > 3.9.5.< / b >
Storage Class
< / a >
< / li >
< li class = "chapter " data-level = "3.9.6" data-path = "../concepts/local-persistent-storage.html" >
< a href = "../concepts/local-persistent-storage.html" >
< b > 3.9.6.< / b >
本地持久化存储
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.10" data-path = "../concepts/extension.html" >
< a href = "../concepts/extension.html" >
< b > 3.10.< / b >
集群扩展
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.10.1" data-path = "../concepts/custom-resource.html" >
< a href = "../concepts/custom-resource.html" >
< b > 3.10.1.< / b >
使用自定义资源扩展 API
< / a >
< / li >
< li class = "chapter " data-level = "3.10.2" data-path = "../concepts/crd.html" >
< a href = "../concepts/crd.html" >
< b > 3.10.2.< / b >
使用 CRD 扩展 Kubernetes API
< / a >
< / li >
< li class = "chapter " data-level = "3.10.3" data-path = "../concepts/aggregated-api-server.html" >
< a href = "../concepts/aggregated-api-server.html" >
< b > 3.10.3.< / b >
Aggregated API Server
< / a >
< / li >
< li class = "chapter " data-level = "3.10.4" data-path = "../concepts/apiservice.html" >
< a href = "../concepts/apiservice.html" >
< b > 3.10.4.< / b >
APIService
< / a >
< / li >
< li class = "chapter " data-level = "3.10.5" data-path = "../concepts/service-catalog.html" >
< a href = "../concepts/service-catalog.html" >
< b > 3.10.5.< / b >
Service Catalog
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "3.11" data-path = "../concepts/scheduling.html" >
< a href = "../concepts/scheduling.html" >
< b > 3.11.< / b >
资源调度
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "3.11.1" data-path = "../concepts/qos.html" >
< a href = "../concepts/qos.html" >
< b > 3.11.1.< / b >
QoS( 服务质量等级)
< / a >
< / li >
< / ul >
< / li >
< li class = "header" > 用户指南< / li >
< li class = "chapter " data-level = "4.1" data-path = "../guide/" >
< a href = "../guide/" >
< b > 4.1.< / b >
用户指南
< / a >
< / li >
< li class = "chapter " data-level = "4.2" data-path = "../guide/resource-configuration.html" >
< a href = "../guide/resource-configuration.html" >
< b > 4.2.< / b >
资源对象配置
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "4.2.1" data-path = "../guide/configure-liveness-readiness-probes.html" >
< a href = "../guide/configure-liveness-readiness-probes.html" >
< b > 4.2.1.< / b >
配置 Pod 的 liveness 和 readiness 探针
< / a >
< / li >
< li class = "chapter " data-level = "4.2.2" data-path = "../guide/configure-pod-service-account.html" >
< a href = "../guide/configure-pod-service-account.html" >
< b > 4.2.2.< / b >
配置 Pod 的 Service Account
< / a >
< / li >
< li class = "chapter " data-level = "4.2.3" data-path = "../guide/secret-configuration.html" >
< a href = "../guide/secret-configuration.html" >
< b > 4.2.3.< / b >
Secret 配置
< / a >
< / li >
< li class = "chapter " data-level = "4.2.4" data-path = "../guide/resource-quota-management.html" >
< a href = "../guide/resource-quota-management.html" >
< b > 4.2.4.< / b >
管理 namespace 中的资源配额
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "4.3" data-path = "../guide/command-usage.html" >
< a href = "../guide/command-usage.html" >
< b > 4.3.< / b >
命令使用
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "4.3.1" data-path = "../guide/docker-cli-to-kubectl.html" >
< a href = "../guide/docker-cli-to-kubectl.html" >
< b > 4.3.1.< / b >
Docker 用户过渡到 kubectl 命令行指南
< / a >
< / li >
< li class = "chapter " data-level = "4.3.2" data-path = "../guide/using-kubectl.html" >
< a href = "../guide/using-kubectl.html" >
< b > 4.3.2.< / b >
kubectl 命令概览
< / a >
< / li >
< li class = "chapter " data-level = "4.3.3" data-path = "../guide/kubectl-cheatsheet.html" >
< a href = "../guide/kubectl-cheatsheet.html" >
< b > 4.3.3.< / b >
kubectl 命令技巧大全
< / a >
< / li >
< li class = "chapter " data-level = "4.3.4" data-path = "../guide/using-etcdctl-to-access-kubernetes-data.html" >
< a href = "../guide/using-etcdctl-to-access-kubernetes-data.html" >
< b > 4.3.4.< / b >
使用 etcdctl 访问 kubernetes 数据
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "4.4" data-path = "../guide/cluster-security-management.html" >
< a href = "../guide/cluster-security-management.html" >
< b > 4.4.< / b >
集群安全性管理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "4.4.1" data-path = "../guide/managing-tls-in-a-cluster.html" >
< a href = "../guide/managing-tls-in-a-cluster.html" >
< b > 4.4.1.< / b >
管理集群中的 TLS
< / a >
< / li >
< li class = "chapter " data-level = "4.4.2" data-path = "../guide/kubelet-authentication-authorization.html" >
< a href = "../guide/kubelet-authentication-authorization.html" >
< b > 4.4.2.< / b >
kubelet 的认证授权
< / a >
< / li >
< li class = "chapter " data-level = "4.4.3" data-path = "../guide/tls-bootstrapping.html" >
< a href = "../guide/tls-bootstrapping.html" >
< b > 4.4.3.< / b >
TLS bootstrap
< / a >
< / li >
< li class = "chapter " data-level = "4.4.4" data-path = "../guide/kubectl-user-authentication-authorization.html" >
< a href = "../guide/kubectl-user-authentication-authorization.html" >
< b > 4.4.4.< / b >
创建用户认证授权的 kubeconfig 文件
< / a >
< / li >
< li class = "chapter " data-level = "4.4.5" data-path = "../guide/ip-masq-agent.html" >
< a href = "../guide/ip-masq-agent.html" >
< b > 4.4.5.< / b >
IP 伪装代理
< / a >
< / li >
< li class = "chapter " data-level = "4.4.6" data-path = "../guide/auth-with-kubeconfig-or-token.html" >
< a href = "../guide/auth-with-kubeconfig-or-token.html" >
< b > 4.4.6.< / b >
使用 kubeconfig 或 token 进行用户身份认证
< / a >
< / li >
< li class = "chapter " data-level = "4.4.7" data-path = "../guide/authentication.html" >
< a href = "../guide/authentication.html" >
< b > 4.4.7.< / b >
Kubernetes 中的用户与身份认证授权
< / a >
< / li >
< li class = "chapter " data-level = "4.4.8" data-path = "../guide/kubernetes-security-best-practice.html" >
< a href = "../guide/kubernetes-security-best-practice.html" >
< b > 4.4.8.< / b >
Kubernetes 集群安全性配置最佳实践
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "4.5" data-path = "../guide/access-kubernetes-cluster.html" >
< a href = "../guide/access-kubernetes-cluster.html" >
< b > 4.5.< / b >
访问 Kubernetes 集群
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "4.5.1" data-path = "../guide/access-cluster.html" >
< a href = "../guide/access-cluster.html" >
< b > 4.5.1.< / b >
访问集群
< / a >
< / li >
< li class = "chapter " data-level = "4.5.2" data-path = "../guide/authenticate-across-clusters-kubeconfig.html" >
< a href = "../guide/authenticate-across-clusters-kubeconfig.html" >
< b > 4.5.2.< / b >
使用 kubeconfig 文件配置跨集群认证
< / a >
< / li >
< li class = "chapter " data-level = "4.5.3" data-path = "../guide/connecting-to-applications-port-forward.html" >
< a href = "../guide/connecting-to-applications-port-forward.html" >
< b > 4.5.3.< / b >
通过端口转发访问集群中的应用程序
< / a >
< / li >
< li class = "chapter " data-level = "4.5.4" data-path = "../guide/service-access-application-cluster.html" >
< a href = "../guide/service-access-application-cluster.html" >
< b > 4.5.4.< / b >
使用 service 访问群集中的应用程序
< / a >
< / li >
< li class = "chapter " data-level = "4.5.5" data-path = "../guide/accessing-kubernetes-pods-from-outside-of-the-cluster.html" >
< a href = "../guide/accessing-kubernetes-pods-from-outside-of-the-cluster.html" >
< b > 4.5.5.< / b >
从外部访问 Kubernetes 中的 Pod
< / a >
< / li >
< li class = "chapter " data-level = "4.5.6" data-path = "../guide/cabin-mobile-dashboard-for-kubernetes.html" >
< a href = "../guide/cabin-mobile-dashboard-for-kubernetes.html" >
< b > 4.5.6.< / b >
Cabin - Kubernetes 手机客户端
< / a >
< / li >
< li class = "chapter " data-level = "4.5.7" data-path = "../guide/kubernetes-desktop-client.html" >
< a href = "../guide/kubernetes-desktop-client.html" >
< b > 4.5.7.< / b >
Kubernetic - Kubernetes 桌面客户端
< / a >
< / li >
< li class = "chapter " data-level = "4.5.8" data-path = "../guide/kubernator-kubernetes-ui.html" >
< a href = "../guide/kubernator-kubernetes-ui.html" >
< b > 4.5.8.< / b >
Kubernator - 更底层的 Kubernetes UI
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "4.6" data-path = "../guide/application-development-deployment-flow.html" >
< a href = "../guide/application-development-deployment-flow.html" >
< b > 4.6.< / b >
在 Kubernetes 中开发部署应用
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "4.6.1" data-path = "../guide/deploy-applications-in-kubernetes.html" >
< a href = "../guide/deploy-applications-in-kubernetes.html" >
< b > 4.6.1.< / b >
适用于 kubernetes 的应用开发部署流程
< / a >
< / li >
< li class = "chapter " data-level = "4.6.2" data-path = "../guide/migrating-hadoop-yarn-to-kubernetes.html" >
< a href = "../guide/migrating-hadoop-yarn-to-kubernetes.html" >
< b > 4.6.2.< / b >
迁移传统应用到 Kubernetes 中 —— 以 Hadoop YARN 为例
< / a >
< / li >
< li class = "chapter " data-level = "4.6.3" data-path = "../guide/using-statefulset.html" >
< a href = "../guide/using-statefulset.html" >
< b > 4.6.3.< / b >
使用 StatefulSet 部署用状态应用
< / a >
< / li >
< / ul >
< / li >
< li class = "header" > 最佳实践< / li >
< li class = "chapter " data-level = "5.1" data-path = "./" >
< a href = "./" >
< b > 5.1.< / b >
最佳实践概览
< / a >
< / li >
< li class = "chapter " data-level = "5.2" data-path = "install-kubernetes-on-centos.html" >
< a href = "install-kubernetes-on-centos.html" >
< b > 5.2.< / b >
在 CentOS 上部署 Kubernetes 集群
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.2.1" data-path = "create-tls-and-secret-key.html" >
< a href = "create-tls-and-secret-key.html" >
< b > 5.2.1.< / b >
创建 TLS 证书和秘钥
< / a >
< / li >
< li class = "chapter " data-level = "5.2.2" data-path = "create-kubeconfig.html" >
< a href = "create-kubeconfig.html" >
< b > 5.2.2.< / b >
创建 kubeconfig 文件
< / a >
< / li >
< li class = "chapter " data-level = "5.2.3" data-path = "etcd-cluster-installation.html" >
< a href = "etcd-cluster-installation.html" >
< b > 5.2.3.< / b >
创建高可用 etcd 集群
< / a >
< / li >
< li class = "chapter " data-level = "5.2.4" data-path = "kubectl-installation.html" >
< a href = "kubectl-installation.html" >
< b > 5.2.4.< / b >
安装 kubectl 命令行工具
< / a >
< / li >
< li class = "chapter " data-level = "5.2.5" data-path = "master-installation.html" >
< a href = "master-installation.html" >
< b > 5.2.5.< / b >
部署 master 节点
< / a >
< / li >
< li class = "chapter " data-level = "5.2.6" data-path = "flannel-installation.html" >
< a href = "flannel-installation.html" >
< b > 5.2.6.< / b >
安装 flannel 网络插件
< / a >
< / li >
< li class = "chapter " data-level = "5.2.7" data-path = "node-installation.html" >
< a href = "node-installation.html" >
< b > 5.2.7.< / b >
部署 node 节点
< / a >
< / li >
< li class = "chapter " data-level = "5.2.8" data-path = "kubedns-addon-installation.html" >
< a href = "kubedns-addon-installation.html" >
< b > 5.2.8.< / b >
安装 kubedns 插件
< / a >
< / li >
< li class = "chapter " data-level = "5.2.9" data-path = "dashboard-addon-installation.html" >
< a href = "dashboard-addon-installation.html" >
< b > 5.2.9.< / b >
安装 dashboard 插件
< / a >
< / li >
< li class = "chapter " data-level = "5.2.10" data-path = "heapster-addon-installation.html" >
< a href = "heapster-addon-installation.html" >
< b > 5.2.10.< / b >
安装 heapster 插件
< / a >
< / li >
< li class = "chapter " data-level = "5.2.11" data-path = "efk-addon-installation.html" >
< a href = "efk-addon-installation.html" >
< b > 5.2.11.< / b >
安装 EFK 插件
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.3" data-path = "install-kubernetes-with-kubeadm.html" >
< a href = "install-kubernetes-with-kubeadm.html" >
< b > 5.3.< / b >
生产级的 Kubernetes 简化管理工具 kubeadm
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.3.1" data-path = "install-kubernetes-on-ubuntu-server-16.04-with-kubeadm.html" >
< a href = "install-kubernetes-on-ubuntu-server-16.04-with-kubeadm.html" >
< b > 5.3.1.< / b >
使用 kubeadm 在 Ubuntu Server 16.04 上快速构建测试集群
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.4" data-path = "service-discovery-and-loadbalancing.html" >
< a href = "service-discovery-and-loadbalancing.html" >
< b > 5.4.< / b >
服务发现与负载均衡
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.4.1" data-path = "traefik-ingress-installation.html" >
< a href = "traefik-ingress-installation.html" >
< b > 5.4.1.< / b >
安装 Traefik ingress
< / a >
< / li >
< li class = "chapter " data-level = "5.4.2" data-path = "distributed-load-test.html" >
< a href = "distributed-load-test.html" >
< b > 5.4.2.< / b >
分布式负载测试
< / a >
< / li >
< li class = "chapter " data-level = "5.4.3" data-path = "network-and-cluster-perfermance-test.html" >
< a href = "network-and-cluster-perfermance-test.html" >
< b > 5.4.3.< / b >
网络和集群性能测试
< / a >
< / li >
< li class = "chapter " data-level = "5.4.4" data-path = "edge-node-configuration.html" >
< a href = "edge-node-configuration.html" >
< b > 5.4.4.< / b >
边缘节点配置
< / a >
< / li >
< li class = "chapter " data-level = "5.4.5" data-path = "nginx-ingress-installation.html" >
< a href = "nginx-ingress-installation.html" >
< b > 5.4.5.< / b >
安装 Nginx ingress
< / a >
< / li >
< li class = "chapter " data-level = "5.4.6" data-path = "dns-installation.html" >
< a href = "dns-installation.html" >
< b > 5.4.6.< / b >
安装配置 DNS
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.4.6.1" data-path = "configuring-dns.html" >
< a href = "configuring-dns.html" >
< b > 5.4.6.1.< / b >
安装配置 Kube-dns
< / a >
< / li >
< li class = "chapter " data-level = "5.4.6.2" data-path = "coredns.html" >
< a href = "coredns.html" >
< b > 5.4.6.2.< / b >
安装配置 CoreDNS
< / a >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.5" data-path = "operation.html" >
< a href = "operation.html" >
< b > 5.5.< / b >
运维管理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.5.1" data-path = "master-ha.html" >
< a href = "master-ha.html" >
< b > 5.5.1.< / b >
Master 节点高可用
< / a >
< / li >
< li class = "chapter " data-level = "5.5.2" data-path = "service-rolling-update.html" >
< a href = "service-rolling-update.html" >
< b > 5.5.2.< / b >
服务滚动升级
< / a >
< / li >
< li class = "chapter " data-level = "5.5.3" data-path = "app-log-collection.html" >
< a href = "app-log-collection.html" >
< b > 5.5.3.< / b >
应用日志收集
< / a >
< / li >
< li class = "chapter " data-level = "5.5.4" data-path = "configuration-best-practice.html" >
< a href = "configuration-best-practice.html" >
< b > 5.5.4.< / b >
配置最佳实践
< / a >
< / li >
< li class = "chapter " data-level = "5.5.5" data-path = "monitor.html" >
< a href = "monitor.html" >
< b > 5.5.5.< / b >
集群及应用监控
< / a >
< / li >
< li class = "chapter " data-level = "5.5.6" data-path = "data-persistence-problem.html" >
< a href = "data-persistence-problem.html" >
< b > 5.5.6.< / b >
数据持久化问题
< / a >
< / li >
< li class = "chapter " data-level = "5.5.7" data-path = "manage-compute-resources-container.html" >
< a href = "manage-compute-resources-container.html" >
< b > 5.5.7.< / b >
管理容器的计算资源
< / a >
< / li >
< li class = "chapter " data-level = "5.5.8" data-path = "federation.html" >
< a href = "federation.html" >
< b > 5.5.8.< / b >
集群联邦
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.6" data-path = "storage.html" >
< a href = "storage.html" >
< b > 5.6.< / b >
存储管理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.6.1" data-path = "glusterfs.html" >
< a href = "glusterfs.html" >
< b > 5.6.1.< / b >
GlusterFS
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.6.1.1" data-path = "using-glusterfs-for-persistent-storage.html" >
< a href = "using-glusterfs-for-persistent-storage.html" >
< b > 5.6.1.1.< / b >
使用 GlusterFS 做持久化存储
< / a >
< / li >
< li class = "chapter " data-level = "5.6.1.2" data-path = "using-heketi-gluster-for-persistent-storage.html" >
< a href = "using-heketi-gluster-for-persistent-storage.html" >
< b > 5.6.1.2.< / b >
使用 Heketi 作为 Kubernetes 的持久存储 GlusterFS 的 external provisioner
< / a >
< / li >
< li class = "chapter active" data-level = "5.6.1.3" data-path = "storage-for-containers-using-glusterfs-with-openshift.html" >
< a href = "storage-for-containers-using-glusterfs-with-openshift.html" >
< b > 5.6.1.3.< / b >
在 OpenShift 中使用 GlusterFS 做持久化存储
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.6.2" data-path = "glusterd-2.0.html" >
< a href = "glusterd-2.0.html" >
< b > 5.6.2.< / b >
GlusterD-2.0
< / a >
< / li >
< li class = "chapter " data-level = "5.6.3" data-path = "ceph.html" >
< a href = "ceph.html" >
< b > 5.6.3.< / b >
Ceph
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.6.3.1" data-path = "ceph-helm-install-guide-zh.html" >
< a href = "ceph-helm-install-guide-zh.html" >
< b > 5.6.3.1.< / b >
用 Helm 托管安装 Ceph 集群并提供后端存储
< / a >
< / li >
< li class = "chapter " data-level = "5.6.3.2" data-path = "using-ceph-for-persistent-storage.html" >
< a href = "using-ceph-for-persistent-storage.html" >
< b > 5.6.3.2.< / b >
使用 Ceph 做持久化存储
< / a >
< / li >
< li class = "chapter " data-level = "5.6.3.3" data-path = "rbd-provisioner.html" >
< a href = "rbd-provisioner.html" >
< b > 5.6.3.3.< / b >
使用 rbd-provisioner 提供 rbd 持久化存储
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.6.4" data-path = "openebs.html" >
< a href = "openebs.html" >
< b > 5.6.4.< / b >
OpenEBS
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.6.4.1" data-path = "using-openebs-for-persistent-storage.html" >
< a href = "using-openebs-for-persistent-storage.html" >
< b > 5.6.4.1.< / b >
使用 OpenEBS 做持久化存储
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.6.5" data-path = "rook.html" >
< a href = "rook.html" >
< b > 5.6.5.< / b >
Rook
< / a >
< / li >
< li class = "chapter " data-level = "5.6.6" data-path = "nfs.html" >
< a href = "nfs.html" >
< b > 5.6.6.< / b >
NFS
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.6.6.1" data-path = "using-nfs-for-persistent-storage.html" >
< a href = "using-nfs-for-persistent-storage.html" >
< b > 5.6.6.1.< / b >
利用 NFS 动态提供 Kubernetes 后端存储卷
< / a >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.7" data-path = "monitoring.html" >
< a href = "monitoring.html" >
< b > 5.7.< / b >
集群与应用监控
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.7.1" data-path = "heapster.html" >
< a href = "heapster.html" >
< b > 5.7.1.< / b >
Heapster
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.7.1.1" data-path = "using-heapster-to-get-object-metrics.html" >
< a href = "using-heapster-to-get-object-metrics.html" >
< b > 5.7.1.1.< / b >
使用 Heapster 获取集群和对象的 metric 数据
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.7.2" data-path = "prometheus.html" >
< a href = "prometheus.html" >
< b > 5.7.2.< / b >
Prometheus
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.7.2.1" data-path = "using-prometheus-to-monitor-kuberentes-cluster.html" >
< a href = "using-prometheus-to-monitor-kuberentes-cluster.html" >
< b > 5.7.2.1.< / b >
使用 Prometheus 监控 kubernetes 集群
< / a >
< / li >
< li class = "chapter " data-level = "5.7.2.2" data-path = "promql.html" >
< a href = "promql.html" >
< b > 5.7.2.2.< / b >
Prometheus 查询语言 PromQL 使用说明
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.7.3" data-path = "vistio-visualize-your-istio-mesh.html" >
< a href = "vistio-visualize-your-istio-mesh.html" >
< b > 5.7.3.< / b >
使用 Vistio 监控 Istio 服务网格中的流量
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.8" data-path = "distributed-tracing.html" >
< a href = "distributed-tracing.html" >
< b > 5.8.< / b >
分布式跟踪
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.8.1" data-path = "opentracing.html" >
< a href = "opentracing.html" >
< b > 5.8.1.< / b >
OpenTracing
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.9" data-path = "services-management-tool.html" >
< a href = "services-management-tool.html" >
< b > 5.9.< / b >
服务编排管理
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.9.1" data-path = "helm.html" >
< a href = "helm.html" >
< b > 5.9.1.< / b >
使用 Helm 管理 Kubernetes 应用
< / a >
< / li >
< li class = "chapter " data-level = "5.9.2" data-path = "create-private-charts-repo.html" >
< a href = "create-private-charts-repo.html" >
< b > 5.9.2.< / b >
构建私有 Chart 仓库
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.10" data-path = "ci-cd.html" >
< a href = "ci-cd.html" >
< b > 5.10.< / b >
持续集成与发布
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.10.1" data-path = "jenkins-ci-cd.html" >
< a href = "jenkins-ci-cd.html" >
< b > 5.10.1.< / b >
使用 Jenkins 进行持续集成与发布
< / a >
< / li >
< li class = "chapter " data-level = "5.10.2" data-path = "drone-ci-cd.html" >
< a href = "drone-ci-cd.html" >
< b > 5.10.2.< / b >
使用 Drone 进行持续集成与发布
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.11" data-path = "update-and-upgrade.html" >
< a href = "update-and-upgrade.html" >
< b > 5.11.< / b >
更新与升级
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.11.1" data-path = "manually-upgrade.html" >
< a href = "manually-upgrade.html" >
< b > 5.11.1.< / b >
手动升级 Kubernetes 集群
< / a >
< / li >
< li class = "chapter " data-level = "5.11.2" data-path = "dashboard-upgrade.html" >
< a href = "dashboard-upgrade.html" >
< b > 5.11.2.< / b >
升级 dashboard
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "5.12" data-path = "controller-extended.html" >
< a href = "controller-extended.html" >
< b > 5.12.< / b >
扩展控制器
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "5.12.1" data-path = "openkruise.html" >
< a href = "openkruise.html" >
< b > 5.12.1.< / b >
OpenKruise
< / a >
2020-06-22 17:07:42 +08:00
< ul class = "articles" >
< li class = "chapter " data-level = "5.12.1.1" data-path = "in-place-update.html" >
< a href = "in-place-update.html" >
< b > 5.12.1.1.< / b >
原地升级
< / a >
< / li >
< / ul >
2020-06-19 14:52:56 +08:00
< / li >
< / ul >
< / li >
< li class = "header" > 领域应用< / li >
< li class = "chapter " data-level = "6.1" data-path = "../usecases/" >
< a href = "../usecases/" >
< b > 6.1.< / b >
领域应用概览
< / a >
< / li >
< li class = "chapter " data-level = "6.2" data-path = "../usecases/microservices.html" >
< a href = "../usecases/microservices.html" >
< b > 6.2.< / b >
微服务架构
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.2.1" data-path = "../usecases/service-discovery-in-microservices.html" >
< a href = "../usecases/service-discovery-in-microservices.html" >
< b > 6.2.1.< / b >
微服务中的服务发现
< / a >
< / li >
< li class = "chapter " data-level = "6.2.2" data-path = "../usecases/microservices-for-java-developers.html" >
< a href = "../usecases/microservices-for-java-developers.html" >
< b > 6.2.2.< / b >
使用 Java 构建微服务并发布到 Kubernetes 平台
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.2.2.1" data-path = "../usecases/spring-boot-quick-start-guide.html" >
< a href = "../usecases/spring-boot-quick-start-guide.html" >
< b > 6.2.2.1.< / b >
Spring Boot 快速开始指南
< / a >
< / li >
< / ul >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.3" data-path = "../usecases/service-mesh.html" >
< a href = "../usecases/service-mesh.html" >
< b > 6.3.< / b >
Service Mesh 服务网格
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.3.1" data-path = "../usecases/the-enterprise-path-to-service-mesh-architectures.html" >
< a href = "../usecases/the-enterprise-path-to-service-mesh-architectures.html" >
< b > 6.3.1.< / b >
企业级服务网格架构
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.3.1.1" data-path = "../usecases/service-mesh-fundamental.html" >
< a href = "../usecases/service-mesh-fundamental.html" >
< b > 6.3.1.1.< / b >
Service Mesh 基础
< / a >
< / li >
< li class = "chapter " data-level = "6.3.1.2" data-path = "../usecases/comparing-service-mesh-technologies.html" >
< a href = "../usecases/comparing-service-mesh-technologies.html" >
< b > 6.3.1.2.< / b >
Service Mesh 技术对比
< / a >
< / li >
< li class = "chapter " data-level = "6.3.1.3" data-path = "../usecases/service-mesh-adoption-and-evolution.html" >
< a href = "../usecases/service-mesh-adoption-and-evolution.html" >
< b > 6.3.1.3.< / b >
采纳和演进
< / a >
< / li >
< li class = "chapter " data-level = "6.3.1.4" data-path = "../usecases/service-mesh-customization-and-integration.html" >
< a href = "../usecases/service-mesh-customization-and-integration.html" >
< b > 6.3.1.4.< / b >
定制和集成
< / a >
< / li >
< li class = "chapter " data-level = "6.3.1.5" data-path = "../usecases/service-mesh-conclusion.html" >
< a href = "../usecases/service-mesh-conclusion.html" >
< b > 6.3.1.5.< / b >
总结
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.3.2" data-path = "../usecases/istio.html" >
< a href = "../usecases/istio.html" >
< b > 6.3.2.< / b >
Istio
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.3.2.1" data-path = "../usecases/istio-installation.html" >
< a href = "../usecases/istio-installation.html" >
< b > 6.3.2.1.< / b >
安装并试用 Istio service mesh
< / a >
< / li >
< li class = "chapter " data-level = "6.3.2.2" data-path = "../usecases/sidecar-spec-in-istio.html" >
< a href = "../usecases/sidecar-spec-in-istio.html" >
< b > 6.3.2.2.< / b >
Istio 中 sidecar 的注入规范及示例
< / a >
< / li >
< li class = "chapter " data-level = "6.3.2.3" data-path = "../usecases/istio-community-tips.html" >
< a href = "../usecases/istio-community-tips.html" >
< b > 6.3.2.3.< / b >
如何参与 Istio 社区及注意事项
< / a >
< / li >
< li class = "chapter " data-level = "6.3.2.4" data-path = "../usecases/istio-tutorials-collection.html" >
< a href = "../usecases/istio-tutorials-collection.html" >
< b > 6.3.2.4.< / b >
Istio 免费学习资源汇总
< / a >
< / li >
< li class = "chapter " data-level = "6.3.2.5" data-path = "../usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html" >
< a href = "../usecases/understand-sidecar-injection-and-traffic-hijack-in-istio-service-mesh.html" >
< b > 6.3.2.5.< / b >
Sidecar 的注入与流量劫持
< / a >
< / li >
< li class = "chapter " data-level = "6.3.2.6" data-path = "../usecases/envoy-sidecar-routing-of-istio-service-mesh-deep-dive.html" >
< a href = "../usecases/envoy-sidecar-routing-of-istio-service-mesh-deep-dive.html" >
< b > 6.3.2.6.< / b >
Envoy Sidecar 代理的路由转发
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.3.3" data-path = "../usecases/linkerd.html" >
< a href = "../usecases/linkerd.html" >
< b > 6.3.3.< / b >
Linkerd
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.3.3.1" data-path = "../usecases/linkerd-user-guide.html" >
< a href = "../usecases/linkerd-user-guide.html" >
< b > 6.3.3.1.< / b >
Linkerd 使用指南
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.3.4" data-path = "../usecases/conduit.html" >
< a href = "../usecases/conduit.html" >
< b > 6.3.4.< / b >
Conduit
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.3.4.1" data-path = "../usecases/conduit-overview.html" >
< a href = "../usecases/conduit-overview.html" >
< b > 6.3.4.1.< / b >
Condiut 概览
< / a >
< / li >
< li class = "chapter " data-level = "6.3.4.2" data-path = "../usecases/conduit-installation.html" >
< a href = "../usecases/conduit-installation.html" >
< b > 6.3.4.2.< / b >
安装 Conduit
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.3.5" data-path = "../usecases/envoy.html" >
< a href = "../usecases/envoy.html" >
< b > 6.3.5.< / b >
Envoy
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.3.5.1" data-path = "../usecases/envoy-terminology.html" >
< a href = "../usecases/envoy-terminology.html" >
< b > 6.3.5.1.< / b >
Envoy 的架构与基本术语
< / a >
< / li >
< li class = "chapter " data-level = "6.3.5.2" data-path = "../usecases/envoy-front-proxy.html" >
< a href = "../usecases/envoy-front-proxy.html" >
< b > 6.3.5.2.< / b >
Envoy 作为前端代理
< / a >
< / li >
< li class = "chapter " data-level = "6.3.5.3" data-path = "../usecases/envoy-mesh-in-kubernetes-tutorial.html" >
< a href = "../usecases/envoy-mesh-in-kubernetes-tutorial.html" >
< b > 6.3.5.3.< / b >
Envoy mesh 教程
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.3.6" data-path = "../usecases/mosn.html" >
< a href = "../usecases/mosn.html" >
< b > 6.3.6.< / b >
MOSN
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.4" data-path = "../usecases/big-data.html" >
< a href = "../usecases/big-data.html" >
< b > 6.4.< / b >
大数据
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.4.1" data-path = "../usecases/spark-standalone-on-kubernetes.html" >
< a href = "../usecases/spark-standalone-on-kubernetes.html" >
< b > 6.4.1.< / b >
Spark standalone on Kubernetes
< / a >
< / li >
< li class = "chapter " data-level = "6.4.2" data-path = "../usecases/running-spark-with-kubernetes-native-scheduler.html" >
< a href = "../usecases/running-spark-with-kubernetes-native-scheduler.html" >
< b > 6.4.2.< / b >
运行支持 Kubernetes 原生调度的 Spark 程序
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.5" data-path = "../usecases/serverless.html" >
< a href = "../usecases/serverless.html" >
< b > 6.5.< / b >
Serverless 架构
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.5.1" data-path = "../usecases/understanding-serverless.html" >
< a href = "../usecases/understanding-serverless.html" >
< b > 6.5.1.< / b >
理解 Serverless
< / a >
< / li >
< li class = "chapter " data-level = "6.5.2" data-path = "../usecases/faas.html" >
< a href = "../usecases/faas.html" >
< b > 6.5.2.< / b >
FaaS( 函数即服务)
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.5.2.1" data-path = "../usecases/openfaas-quick-start.html" >
< a href = "../usecases/openfaas-quick-start.html" >
< b > 6.5.2.1.< / b >
OpenFaaS 快速入门指南
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.5.3" data-path = "../usecases/knative.html" >
< a href = "../usecases/knative.html" >
< b > 6.5.3.< / b >
Knative
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.6" data-path = "../usecases/cloud-native-app-standard.html" >
< a href = "../usecases/cloud-native-app-standard.html" >
< b > 6.6.< / b >
云原生应用标准
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "6.6.1" data-path = "../usecases/oam.html" >
< a href = "../usecases/oam.html" >
< b > 6.6.1.< / b >
OAM( 开放应用模型)
< / a >
2020-06-23 21:27:48 +08:00
< / li >
< li class = "chapter " data-level = "6.6.2" data-path = "../usecases/crossplane.html" >
< a href = "../usecases/crossplane.html" >
< b > 6.6.2.< / b >
Crossplane
< / a >
2020-06-19 14:52:56 +08:00
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "6.7" data-path = "../usecases/edge-computing.html" >
< a href = "../usecases/edge-computing.html" >
< b > 6.7.< / b >
边缘计算
< / a >
< / li >
< li class = "chapter " data-level = "6.8" data-path = "../usecases/ai.html" >
< a href = "../usecases/ai.html" >
< b > 6.8.< / b >
人工智能
< / a >
< / li >
< li class = "header" > 开发指南< / li >
< li class = "chapter " data-level = "7.1" data-path = "../develop/" >
< a href = "../develop/" >
< b > 7.1.< / b >
开发指南概览
< / a >
< / li >
< li class = "chapter " data-level = "7.2" data-path = "../develop/sigs-and-working-group.html" >
< a href = "../develop/sigs-and-working-group.html" >
< b > 7.2.< / b >
SIG 和工作组
< / a >
< / li >
< li class = "chapter " data-level = "7.3" data-path = "../develop/developing-environment.html" >
< a href = "../develop/developing-environment.html" >
< b > 7.3.< / b >
开发环境搭建
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "7.3.1" data-path = "../develop/using-vagrant-and-virtualbox-for-development.html" >
< a href = "../develop/using-vagrant-and-virtualbox-for-development.html" >
< b > 7.3.1.< / b >
本地分布式开发环境搭建(使用 Vagrant 和 Virtualbox)
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "7.4" data-path = "../develop/testing.html" >
< a href = "../develop/testing.html" >
< b > 7.4.< / b >
单元测试和集成测试
< / a >
< / li >
< li class = "chapter " data-level = "7.5" data-path = "../develop/client-go-sample.html" >
< a href = "../develop/client-go-sample.html" >
< b > 7.5.< / b >
client-go 示例
< / a >
< / li >
< li class = "chapter " data-level = "7.6" data-path = "../develop/operator.html" >
< a href = "../develop/operator.html" >
< b > 7.6.< / b >
Operator
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "7.6.1" data-path = "../develop/operator-sdk.html" >
< a href = "../develop/operator-sdk.html" >
< b > 7.6.1.< / b >
operator-sdk
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "7.7" data-path = "../develop/kubebuilder.html" >
< a href = "../develop/kubebuilder.html" >
< b > 7.7.< / b >
kubebuilder
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "7.7.1" data-path = "../develop/kubebuilder-example.html" >
< a href = "../develop/kubebuilder-example.html" >
< b > 7.7.1.< / b >
使用 kubebuilder 创建 operator 示例
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "7.8" data-path = "../develop/advance-developer.html" >
< a href = "../develop/advance-developer.html" >
< b > 7.8.< / b >
高级开发指南
< / a >
< / li >
< li class = "chapter " data-level = "7.9" data-path = "../develop/contribute.html" >
< a href = "../develop/contribute.html" >
< b > 7.9.< / b >
社区贡献
< / a >
< / li >
< li class = "chapter " data-level = "7.10" data-path = "../develop/minikube.html" >
< a href = "../develop/minikube.html" >
< b > 7.10.< / b >
Minikube
< / a >
< / li >
< li class = "header" > CNCF( 云原生计算基金会) < / li >
< li class = "chapter " data-level = "8.1" data-path = "../cloud-native/cncf.html" >
< a href = "../cloud-native/cncf.html" >
< b > 8.1.< / b >
CNCF - 云原生计算基金会简介
< / a >
< / li >
< li class = "chapter " data-level = "8.2" data-path = "../cloud-native/cncf-charter.html" >
< a href = "../cloud-native/cncf-charter.html" >
< b > 8.2.< / b >
CNCF 章程
< / a >
< / li >
< li class = "chapter " data-level = "8.3" data-path = "../cloud-native/cncf-sig.html" >
< a href = "../cloud-native/cncf-sig.html" >
< b > 8.3.< / b >
CNCF 特别兴趣小组( SIG) 说明
< / a >
< / li >
< li class = "chapter " data-level = "8.4" data-path = "../cloud-native/cncf-sandbox-criteria.html" >
< a href = "../cloud-native/cncf-sandbox-criteria.html" >
< b > 8.4.< / b >
开源项目加入 CNCF Sandbox 的要求
< / a >
< / li >
< li class = "chapter " data-level = "8.5" data-path = "../cloud-native/cncf-project-governing.html" >
< a href = "../cloud-native/cncf-project-governing.html" >
< b > 8.5.< / b >
CNCF 中的项目治理
< / a >
< / li >
< li class = "chapter " data-level = "8.6" data-path = "../cloud-native/cncf-ambassador.html" >
< a href = "../cloud-native/cncf-ambassador.html" >
< b > 8.6.< / b >
CNCF Ambassador
< / a >
< / li >
< li class = "header" > 附录< / li >
< li class = "chapter " data-level = "9.1" data-path = "../appendix/" >
< a href = "../appendix/" >
< b > 9.1.< / b >
附录说明
< / a >
< / li >
< li class = "chapter " data-level = "9.2" data-path = "../appendix/debug-kubernetes-services.html" >
< a href = "../appendix/debug-kubernetes-services.html" >
< b > 9.2.< / b >
Kubernetes 中的应用故障排查
< / a >
< / li >
< li class = "chapter " data-level = "9.3" data-path = "../appendix/material-share.html" >
< a href = "../appendix/material-share.html" >
< b > 9.3.< / b >
Kubernetes 相关资讯和情报链接
< / a >
< / li >
< li class = "chapter " data-level = "9.4" data-path = "../appendix/docker-best-practice.html" >
< a href = "../appendix/docker-best-practice.html" >
< b > 9.4.< / b >
Docker 最佳实践
< / a >
< / li >
< li class = "chapter " data-level = "9.5" data-path = "../appendix/tricks.html" >
< a href = "../appendix/tricks.html" >
< b > 9.5.< / b >
使用技巧
< / a >
< / li >
< li class = "chapter " data-level = "9.6" data-path = "../appendix/issues.html" >
< a href = "../appendix/issues.html" >
< b > 9.6.< / b >
问题记录
< / a >
< / li >
< li class = "chapter " data-level = "9.7" data-path = "../appendix/kubernetes-changelog.html" >
< a href = "../appendix/kubernetes-changelog.html" >
< b > 9.7.< / b >
Kubernetes 版本更新日志
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "9.7.1" data-path = "../appendix/kubernetes-1.7-changelog.html" >
< a href = "../appendix/kubernetes-1.7-changelog.html" >
< b > 9.7.1.< / b >
Kubernetes1.7 更新日志
< / a >
< / li >
< li class = "chapter " data-level = "9.7.2" data-path = "../appendix/kubernetes-1.8-changelog.html" >
< a href = "../appendix/kubernetes-1.8-changelog.html" >
< b > 9.7.2.< / b >
Kubernetes1.8 更新日志
< / a >
< / li >
< li class = "chapter " data-level = "9.7.3" data-path = "../appendix/kubernetes-1.9-changelog.html" >
< a href = "../appendix/kubernetes-1.9-changelog.html" >
< b > 9.7.3.< / b >
Kubernetes1.9 更新日志
< / a >
< / li >
< li class = "chapter " data-level = "9.7.4" data-path = "../appendix/kubernetes-1.10-changelog.html" >
< a href = "../appendix/kubernetes-1.10-changelog.html" >
< b > 9.7.4.< / b >
Kubernetes1.10 更新日志
< / a >
< / li >
< li class = "chapter " data-level = "9.7.5" data-path = "../appendix/kubernetes-1.11-changelog.html" >
< a href = "../appendix/kubernetes-1.11-changelog.html" >
< b > 9.7.5.< / b >
Kubernetes1.11 更新日志
< / a >
< / li >
< li class = "chapter " data-level = "9.7.6" data-path = "../appendix/kubernetes-1.12-changelog.html" >
< a href = "../appendix/kubernetes-1.12-changelog.html" >
< b > 9.7.6.< / b >
Kubernetes1.12 更新日志
< / a >
< / li >
< li class = "chapter " data-level = "9.7.7" data-path = "../appendix/kubernetes-1.13-changelog.html" >
< a href = "../appendix/kubernetes-1.13-changelog.html" >
< b > 9.7.7.< / b >
Kubernetes1.13 更新日志
< / a >
< / li >
< li class = "chapter " data-level = "9.7.8" data-path = "../appendix/kubernetes-1.14-changelog.html" >
< a href = "../appendix/kubernetes-1.14-changelog.html" >
< b > 9.7.8.< / b >
Kubernetes1.14 更新日志
< / a >
< / li >
< li class = "chapter " data-level = "9.7.9" data-path = "../appendix/kubernetes-1.15-changelog.html" >
< a href = "../appendix/kubernetes-1.15-changelog.html" >
< b > 9.7.9.< / b >
Kubernetes1.15 更新日志
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "9.8" data-path = "../appendix/summary-and-outlook.html" >
< a href = "../appendix/summary-and-outlook.html" >
< b > 9.8.< / b >
Kubernetes 及云原生年度总结及展望
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "9.8.1" data-path = "../appendix/kubernetes-and-cloud-native-summary-in-2017-and-outlook-for-2018.html" >
< a href = "../appendix/kubernetes-and-cloud-native-summary-in-2017-and-outlook-for-2018.html" >
< b > 9.8.1.< / b >
Kubernetes 与云原生 2017 年年终总结及 2018 年展望
< / a >
< / li >
< li class = "chapter " data-level = "9.8.2" data-path = "../appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html" >
< a href = "../appendix/kubernetes-and-cloud-native-summary-in-2018-and-outlook-for-2019.html" >
< b > 9.8.2.< / b >
Kubernetes 与云原生 2018 年年终总结及 2019 年展望
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "9.9" data-path = "../appendix/cncf-annual-report.html" >
< a href = "../appendix/cncf-annual-report.html" >
< b > 9.9.< / b >
CNCF 年度报告解读
< / a >
< ul class = "articles" >
< li class = "chapter " data-level = "9.9.1" data-path = "../appendix/cncf-annual-report-2018.html" >
< a href = "../appendix/cncf-annual-report-2018.html" >
< b > 9.9.1.< / b >
CNCF 2018 年年度报告解读
< / a >
< / li >
< / ul >
< / li >
< li class = "chapter " data-level = "9.10" data-path = "../appendix/about-kcsp.html" >
< a href = "../appendix/about-kcsp.html" >
< b > 9.10.< / b >
Kubernetes 认证服务提供商( KCSP) 说明
< / a >
< / li >
< li class = "chapter " data-level = "9.11" data-path = "../appendix/about-cka-candidate.html" >
< a href = "../appendix/about-cka-candidate.html" >
< b > 9.11.< / b >
认证 Kubernetes 管理员( CKA) 说明
< / a >
< / li >
< li class = "divider" > < / li >
< li >
< a href = "https://www.gitbook.com" target = "blank" class = "gitbook-link" >
本书使用 GitBook 发布
< / a >
< / li >
< / ul >
< / nav >
< / div >
< div class = "book-body" >
< div class = "body-inner" >
< div class = "book-header" role = "navigation" >
<!-- Title -->
< h1 >
< i class = "fa fa-circle-o-notch fa-spin" > < / i >
< a href = ".." > 在 OpenShift 中使用 GlusterFS 做持久化存储< / a >
< / h1 >
< / div >
< div class = "page-wrapper" tabindex = "-1" role = "main" >
< div class = "page-inner" >
< div class = "search-plus" id = "book-search-results" >
< div class = "search-noresults" >
< section class = "normal markdown-section" >
< h1 id = "在openshift中使用glusterfs做持久化存储" > 在 OpenShift中 使 用 GlusterFS做 持 久 化 存 储 < / h1 >
< h3 id = "概述" > 概 述 < / h3 >
< p > 本 文 由 Daniel Messer( Technical Marketing Manager Storage @RedHat) 和 Keith Tenzer( Solutions Architect @RedHat) 共 同 撰 写 。 < / p >
< ul >
< li > < a href = "https://keithtenzer.com/2017/03/07/storage-for-containers-overview-part-i/" target = "_blank" > Storage for Containers Overview – Part I< / a > < / li >
< li > < a href = "https://keithtenzer.com/2017/03/24/storage-for-containers-using-gluster-part-ii/" target = "_blank" > Storage for Containers using Gluster – Part II< / a > < / li >
< li > < a href = "https://keithtenzer.com/2017/03/29/storage-for-containers-using-container-native-storage-part-iii/" target = "_blank" > Storage for Containers using Container Native Storage – Part III< / a > < / li >
< li > < a href = "https://keithtenzer.com/2017/04/07/storage-for-containers-using-ceph-rbd-part-iv/" target = "_blank" > Storage for Containers using Ceph – Part IV< / a > < / li >
< li > < a href = "https://keithtenzer.com/2017/04/05/storage-for-containers-using-netapp-ontap-nas-part-v/" target = "_blank" > Storage for Containers using NetApp ONTAP NAS – Part V< / a > < / li >
< li > < a href = "https://keithtenzer.com/2017/04/05/storage-for-containers-using-netapp-solidfire-part-vi/" target = "_blank" > Storage for Containers using NetApp SolidFire – Part VI< / a > < / li >
< / ul >
< h3 id = "gluster作为container-ready-storagecrs" > Gluster作 为 Container-Ready Storage(CRS)< / h3 >
< p > 在 本 文 中 , 我 们 将 介 绍 容 器 存 储 的 首 选 以 及 如 何 部 署 它 。 Kusternet和 OpenShift支 持 GlusterFS已 经 有 一 段 时 间 了 。 GlusterFS的 适 用 性 很 好 , 可 用 于 所 有 的 部 署 场 景 : 裸 机 、 虚 拟 机 、 内 部 部 署 和 公 共 云 。 在 容 器 中 运 行 GlusterFS的 新 特 性 将 在 本 系 列 后 面 讨 论 。 < / p >
< p > GlusterFS是 一 个 分 布 式 文 件 系 统 , 内 置 了 原 生 协 议 ( GlusterFS) 和 各 种 其 他 协 议 ( NFS, SMB, ...) 。 为 了 与 OpenShift集 成 , 节 点 将 通 过 FUSE使 用 原 生 协 议 , 将 GlusterFS卷 挂 在 到 节 点 本 身 上 , 然 后 将 它 们 绑 定 到 目 标 容 器 中 。 OpenShift / Kubernetes具 有 实 现 请 求 、 释 放 和 挂 载 、 卸 载 GlusterFS卷 的 原 生 程 序 。 < / p >
< h3 id = "crs概述" > CRS概 述 < / h3 >
< p > 在 存 储 方 面 , 根 据 OpenShift / Kubernetes的 要 求 , 还 有 一 个 额 外 的 组 件 管 理 集 群 , 称 为 “ heketi” 。 这 实 际 上 是 一 个 用 于 GlusterFS的 REST API, 它 还 提 供 CLI版 本 。 在 以 下 步 骤 中 , 我 们 将 在 3个 GlusterFS节 点 中 部 署 heketi, 使 用 它 来 部 署 GlusterFS存 储 池 , 将 其 连 接 到 OpenShift, 并 使 用 它 来 通 过 PersistentVolumeClaims为 容 器 配 置 存 储 。 我 们 将 总 共 部 署 4台 虚 拟 机 。 一 个 用 于 OpenShift( 实 验 室 设 置 ) , 另 一 个 用 于 GlusterFS。 < / p >
< p > 注 意 : 您 的 系 统 应 至 少 需 要 有 四 核 CPU, 16GB RAM和 20 GB可 用 磁 盘 空 间 。 < / p >
< h3 id = "部署openshift" > 部 署 OpenShift< / h3 >
< p > 首 先 你 需 要 先 部 署 OpenShift。 最 有 效 率 的 方 式 是 直 接 在 虚 拟 机 中 部 署 一 个 All-in-One环 境 , 部 署 指 南 见 < a href = "https://keithtenzer.com/2017/03/13/openshift-enterprise-3-4-all-in-one-lab-environment/" target = "_blank" > the “ OpenShift Enterprise 3.4 all-in-one Lab Environment” article.< / a > 。 < / p >
< p > 确 保 你 的 OpenShift虚 拟 机 可 以 解 析 外 部 域 名 。 编 辑 < code > /etc/dnsmasq.conf< / code > 文 件 , 增 加 下 面 的 Google DNS: < / p >
< pre class = "language-" > < code class = "lang-ini" > < span class = "token constant" > server< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > 8.8.8.8< / span >
< / code > < / pre >
< p > 重 启 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # systemctl restart dnsmasq< / span >
< span class = "token comment" > # ping -c1 google.com< / span >
< / code > < / pre >
< h3 id = "部署gluster" > 部 署 Gluster< / h3 >
< p > GlusterFS至 少 需 要 有 以 下 配 置 的 3台 虚 拟 机 : < / p >
< ul >
< li > RHEL 7.3< / li >
< li > 2 CPUs< / li >
< li > 2 GB内 存 < / li >
< li > 30 GB磁 盘 存 储 给 操 作 系 统 < / li >
< li > 10 GB磁 盘 存 储 给 GlusterFS bricks< / li >
< / ul >
< p > 修 改 /etc/hosts文 件 , 定 义 三 台 虚 拟 机 的 主 机 名 。 < / p >
< p > 例 如 ( 主 机 名 可 以 根 据 你 自 己 的 环 境 自 由 调 整 ) < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # cat /etc/hosts< / span >
< span class = "token number" > 127.0< / span > .0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
< span class = "token number" > 172.16< / span > .99.144 ocp-master.lab ocp-master
< span class = "token number" > 172.16< / span > .128.7 crs-node1.lab crs-node1
< span class = "token number" > 172.16< / span > .128.8 crs-node2.lab crs-node2
< span class = "token number" > 172.16< / span > .128.9 crs-node3.lab crs-node3
< / code > < / pre >
< p > < strong > 在 3台 GlusterFS虚 拟 机 上 都 执 行 以 下 步 骤 < / strong > : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # subscription-manager repos --disable=" *" < / span >
< span class = "token comment" > # subscription-manager repos --enable=rhel-7-server-rpms< / span >
< / code > < / pre >
< p > 如 果 你 已 经 订 阅 了 GlusterFS那 么 可 以 直 接 使 用 , 开 启 < code > rh-gluster-3-for-rhel-7-server-rpms< / code > 的 yum源 。 < / p >
< p > 如 果 你 没 有 的 话 , 那 么 可 以 通 过 EPEL使 用 非 官 方 支 持 的 GlusterFS的 社 区 源 。 < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # yum -y install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm< / span >
< span class = "token comment" > # rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7< / span >
< / code > < / pre >
< p > 在 < code > /etc/yum.repos.d/< / code > 目 录 下 创 建 < code > glusterfs-3.10.repo< / code > 文 件 : < / p >
< pre class = "language-" > < code class = "lang-ini" > < span class = "token selector" > [glusterfs-3.10]< / span >
< span class = "token constant" > name< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > glusterfs-3.10< / span >
< span class = "token constant" > description< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > " GlusterFS 3.10 Community Version" < / span >
< span class = "token constant" > baseurl< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > https://buildlogs.centos.org/centos/7/storage/x86_64/gluster-3.10/< / span >
< span class = "token constant" > gpgcheck< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > 0< / span >
< span class = "token constant" > enabled< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > 1< / span >
< / code > < / pre >
< p > 验 证 源 已 经 被 激 活 。 < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # yum repolist< / span >
< / code > < / pre >
< p > 现 在 可 以 开 始 安 装 GlusterFS了 。 < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # yum -y install glusterfs-server< / span >
< / code > < / pre >
< p > 需 要 为 GlusterFS peers打 开 几 个 基 本 TCP端 口 , 以 便 与 OpenShift进 行 通 信 并 提 供 存 储 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # firewall-cmd --add-port=24007-24008/tcp --add-port=49152-49664/tcp --add-port=2222/tcp< / span >
< span class = "token comment" > # firewall-cmd --runtime-to-permanent< / span >
< / code > < / pre >
< p > 现 在 我 们 可 以 启 动 GlusterFS的 daemon进 程 了 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # systemctl enable glusterd< / span >
< span class = "token comment" > # systemctl start glusterd< / span >
< / code > < / pre >
< p > 完 成 。 GlusterFS已 经 启 动 并 正 在 运 行 。 其 他 配 置 将 通 过 heketi完 成 。 < / p >
< p > < strong > 在 GlusterFS的 一 台 虚 拟 机 上 安 装 heketi< / strong > < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # yum -y install heketi heketi-client< / span >
< / code > < / pre >
< h3 id = "更新epel" > 更 新 EPEL< / h3 >
< p > 如 果 你 没 有 Red Hat Gluster Storage订 阅 的 话 , 你 可 以 从 EPEL中 获 取 heketi。 在 撰 写 本 文 时 , 2016年 10月 那 时 候 还 是 3.0.0-1.el7版 本 , 它 不 适 用 于 OpenShift 3.4。 你 将 需 要 更 新 到 更 新 的 版 本 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # yum -y install wget< / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # wget https://github.com/heketi/heketi/releases/download/v4.0.0/heketi-v4.0.0.linux.amd64.tar.gz< / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # tar -xzf heketi-v4.0.0.linux.amd64.tar.gz< / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # systemctl stop heketi< / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # cp heketi/heketi* /usr/bin/< / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # chown heketi:heketi /usr/bin/heketi*< / span >
< / code > < / pre >
< p > 在 < code > /etc/systemd/system/heketi.service< / code > 中 创 建 v4版 本 的 heketi二 进 制 文 件 的 更 新 语 法 文 件 : < / p >
< pre class = "language-" > < code class = "lang-ini" > < span class = "token selector" > [Unit]< / span >
< span class = "token constant" > Description< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > Heketi Server< / span >
< span class = "token selector" > [Service]< / span >
< span class = "token constant" > Type< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > simple< / span >
< span class = "token constant" > WorkingDirectory< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > /var/lib/heketi< / span >
< span class = "token constant" > EnvironmentFile< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > -/etc/heketi/heketi.json< / span >
< span class = "token constant" > User< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > heketi< / span >
< span class = "token constant" > ExecStart< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > /usr/bin/heketi --config=/etc/heketi/heketi.json< / span >
< span class = "token constant" > Restart< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > on-failure< / span >
< span class = "token constant" > StandardOutput< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > syslog< / span >
< span class = "token constant" > StandardError< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > syslog< / span >
< span class = "token selector" > [Install]< / span >
< span class = "token constant" > WantedBy< / span > < span class = "token attr-value" > < span class = "token punctuation" > =< / span > multi-user.target< / span >
< / code > < / pre >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # systemctl daemon-reload< / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # systemctl start heketi< / span >
< / code > < / pre >
< p > Heketi使 用 SSH来 配 置 GlusterFS的 所 有 节 点 。 创 建 SSH密 钥 对 , 将 公 钥 拷 贝 到 所 有 3个 节 点 上 ( 包 括 你 登 陆 的 第 一 个 节 点 ) : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # ssh-keygen -f /etc/heketi/heketi_key -t rsa -N ' ' < / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # ssh-copy-id -i /etc/heketi/heketi_key.pub root@crs-node1.lab< / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # ssh-copy-id -i /etc/heketi/heketi_key.pub root@crs-node2.lab< / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # ssh-copy-id -i /etc/heketi/heketi_key.pub root@crs-node3.lab< / span >
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # chown heketi:heketi /etc/heketi/heketi_key*< / span >
< / code > < / pre >
< p > 剩 下 唯 一 要 做 的 事 情 就 是 配 置 heketi来 使 用 SSH。 编 辑 < code > /etc/heketi/heketi.json< / code > 文 件 使 它 看 起 来 像 下 面 这 个 样 子 ( 改 变 的 部 分 突 出 显 示 下 划 线 ) : < / p >
< pre class = "language-" > < code class = "lang-json" > < span class = "token punctuation" > {< / span >
< span class = "token property" > " _port_comment" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " Heketi Server Port Number" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " port" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " 8080" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " _use_auth" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " Enable JWT authorization. Please enable for deployment" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " use_auth" < / span > < span class = "token operator" > :< / span > < span class = "token boolean" > false< / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " _jwt" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " Private keys for access" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " jwt" < / span > < span class = "token operator" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token property" > " _admin" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " Admin has access to all APIs" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " admin" < / span > < span class = "token operator" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token property" > " key" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " My Secret" < / span >
< span class = "token punctuation" > }< / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " _user" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " User only has access to /volumes endpoint" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " user" < / span > < span class = "token operator" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token property" > " key" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " My Secret" < / span >
< span class = "token punctuation" > }< / span >
< span class = "token punctuation" > }< / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " _glusterfs_comment" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " GlusterFS Configuration" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " glusterfs" < / span > < span class = "token operator" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token property" > " _executor_comment" < / span > < span class = "token operator" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " Execute plugin. Possible choices: mock, ssh" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token string" > " mock: This setting is used for testing and development." < / span > < span class = "token punctuation" > ,< / span >
< span class = "token string" > " It will not send commands to any node." < / span > < span class = "token punctuation" > ,< / span >
< span class = "token string" > " ssh: This setting will notify Heketi to ssh to the nodes." < / span > < span class = "token punctuation" > ,< / span >
< span class = "token string" > " It will need the values in sshexec to be configured." < / span > < span class = "token punctuation" > ,< / span >
< span class = "token string" > " kubernetes: Communicate with GlusterFS containers over" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token string" > " Kubernetes exec api." < / span >
< span class = "token punctuation" > ]< / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " executor" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " ssh" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " _sshexec_comment" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " SSH username and private key file information" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " sshexec" < / span > < span class = "token operator" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token property" > " keyfile" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " /etc/heketi/heketi_key" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " user" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " root" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " port" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " 22" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " fstab" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " /etc/fstab" < / span >
< span class = "token punctuation" > }< / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " _kubeexec_comment" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " Kubernetes configuration" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " kubeexec" < / span > < span class = "token operator" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token property" > " host" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " https://kubernetes.host:8443" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " cert" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " /path/to/crt.file" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " insecure" < / span > < span class = "token operator" > :< / span > < span class = "token boolean" > false< / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " user" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " kubernetes username" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " password" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " password for kubernetes user" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " namespace" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " OpenShift project or Kubernetes namespace" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " fstab" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " Optional: Specify fstab file on node. Default is /etc/fstab" < / span >
< span class = "token punctuation" > }< / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " _db_comment" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " Database file name" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " db" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " /var/lib/heketi/heketi.db" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " _loglevel_comment" < / span > < span class = "token operator" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " Set log level. Choices are:" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token string" > " none, critical, error, warning, info, debug" < / span > < span class = "token punctuation" > ,< / span >
< span class = "token string" > " Default is warning" < / span >
< span class = "token punctuation" > ]< / span > < span class = "token punctuation" > ,< / span >
< span class = "token property" > " loglevel" < / span > < span class = "token operator" > :< / span > < span class = "token string" > " debug" < / span >
< span class = "token punctuation" > }< / span >
< span class = "token punctuation" > }< / span >
< / code > < / pre >
< p > 完 成 。 heketi将 监 听 8080端 口 , 我 们 来 确 认 下 防 火 墙 规 则 允 许 它 监 听 该 端 口 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # firewall-cmd --add-port=8080/tcp< / span >
< span class = "token comment" > # firewall-cmd --runtime-to-permanent< / span >
< / code > < / pre >
< p > 重 启 heketi: < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # systemctl enable heketi< / span >
< span class = "token comment" > # systemctl restart heketi< / span >
< / code > < / pre >
< p > 测 试 它 是 否 在 运 行 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # curl http://crs-node1.lab:8080/hello< / span >
Hello from Heketi
< / code > < / pre >
< p > 很 好 。 heketi上 场 的 时 候 到 了 。 我 们 将 使 用 它 来 配 置 我 们 的 GlusterFS存 储 池 。 该 软 件 已 经 在 我 们 所 有 的 虚 拟 机 上 运 行 , 但 并 未 被 配 置 。 要 将 其 改 造 为 满 足 我 们 需 求 的 存 储 系 统 , 需 要 在 拓 扑 文 件 中 描 述 我 们 所 需 的 GlusterFS存 储 池 , 如 下 所 示 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # vi topology.json< / span >
< span class = "token punctuation" > {< / span >
< span class = "token string" > " clusters" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token punctuation" > {< / span >
< span class = "token string" > " nodes" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token punctuation" > {< / span >
< span class = "token string" > " node" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token string" > " hostnames" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token string" > " manage" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " crs-node1.lab" < / span >
< span class = "token punctuation" > ]< / span > ,
< span class = "token string" > " storage" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " 172.16.128.7" < / span >
< span class = "token punctuation" > ]< / span >
< span class = "token punctuation" > }< / span > ,
< span class = "token string" > " zone" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token number" > 1< / span >
< span class = "token punctuation" > }< / span > ,
< span class = "token string" > " devices" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " /dev/sdb" < / span >
< span class = "token punctuation" > ]< / span >
< span class = "token punctuation" > }< / span > ,
< span class = "token punctuation" > {< / span >
< span class = "token string" > " node" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token string" > " hostnames" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token string" > " manage" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " crs-node2.lab" < / span >
< span class = "token punctuation" > ]< / span > ,
< span class = "token string" > " storage" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " 172.16.128.8" < / span >
< span class = "token punctuation" > ]< / span >
< span class = "token punctuation" > }< / span > ,
< span class = "token string" > " zone" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token number" > 1< / span >
< span class = "token punctuation" > }< / span > ,
< span class = "token string" > " devices" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " /dev/sdb" < / span >
< span class = "token punctuation" > ]< / span >
< span class = "token punctuation" > }< / span > ,
< span class = "token punctuation" > {< / span >
< span class = "token string" > " node" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token string" > " hostnames" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > {< / span >
< span class = "token string" > " manage" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " crs-node3.lab" < / span >
< span class = "token punctuation" > ]< / span > ,
< span class = "token string" > " storage" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " 172.16.128.9" < / span >
< span class = "token punctuation" > ]< / span >
< span class = "token punctuation" > }< / span > ,
< span class = "token string" > " zone" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token number" > 1< / span >
< span class = "token punctuation" > }< / span > ,
< span class = "token string" > " devices" < / span > < span class = "token builtin class-name" > :< / span > < span class = "token punctuation" > [< / span >
< span class = "token string" > " /dev/sdb" < / span >
< span class = "token punctuation" > ]< / span >
< span class = "token punctuation" > }< / span >
< span class = "token punctuation" > ]< / span >
< span class = "token punctuation" > }< / span >
< span class = "token punctuation" > ]< / span >
< span class = "token punctuation" > }< / span >
< / code > < / pre >
< p > 该 文 件 格 式 比 较 简 单 , 基 本 上 是 告 诉 heketi要 创 建 一 个 3节 点 的 集 群 , 其 中 每 个 节 点 包 含 的 配 置 有 FQDN, IP地 址 以 及 至 少 一 个 将 用 作 GlusterFS块 的 备 用 块 设 备 。 < / p >
< p > 现 在 将 该 文 件 发 送 给 heketi: < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # export HEKETI_CLI_SERVER=http://crs-node1.lab:8080< / span >
< span class = "token comment" > # heketi-cli topology load --json=topology.json< / span >
Creating cluster < span class = "token punctuation" > ..< / span > . ID: 78cdb57aa362f5284bc95b2549bc7e7d
Creating node crs-node1.lab < span class = "token punctuation" > ..< / span > . ID: ffd7671c0083d88aeda9fd1cb40b339b
Adding device /dev/sdb < span class = "token punctuation" > ..< / span > . OK
Creating node crs-node2.lab < span class = "token punctuation" > ..< / span > . ID: 8220975c0a4479792e684584153050a9
Adding device /dev/sdb < span class = "token punctuation" > ..< / span > . OK
Creating node crs-node3.lab < span class = "token punctuation" > ..< / span > . ID: b94f14c4dbd8850f6ac589ac3b39cc8e
Adding device /dev/sdb < span class = "token punctuation" > ..< / span > . OK
< / code > < / pre >
< p > 现 在 heketi已 经 配 置 了 3个 节 点 的 GlusterFS存 储 池 。 很 简 单 ! 你 现 在 可 以 看 到 3个 虚 拟 机 都 已 经 成 功 构 成 了 GlusterFS中 的 可 信 存 储 池 ( Trusted Stroage Pool) 。 < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # gluster peer status< / span >
Number of Peers: < span class = "token number" > 2< / span >
Hostname: crs-node2.lab
Uuid: 93b34946-9571-46a8-983c-c9f128557c0e
State: Peer < span class = "token keyword" > in< / span > Cluster < span class = "token punctuation" > (< / span > Connected< span class = "token punctuation" > )< / span >
Other names:
crs-node2.lab
Hostname: < span class = "token number" > 172.16< / span > .128.9
Uuid: e3c1f9b0-be97-42e5-beda-f70fc05f47ea
State: Peer < span class = "token keyword" > in< / span > Cluster < span class = "token punctuation" > (< / span > Connected< span class = "token punctuation" > )< / span >
< / code > < / pre >
< p > 现 在 回 到 OpenShift! < / p >
< h3 id = "将gluster与openshift集成" > 将 Gluster与 OpenShift集 成 < / h3 >
< p > 为 了 集 成 OpenShift, 需 要 两 样 东 西 : 一 个 动 态 的 Kubernetes Storage Provisioner和 一 个 StorageClass。 Provisioner在 OpenShift中 开 箱 即 用 。 实 际 上 关 键 的 是 如 何 将 存 储 挂 载 到 容 器 上 。 StorageClass是 OpenShift中 的 用 户 可 以 用 来 实 现 的 PersistentVolumeClaims的 实 体 , 它 反 过 来 能 够 触 发 一 个 Provisioner实 现 实 际 的 配 置 , 并 将 结 果 表 示 为 Kubernetes PersistentVolume( PV) 。 < / p >
< p > 就 像 OpenShift中 的 其 他 组 件 一 样 , StorageClass也 简 单 的 用 YAML文 件 定 义 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # cat crs-storageclass.yaml< / span >
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: container-ready-storage
annotations:
storageclass.beta.kubernetes.io/is-default-class: < span class = "token string" > " true" < / span >
provisioner: kubernetes.io/glusterfs
parameters:
resturl: < span class = "token string" > " http://crs-node1.lab:8080" < / span >
restauthenabled: < span class = "token string" > " false" < / span >
< / code > < / pre >
< p > 我 们 的 provisioner是 kubernetes.io/glusterfs, 将 它 指 向 我 们 的 heketi实 例 。 我 们 将 类 命 名 为 “ container-ready-storage” , 同 时 使 其 成 为 所 有 没 有 显 示 指 定 StorageClass的 PersistentVolumeClaim的 默 认 StorageClass。 < / p >
< p > 为 你 的 GlusterFS池 创 建 StorageClass: < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc create -f crs-storageclass.yaml< / span >
< / code > < / pre >
< h3 id = "在openshift中使用gluster" > 在 OpenShift中 使 用 Gluster< / h3 >
< p > 我 们 来 看 下 如 何 在 OpenShift中 使 用 GlusterFS。 首 先 在 OpenShift虚 拟 机 中 创 建 一 个 测 试 项 目 。 < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc new-project crs-storage --display-name=" Container-Ready Storage" < / span >
< / code > < / pre >
< p > 这 会 向 Kubernetes/OpenShift发 出 storage请 求 , 请 求 一 个 PersistentVolumeClaim( PVC) 。 这 是 一 个 简 单 的 对 象 , 它 描 述 最 少 需 要 多 少 容 量 和 应 该 提 供 哪 种 访 问 模 式 ( 非 共 享 , 共 享 , 只 读 ) 。 它 通 常 是 应 用 程 序 模 板 的 一 部 分 , 但 我 们 只 需 创 建 一 个 独 立 的 PVC: < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # cat crs-claim.yaml< / span >
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-crs-storage
namespace: crs-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
< / code > < / pre >
< p > 发 送 该 请 求 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc create -f crs-claim.yaml< / span >
< / code > < / pre >
< p > 观 察 在 OpenShfit中 , PVC正 在 以 动 态 创 建 volume的 方 式 实 现 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc get pvc< / span >
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
my-crs-storage Bound pvc-41ad5adb-107c-11e7-afae-000c2949cce7 1Gi RWO 58s
< / code > < / pre >
< p > 太 棒 了 ! 你 现 在 可 以 在 OpenShift中 使 用 存 储 容 量 , 而 不 需 要 直 接 与 存 储 系 统 进 行 任 何 交 互 。 我 们 来 看 看 创 建 的 volume: < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc get pv/pvc-41ad5adb-107c-11e7-afae-000c2949cce7< / span >
Name: pvc-41ad5adb-107c-11e7-afae-000c2949cce7
Labels:
StorageClass: container-ready-storage
Status: Bound
Claim: crs-storage/my-crs-storage
Reclaim Policy: Delete
Access Modes: RWO
Capacity: 1Gi
Message:
Source:
Type: Glusterfs < span class = "token punctuation" > (< / span > a Glusterfs < span class = "token function" > mount< / span > on the < span class = "token function" > host< / span > that shares a pod' s lifetime< span class = "token punctuation" > )< / span >
EndpointsName: gluster-dynamic-my-crs-storage
Path: vol_85e444ee3bc154de084976a9aef16025
ReadOnly: < span class = "token boolean" > false< / span >
< / code > < / pre >
< p > What happened in the background was that when the PVC reached the system, our default StorageClass reached out to the GlusterFS Provisioner with the volume specs from the PVC. The provisioner in turn communicates with our heketi instance which facilitates the creation of the GlusterFS volume, which we can trace in it’ s log messages:< / p >
< p > 该 volume是 根 据 PVC中 的 定 义 特 别 创 建 的 。 在 PVC中 , 我 们 没 有 明 确 指 定 要 使 用 哪 个 StorageClass, 因 为 heketi的 GlusterFS StorageClass已 经 被 定 义 为 系 统 范 围 的 默 认 值 。 < / p >
< p > 在 后 台 发 生 的 情 况 是 , 当 PVC到 达 系 统 时 , 默 认 的 StorageClass请 求 具 有 该 PVC中 volume声 明 规 格 的 GlusterFS Provisioner。 Provisioner又 与 我 们 的 heketi实 例 通 信 , 这 有 助 于 创 建 GlusterFS volume, 我 们 可 以 在 其 日 志 消 息 中 追 踪 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # journalctl -l -u heketi.service< / span >
< span class = "token punctuation" > ..< / span > .
Mar < span class = "token number" > 24< / span > < span class = "token number" > 11< / span > :25:52 crs-node1.lab heketi< span class = "token punctuation" > [< / span > < span class = "token number" > 2598< / span > < span class = "token punctuation" > ]< / span > : < span class = "token punctuation" > [< / span > heketi< span class = "token punctuation" > ]< / span > DEBUG < span class = "token number" > 2017< / span > /03/24 < span class = "token number" > 11< / span > :25:52 /src/github.com/heketi/heketi/apps/glusterfs/volume_entry.go:298: Volume to be created on cluster e
Mar < span class = "token number" > 24< / span > < span class = "token number" > 11< / span > :25:52 crs-node1.lab heketi< span class = "token punctuation" > [< / span > < span class = "token number" > 2598< / span > < span class = "token punctuation" > ]< / span > : < span class = "token punctuation" > [< / span > heketi< span class = "token punctuation" > ]< / span > INFO < span class = "token number" > 2017< / span > /03/24 < span class = "token number" > 11< / span > :25:52 Creating brick 9e791b1daa12af783c9195941fe63103
Mar < span class = "token number" > 24< / span > < span class = "token number" > 11< / span > :25:52 crs-node1.lab heketi< span class = "token punctuation" > [< / span > < span class = "token number" > 2598< / span > < span class = "token punctuation" > ]< / span > : < span class = "token punctuation" > [< / span > heketi< span class = "token punctuation" > ]< / span > INFO < span class = "token number" > 2017< / span > /03/24 < span class = "token number" > 11< / span > :25:52 Creating brick 3e06af2f855bef521a95ada91680d14b
Mar < span class = "token number" > 24< / span > < span class = "token number" > 11< / span > :25:52 crs-node1.lab heketi< span class = "token punctuation" > [< / span > < span class = "token number" > 2598< / span > < span class = "token punctuation" > ]< / span > : < span class = "token punctuation" > [< / span > heketi< span class = "token punctuation" > ]< / span > INFO < span class = "token number" > 2017< / span > /03/24 < span class = "token number" > 11< / span > :25:52 Creating brick e4daa240f1359071e3f7ea22618cfbab
< span class = "token punctuation" > ..< / span > .
Mar < span class = "token number" > 24< / span > < span class = "token number" > 11< / span > :25:52 crs-node1.lab heketi< span class = "token punctuation" > [< / span > < span class = "token number" > 2598< / span > < span class = "token punctuation" > ]< / span > : < span class = "token punctuation" > [< / span > sshexec< span class = "token punctuation" > ]< / span > INFO < span class = "token number" > 2017< / span > /03/24 < span class = "token number" > 11< / span > :25:52 Creating volume vol_85e444ee3bc154de084976a9aef16025 replica < span class = "token number" > 3< / span >
< span class = "token punctuation" > ..< / span > .
Mar < span class = "token number" > 24< / span > < span class = "token number" > 11< / span > :25:53 crs-node1.lab heketi< span class = "token punctuation" > [< / span > < span class = "token number" > 2598< / span > < span class = "token punctuation" > ]< / span > : Result: volume create: vol_85e444ee3bc154de084976a9aef16025: success: please start the volume to access data
< span class = "token punctuation" > ..< / span > .
Mar < span class = "token number" > 24< / span > < span class = "token number" > 11< / span > :25:55 crs-node1.lab heketi< span class = "token punctuation" > [< / span > < span class = "token number" > 2598< / span > < span class = "token punctuation" > ]< / span > : Result: volume start: vol_85e444ee3bc154de084976a9aef16025: success
< span class = "token punctuation" > ..< / span > .
Mar < span class = "token number" > 24< / span > < span class = "token number" > 11< / span > :25:55 crs-node1.lab heketi< span class = "token punctuation" > [< / span > < span class = "token number" > 2598< / span > < span class = "token punctuation" > ]< / span > : < span class = "token punctuation" > [< / span > asynchttp< span class = "token punctuation" > ]< / span > INFO < span class = "token number" > 2017< / span > /03/24 < span class = "token number" > 11< / span > :25:55 Completed job c3d6c4f9fc74796f4a5262647dc790fe < span class = "token keyword" > in< / span > < span class = "token number" > 3< / span > .176522702s
< span class = "token punctuation" > ..< / span > .
< / code > < / pre >
< p > 成 功 ! 大 约 用 了 3秒 钟 , GlusterFS池 就 配 置 完 成 了 , 并 配 置 了 一 个 volume。 默 认 值 是 replica 3, 这 意 味 着 数 据 将 被 复 制 到 3个 不 同 节 点 的 3个 块 上 ( 用 GlusterFS作 为 后 端 存 储 ) 。 该 过 程 是 通 过 Heketi在 OpenShift进 行 编 排 的 。 < / p >
< p > 你 也 可 以 从 GlusterFS的 角 度 看 到 有 关 volume的 信 息 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # gluster volume list< / span >
vol_85e444ee3bc154de084976a9aef16025
< span class = "token punctuation" > [< / span > root@crs-node1 ~< span class = "token punctuation" > ]< / span > < span class = "token comment" > # gluster volume info vol_85e444ee3bc154de084976a9aef16025< / span >
Volume Name: vol_85e444ee3bc154de084976a9aef16025
Type: Replicate
Volume ID: a32168c8-858e-472a-b145-08c20192082b
Status: Started
Snapshot Count: < span class = "token number" > 0< / span >
Number of Bricks: < span class = "token number" > 1< / span > x < span class = "token number" > 3< / span > < span class = "token operator" > =< / span > < span class = "token number" > 3< / span >
Transport-type: tcp
Bricks:
Brick1: < span class = "token number" > 172.16< / span > .128.8:/var/lib/heketi/mounts/vg_147b43f6f6903be8b23209903b7172ae/brick_9e791b1daa12af783c9195941fe63103/brick
Brick2: < span class = "token number" > 172.16< / span > .128.9:/var/lib/heketi/mounts/vg_72c0f520b0c57d807be21e9c90312f85/brick_3e06af2f855bef521a95ada91680d14b/brick
Brick3: < span class = "token number" > 172.16< / span > .128.7:/var/lib/heketi/mounts/vg_67314f879686de975f9b8936ae43c5c5/brick_e4daa240f1359071e3f7ea22618cfbab/brick
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
< / code > < / pre >
< p > 请 注 意 , GlusterFS中 的 卷 名 称 如 何 对 应 于 OpenShift中 Kubernetes Persistent Volume的 “ 路 径 ” 。 < / p >
< p > 或 者 , 你 也 可 以 使 用 OpenShift UI来 配 置 存 储 , 这 样 可 以 很 方 便 地 在 系 统 中 的 所 有 已 知 的 StorageClasses中 进 行 选 择 : < / p >
2020-06-23 23:46:27 +08:00
< figure id = "fig5.6.1.3.1" > < a href = "../images/create-gluster-storage.png" data-lightbox = "5adeb263-e749-436a-bd9a-9794d4a1aeca" data-title = "创建存储" > < img src = "../images/create-gluster-storage.png" alt = "创建存储" > < / a > < figcaption > 图 5.6.1.3.1: 创 建 存 储 < / figcaption > < / figure >
< figure id = "fig5.6.1.3.2" > < a href = "https://keithtenzer.files.wordpress.com/2017/03/screen-shot-2017-03-24-at-11-09-341.png?w=440" data-lightbox = "25036e99-eb52-4165-b48f-13f9924426ae" data-title = "Screen Shot 2017-03-24 at 11.09.34.png" target = "_blank" > < img src = "https://keithtenzer.files.wordpress.com/2017/03/screen-shot-2017-03-24-at-11-09-341.png?w=440" alt = "Screen Shot 2017-03-24 at 11.09.34.png" > < / a > < figcaption > 图 5.6.1.3.2: Screen Shot 2017-03-24 at 11.09.34.png< / figcaption > < / figure >
2020-06-19 14:52:56 +08:00
< p > 让 我 们 做 点 更 有 趣 的 事 情 , 在 OpenShift中 运 行 工 作 负 载 。 < / p >
< p > 在 仍 运 行 着 crs-storage项 目 的 OpenShift虚 拟 机 中 执 行 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc get templates -n openshift< / span >
< / code > < / pre >
< p > 你 应 该 可 以 看 到 一 个 应 用 程 序 和 数 据 库 模 板 列 表 , 这 个 列 表 将 方 便 你 更 轻 松 的 使 用 OpenShift来 部 署 你 的 应 用 程 序 项 目 。 < / p >
< p > 我 们 将 使 用 MySQL来 演 示 如 何 在 OpenShift上 部 署 具 有 持 久 化 和 弹 性 存 储 的 有 状 态 应 用 程 序 。 Mysql-persistent模 板 包 含 一 个 用 于 MySQL数 据 库 目 录 的 1G空 间 的 PVC。 为 了 演 示 目 的 , 可 以 直 接 使 用 默 认 值 。 < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc process mysql-persistent -n openshift | oc create -f -< / span >
< / code > < / pre >
< p > 等 待 部 署 完 成 。 你 可 以 通 过 UI或 者 命 令 行 观 察 部 署 进 度 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc get pods< / span >
NAME READY STATUS RESTARTS AGE
mysql-1-h4afb < span class = "token number" > 1< / span > /1 Running < span class = "token number" > 0< / span > 2m
< / code > < / pre >
< p > 好 了 。 我 们 已 经 使 用 这 个 模 板 创 建 了 一 个 service, secrets、 PVC和 pod。 我 们 来 使 用 它 ( 你 的 pod名 字 将 跟 我 的 不 同 ) : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc rsh mysql-1-h4afb< / span >
< / code > < / pre >
< p > 你 已 经 成 功 的 将 它 挂 载 到 MySQL的 pod上 。 我 们 连 接 一 下 数 据 库 试 试 : < / p >
< pre class = "language-" > < code class = "lang-bash" > sh-4.2$ mysql -u < span class = "token variable" > $MYSQL_USER< / span > -p< span class = "token variable" > $MYSQL_PASSWORD< / span > -h < span class = "token environment constant" > $HOSTNAME< / span > < span class = "token variable" > $MYSQL_DATABASE< / span >
< / code > < / pre >
< p > 这 点 很 方 便 , 所 有 重 要 的 配 置 , 如 MySQL凭 据 , 数 据 库 名 称 等 都 是 pod模 板 中 的 环 境 变 量 的 一 部 分 , 因 此 可 以 在 pod中 作 为 shell的 环 境 变 量 。 我 们 来 创 建 一 些 数 据 : < / p >
< pre class = "language-" > < code class = "lang-bash" > mysql< span class = "token operator" > > < / span > show databases< span class = "token punctuation" > ;< / span >
+--------------------+
< span class = "token operator" > |< / span > Database < span class = "token operator" > |< / span >
+--------------------+
< span class = "token operator" > |< / span > information_schema < span class = "token operator" > |< / span >
< span class = "token operator" > |< / span > sampledb < span class = "token operator" > |< / span >
+--------------------+
< span class = "token number" > 2< / span > rows < span class = "token keyword" > in< / span > < span class = "token builtin class-name" > set< / span > < span class = "token punctuation" > (< / span > < span class = "token number" > 0.02< / span > sec< span class = "token punctuation" > )< / span >
mysql< span class = "token operator" > > < / span > < span class = "token punctuation" > \< / span > u sampledb
Database changed
mysql< span class = "token operator" > > < / span > CREATE TABLE IF NOT EXISTS equipment < span class = "token punctuation" > (< / span >
-< span class = "token operator" > > < / span > equip_id int< span class = "token punctuation" > (< / span > < span class = "token number" > 5< / span > < span class = "token punctuation" > )< / span > NOT NULL AUTO_INCREMENT,
-< span class = "token operator" > > < / span > < span class = "token builtin class-name" > type< / span > varchar< span class = "token punctuation" > (< / span > < span class = "token number" > 50< / span > < span class = "token punctuation" > )< / span > DEFAULT NULL,
-< span class = "token operator" > > < / span > install_date DATE DEFAULT NULL,
-< span class = "token operator" > > < / span > color varchar< span class = "token punctuation" > (< / span > < span class = "token number" > 20< / span > < span class = "token punctuation" > )< / span > DEFAULT NULL,
-< span class = "token operator" > > < / span > working bool DEFAULT NULL,
-< span class = "token operator" > > < / span > location varchar< span class = "token punctuation" > (< / span > < span class = "token number" > 250< / span > < span class = "token punctuation" > )< / span > DEFAULT NULL,
-< span class = "token operator" > > < / span > PRIMARY KEY< span class = "token punctuation" > (< / span > equip_id< span class = "token punctuation" > )< / span >
-< span class = "token operator" > > < / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
Query OK, < span class = "token number" > 0< / span > rows affected < span class = "token punctuation" > (< / span > < span class = "token number" > 0.13< / span > sec< span class = "token punctuation" > )< / span >
mysql< span class = "token operator" > > < / span > INSERT INTO equipment < span class = "token punctuation" > (< / span > type, install_date, color, working, location< span class = "token punctuation" > )< / span >
-< span class = "token operator" > > < / span > VALUES
-< span class = "token operator" > > < / span > < span class = "token punctuation" > (< / span > < span class = "token string" > " Slide" < / span > , Now< span class = "token punctuation" > (< / span > < span class = "token punctuation" > )< / span > , < span class = "token string" > " blue" < / span > , < span class = "token number" > 1< / span > , < span class = "token string" > " Southwest Corner" < / span > < span class = "token punctuation" > )< / span > < span class = "token punctuation" > ;< / span >
Query OK, < span class = "token number" > 1< / span > row affected, < span class = "token number" > 1< / span > warning < span class = "token punctuation" > (< / span > < span class = "token number" > 0.01< / span > sec< span class = "token punctuation" > )< / span >
mysql< span class = "token operator" > > < / span > SELECT * FROM equipment< span class = "token punctuation" > ;< / span >
+----------+-------+--------------+-------+---------+------------------+
< span class = "token operator" > |< / span > equip_id < span class = "token operator" > |< / span > < span class = "token builtin class-name" > type< / span > < span class = "token operator" > |< / span > install_date < span class = "token operator" > |< / span > color < span class = "token operator" > |< / span > working < span class = "token operator" > |< / span > location < span class = "token operator" > |< / span >
+----------+-------+--------------+-------+---------+------------------+
< span class = "token operator" > |< / span > < span class = "token number" > 1< / span > < span class = "token operator" > |< / span > Slide < span class = "token operator" > |< / span > < span class = "token number" > 2017< / span > -03-24 < span class = "token operator" > |< / span > blue < span class = "token operator" > |< / span > < span class = "token number" > 1< / span > < span class = "token operator" > |< / span > Southwest Corner < span class = "token operator" > |< / span >
+----------+-------+--------------+-------+---------+------------------+
< span class = "token number" > 1< / span > row < span class = "token keyword" > in< / span > < span class = "token builtin class-name" > set< / span > < span class = "token punctuation" > (< / span > < span class = "token number" > 0.00< / span > sec< span class = "token punctuation" > )< / span >
< / code > < / pre >
< p > 很 好 , 数 据 库 运 行 正 常 。 < / p >
< p > 你 想 看 下 数 据 存 储 在 哪 里 吗 ? 很 简 单 ! 查 看 刚 使 用 模 板 创 建 的 mysql volume: < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # oc get pvc/mysql< / span >
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
mysql Bound pvc-a678b583-1082-11e7-afae-000c2949cce7 1Gi RWO 11m
< span class = "token comment" > # oc describe pv/pvc-a678b583-1082-11e7-afae-000c2949cce7< / span >
Name: pvc-a678b583-1082-11e7-afae-000c2949cce7
Labels:
StorageClass: container-ready-storage
Status: Bound
Claim: crs-storage/mysql
Reclaim Policy: Delete
Access Modes: RWO
Capacity: 1Gi
Message:
Source:
Type: Glusterfs < span class = "token punctuation" > (< / span > a Glusterfs < span class = "token function" > mount< / span > on the < span class = "token function" > host< / span > that shares a pod' s lifetime< span class = "token punctuation" > )< / span >
EndpointsName: gluster-dynamic-mysql
Path: vol_6299fc74eee513119dafd43f8a438db1
ReadOnly: < span class = "token boolean" > false< / span >
< / code > < / pre >
< p > GlusterFS的 volume名 字 是 vol_6299fc74eee513119dafd43f8a438db1。 回 到 你 的 GlusterFS虚 拟 机 中 , 输 入 : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # gluster volume info vol_6299fc74eee513119dafd43f8a438db< / span >
Volume Name: vol_6299fc74eee513119dafd43f8a438db1
Type: Replicate
Volume ID: 4115918f-28f7-4d4a-b3f5-4b9afe5b391f
Status: Started
Snapshot Count: < span class = "token number" > 0< / span >
Number of Bricks: < span class = "token number" > 1< / span > x < span class = "token number" > 3< / span > < span class = "token operator" > =< / span > < span class = "token number" > 3< / span >
Transport-type: tcp
Bricks:
Brick1: < span class = "token number" > 172.16< / span > .128.7:/var/lib/heketi/mounts/vg_67314f879686de975f9b8936ae43c5c5/brick_f264a47aa32be5d595f83477572becf8/brick
Brick2: < span class = "token number" > 172.16< / span > .128.8:/var/lib/heketi/mounts/vg_147b43f6f6903be8b23209903b7172ae/brick_f5731fe7175cbe6e6567e013c2591343/brick
Brick3: < span class = "token number" > 172.16< / span > .128.9:/var/lib/heketi/mounts/vg_72c0f520b0c57d807be21e9c90312f85/brick_ac6add804a6a467cd81cd1404841bbf1/brick
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
< / code > < / pre >
< p > 你 可 以 看 到 数 据 是 如 何 被 复 制 到 3个 GlusterFS块 的 。 我 们 从 中 挑 一 个 ( 最 好 挑 选 你 刚 登 陆 的 那 台 虚 拟 机 并 查 看 目 录 ) : < / p >
< pre class = "language-" > < code class = "lang-bash" > < span class = "token comment" > # ll /var/lib/heketi/mounts/vg_67314f879686de975f9b8936ae43c5c5/brick_f264a47aa32be5d595f83477572becf8/brick< / span >
total < span class = "token number" > 180300< / span >
-rw-r-----. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 56< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :11 auto.cnf
-rw-------. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 1676< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :11 ca-key.pem
-rw-r--r--. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 1075< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :11 ca.pem
-rw-r--r--. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 1079< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 client-cert.pem
-rw-------. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 1680< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 client-key.pem
-rw-r-----. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 352< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 ib_buffer_pool
-rw-r-----. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 12582912< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :20 ibdata1
-rw-r-----. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 79691776< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :20 ib_logfile0
-rw-r-----. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 79691776< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :11 ib_logfile1
-rw-r-----. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 12582912< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 ibtmp1
drwxr-s---. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 8192< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 mysql
-rw-r-----. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 2< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 mysql-1-h4afb.pid
drwxr-s---. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 8192< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 performance_schema
-rw-------. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 1676< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 private_key.pem
-rw-r--r--. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 452< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 public_key.pem
drwxr-s---. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 62< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :20 sampledb
-rw-r--r--. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 1079< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :11 server-cert.pem
-rw-------. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 1676< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :11 server-key.pem
drwxr-s---. < span class = "token number" > 2< / span > < span class = "token number" > 1000070000< / span > < span class = "token number" > 2001< / span > < span class = "token number" > 8192< / span > Mar < span class = "token number" > 24< / span > < span class = "token number" > 12< / span > :12 sys
< / code > < / pre >
< p > 你 可 以 在 这 里 看 到 MySQL数 据 库 目 录 。 它 使 用 GlusterFS作 为 后 端 存 储 , 并 作 为 绑 定 挂 载 给 MySQL容 器 使 用 。 如 果 你 检 查 OpenShift VM上 的 mount表 , 你 将 会 看 到 GlusterFS的 mount。 < / p >
< h3 id = "总结" > 总 结 < / h3 >
< p > 在 这 里 我 们 是 在 OpenShift之 外 创 建 了 一 个 简 单 但 功 能 强 大 的 GlusterFS存 储 池 。 该 池 可 以 独 立 于 应 用 程 序 扩 展 和 收 缩 。 该 池 的 整 个 生 命 周 期 由 一 个 简 单 的 称 为 heketi的 前 端 管 理 , 你 只 需 要 在 部 署 增 长 时 进 行 手 动 干 预 。 对 于 日 常 配 置 操 作 , 使 用 它 的 API与 OpenShifts动 态 配 置 器 交 互 , 无 需 开 发 人 员 直 接 与 基 础 架 构 团 队 进 行 交 互 。 < / p >
< p > o这 就 是 我 们 如 何 将 存 储 带 入 DevOps世 界 - 无 痛 苦 , 并 在 OpenShift PaaS系 统 的 开 发 人 员 工 具 中 直 接 提 供 。 < / p >
< p > GlusterFS和 OpenShift可 跨 越 所 有 环 境 : 裸 机 , 虚 拟 机 , 私 有 和 公 共 云 ( Azure, Google Cloud, AWS ...) , 确 保 应 用 程 序 可 移 植 性 , 并 避 免 云 供 应 商 锁 定 。 < / p >
< p > 祝 你 愉 快 在 容 器 中 使 用 GlusterFS! < / p >
< p > (c) 2017 Keith Tenzer< / p >
< p > 原 文 链 接 : < a href = "https://keithtenzer.com/2017/03/24/storage-for-containers-using-gluster-part-ii/" target = "_blank" > https://keithtenzer.com/2017/03/24/storage-for-containers-using-gluster-part-ii/< / a > < / p >
< footer class = "page-footer" > < span class = "copyright" > < a href = "https://cloudnative.to/contact/" target = "_blank" > 加 入 云 原 生 社 区 · 共 谱 云 原 生 新 篇 章 < / a > < p > < / p > Copyright © 2017-2020 | Distributed under < a href = "https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" target = "_blank" > CC BY 4.0< / a > | < a href = "https://jimmysong.io" target = "_blank" > jimmysong.io< / a > all right reserved, powered by Gitbook< / span > < span class = "footer-modification" > Updated at
2020-06-23 23:46:27 +08:00
2020-06-23 15:40:28
2020-06-19 14:52:56 +08:00
< / span > < / footer >
< / section >
< / div >
< div class = "search-results" >
< div class = "has-results" >
< h1 class = "search-results-title" > < span class = 'search-results-count' > < / span > results matching "< span class = 'search-query' > < / span > "< / h1 >
< ul class = "search-results-list" > < / ul >
< / div >
< div class = "no-results" >
< h1 class = "search-results-title" > No results matching "< span class = 'search-query' > < / span > "< / h1 >
< / div >
< / div >
< / div >
< / div >
< / div >
< / div >
< a href = "using-heketi-gluster-for-persistent-storage.html" class = "navigation navigation-prev " aria-label = "Previous page: 使用 Heketi 作为 Kubernetes 的持久存储 GlusterFS 的 external provisioner" >
< i class = "fa fa-angle-left" > < / i >
< / a >
< a href = "glusterd-2.0.html" class = "navigation navigation-next " aria-label = "Next page: GlusterD-2.0" >
< i class = "fa fa-angle-right" > < / i >
< / a >
< / div >
< script >
var gitbook = gitbook || [];
gitbook.push(function() {
2020-06-23 23:46:27 +08:00
gitbook.page.hasChanged({"page":{"title":"在 OpenShift 中使用 GlusterFS 做持久化存储","level":"5.6.1.3","depth":3,"next":{"title":"GlusterD-2.0","level":"5.6.2","depth":2,"path":"practice/glusterd-2.0.md","ref":"practice/glusterd-2.0.md","articles":[]},"previous":{"title":"使用 Heketi 作为 Kubernetes 的持久存储 GlusterFS 的 external provisioner","level":"5.6.1.2","depth":3,"path":"practice/using-heketi-gluster-for-persistent-storage.md","ref":"practice/using-heketi-gluster-for-persistent-storage.md","articles":[]},"dir":"ltr"},"config":{"plugins":["github","codesnippet","splitter","page-toc-button","image-captions","editlink","back-to-top-button","-lunr","-search","search-plus","github-buttons@2.1.0","favicon@^0.0.2","tbfed-pagefooter@^0.0.1","3-ba","theme-default","-highlight","prism","prism-themes","sitemap-general","lightbox","ga","copy-code-button","alerts"],"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"},"pluginsConfig":{"tbfed-pagefooter":{"copyright":"< a href = https://cloudnative.to/contact/ > 加入云原生社区·共谱云原生新篇章< / a > < / p > Copyright © 2017-2020 | Distributed under < a href = https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh > CC BY 4.0< / a > | < a href = https://jimmysong.io > jimmysong.io< / a > ","modify_label":" Updated at ","modify_format":"YYYY-MM-DD HH:mm:ss"},"prism":{"css":["prism-themes/themes/prism-ghcolors.css"]},"github":{"url":"https://github.com/rootsongjc/kubernetes-handbook"},"editlink":{"label":"编辑本页","multilingual":false,"base":"https://github.com/rootsongjc/kubernetes-handbook/blob/master/"},"splitter":{},"codesnippet":{},"sitemap-general":{"prefix":"https://jimmysong.io/kubernetes-handbook/"},"fontsettings":{"theme":"white","family":"sans","size":2},"favicon":{"shortcut":"favicon.ico","bookmark":"favicon.ico"},"lightbox":{"jquery":true,"sameUuid":false},"page-toc-button":{},"back-to-top-button":{},"prism-themes":{},"alerts":{},"github-buttons":{"repo":"rootsongjc/kubernetes-handbook","types":["star"],"size":"small"},"3-ba":{"configuration":"auto","token":"11f7d254cfa4e0ca44b175c66d379ecc"},"copy-code-button":{},"ga":{"configuration":"auto","token":"UA-93485976-1"},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"theme-default":{"showLevel":true,"styles":{"ebook":"styles/ebook.css","epub":"styles/epub.css","mobi":"styles/mobi.css","pdf":"styles/pdf.css","print":"styles/print.css","website":"styles/website.css"}},"search-plus":{},"image-captions":{"caption":"图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_: _CAPTION_","variable_name":"_pictures"}},"theme":"default","author":"Jimmy Song( 宋净超) ","pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{"_pictures":[{"backlink":"index.html#fig1.1.1","level":"1.1","list_caption":"Figure: Stargazers over time","alt":"Stargazers over time","nro":1,"url":"https://starcharts.herokuapp.com/rootsongjc/kubernetes-handbook.svg","index":1,"caption_template":"图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_: _CAPTION_","label":"Stargazers over time","attributes":{},"skip":false,"key":"1.1.1"},{"backlink":"cloud-native/play-with-kubernetes.html#fig2.3.1","level":"2.3","list_caption":"Figure: Play with Kubernetes网页截图","alt":"Play with Kubernetes网页截图","nro":2,"url":"../images/play-with-kubernetes.jpg","index":1,"caption_template":"图 _PAGE_LEVEL_._PAGE_IMAGE_NUMBER_: _CAPTION_","label":"Play with Kubernetes网页截图","attributes":{},"skip":false,"key":"2.3.1"},{"backlink":"cloud-native/cloud-native-local-quick-start.html#fig2.4.1","level":"2.4","list_caption":"Figure: Kubernetes dashboard","alt":"Kubernetes dashboard","nro":3,"url":"https
2020-06-19 14:52:56 +08:00
});
< / script >
< / div >
< script src = "../gitbook/gitbook.js" > < / script >
< script src = "../gitbook/theme.js" > < / script >
< script src = "../gitbook/gitbook-plugin-github/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-splitter/splitter.js" > < / script >
< script src = "../gitbook/gitbook-plugin-page-toc-button/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-editlink/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-back-to-top-button/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-search-plus/jquery.mark.min.js" > < / script >
< script src = "../gitbook/gitbook-plugin-search-plus/search.js" > < / script >
< script src = "../gitbook/gitbook-plugin-github-buttons/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-3-ba/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-lightbox/js/lightbox.min.js" > < / script >
< script src = "../gitbook/gitbook-plugin-ga/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-copy-code-button/toggle.js" > < / script >
< script src = "../gitbook/gitbook-plugin-alerts/plugin.js" > < / script >
< script src = "../gitbook/gitbook-plugin-sharing/buttons.js" > < / script >
< script src = "../gitbook/gitbook-plugin-fontsettings/fontsettings.js" > < / script >
< / body >
< / html >