diff --git a/.vuepress/config.js b/.vuepress/config.js
index dc5c228..3a616d4 100644
--- a/.vuepress/config.js
+++ b/.vuepress/config.js
@@ -349,21 +349,43 @@ module.exports = {
},
{
title: 'Open Capacity Platform',
- collapsable: false,
+ collapsable: true,
children: [
- ['k8s-practice/ocp/', 'OCP介绍'],
- 'k8s-practice/ocp/prepare',
- 'k8s-practice/ocp/build',
- 'k8s-practice/ocp/sequence',
- 'k8s-practice/ocp/eureka-server',
- 'k8s-practice/ocp/mysql',
- 'k8s-practice/ocp/redis',
- 'k8s-practice/ocp/auth-server',
- 'k8s-practice/ocp/user-center',
- 'k8s-practice/ocp/api-gateway',
- 'k8s-practice/ocp/back-center',
- 'k8s-practice/ocp/review',
- 'k8s-practice/ocp/export',
+ {
+ title: '准备',
+ collapsable: false,
+ path: '/learning/k8s-practice/ocp/',
+ children: [
+ ['k8s-practice/ocp/', 'OCP介绍'],
+ 'k8s-practice/ocp/prepare',
+ 'k8s-practice/ocp/build',
+ ]
+ },
+ {
+ title: '部署',
+ collapsable: false,
+ path: '/learning/k8s-practice/ocp/sequence.html',
+ children: [
+ 'k8s-practice/ocp/sequence',
+ 'k8s-practice/ocp/eureka-server',
+ 'k8s-practice/ocp/mysql',
+ 'k8s-practice/ocp/redis',
+ 'k8s-practice/ocp/auth-server',
+ 'k8s-practice/ocp/user-center',
+ 'k8s-practice/ocp/api-gateway',
+ 'k8s-practice/ocp/back-center',
+ 'k8s-practice/ocp/review',
+ ]
+ },
+ {
+ title: '多环境',
+ collapsable: false,
+ path: '/learning/k8s-practice/ocp/export.html',
+ children: [
+ 'k8s-practice/ocp/export',
+ 'k8s-practice/ocp/import',
+ ]
+ },
]
},
]
diff --git a/.vuepress/public/practice/ocp/kuboard_ocp_2019_10_01_13_58_04.yaml b/.vuepress/public/practice/ocp/kuboard_ocp_2019_10_01_13_58_04.yaml
new file mode 100644
index 0000000..62aee73
--- /dev/null
+++ b/.vuepress/public/practice/ocp/kuboard_ocp_2019_10_01_13_58_04.yaml
@@ -0,0 +1,733 @@
+
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ namespace: ocp
+ name: cloud-eureka
+ annotations:
+ k8s.eip.work/workload: cloud-eureka
+ k8s.eip.work/displayName: 服务注册中心
+ k8s.eip.work/service: NodePort
+ k8s.eip.work/ingress: 'true'
+ labels:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-eureka
+spec:
+ selector:
+ matchLabels:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-eureka
+ template:
+ metadata:
+ labels:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-eureka
+ spec:
+ imagePullSecrets:
+ - {}
+ restartPolicy: Always
+ initContainers: []
+ containers:
+ - image: 'ocpsample/eureka-server:latest'
+ imagePullPolicy: Always
+ name: eureka-server
+ volumeMounts: []
+ resources: {}
+ env:
+ - name: eureka.instance.prefer-ip-address
+ value: 'false'
+ envFrom:
+ - configMapRef:
+ name: ocp-config
+ volumes: []
+ replicas: 3
+ volumeClaimTemplates: []
+ serviceName: cloud-eureka
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: ocp
+ name: cloud-eureka
+ annotations:
+ k8s.eip.work/workload: cloud-eureka
+ k8s.eip.work/displayName: 服务注册中心
+ labels:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-eureka
+spec:
+ selector:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-eureka
+ type: NodePort
+ ports:
+ - port: 1111
+ targetPort: 1111
+ protocol: TCP
+ name: mpqzwr
+ nodePort: 31111
+
+---
+apiVersion: networking.k8s.io/v1beta1
+kind: Ingress
+metadata:
+ namespace: ocp
+ name: cloud-eureka
+ annotations:
+ k8s.eip.work/workload: cloud-eureka
+ k8s.eip.work/displayName: 服务注册中心
+ labels:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-eureka
+spec:
+ rules:
+ - host: cloud-eureka.ocp.demo.kuboard.cn
+ http:
+ paths:
+ - path: /
+ backend:
+ serviceName: cloud-eureka
+ servicePort: mpqzwr
+
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ namespace: ocp
+ name: cloud-redis
+ annotations:
+ k8s.eip.work/workload: cloud-redis
+ k8s.eip.work/displayName: Redis缓存
+ k8s.eip.work/service: ClusterIP
+ k8s.eip.work/ingress: 'false'
+ labels:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-redis
+spec:
+ selector:
+ matchLabels:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-redis
+ template:
+ metadata:
+ labels:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-redis
+ spec:
+ imagePullSecrets:
+ - {}
+ restartPolicy: Always
+ initContainers: []
+ containers:
+ - image: 'redis:4.0.14'
+ imagePullPolicy: Always
+ name: redis
+ volumeMounts: []
+ resources: {}
+ env: []
+ volumes: []
+ replicas: 1
+ volumeClaimTemplates: []
+ serviceName: cloud-redis
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: ocp
+ name: cloud-redis
+ annotations:
+ k8s.eip.work/workload: cloud-redis
+ k8s.eip.work/displayName: Redis缓存
+ labels:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-redis
+spec:
+ selector:
+ k8s.eip.work/layer: cloud
+ k8s.eip.work/name: cloud-redis
+ type: ClusterIP
+ ports:
+ - port: 6379
+ targetPort: 6379
+ protocol: TCP
+ name: xcndrj
+ nodePort: 0
+
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ namespace: ocp
+ name: db-auth-center
+ annotations:
+ k8s.eip.work/workload: db-auth-center
+ k8s.eip.work/displayName: 认证中心数据库
+ k8s.eip.work/service: ClusterIP
+ k8s.eip.work/ingress: 'false'
+ labels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-auth-center
+spec:
+ selector:
+ matchLabels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-auth-center
+ template:
+ metadata:
+ labels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-auth-center
+ spec:
+ imagePullSecrets:
+ - {}
+ restartPolicy: Always
+ initContainers: []
+ containers:
+ - image: 'ocpsample/auth-center-mysql:latest'
+ imagePullPolicy: Always
+ name: auth-center-mysql
+ volumeMounts: []
+ resources: {}
+ env:
+ - name: MYSQL_ROOT_PASSWORD
+ value: root
+ volumes: []
+ replicas: 1
+ volumeClaimTemplates: []
+ serviceName: db-auth-center
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: ocp
+ name: db-auth-center
+ annotations:
+ k8s.eip.work/workload: db-auth-center
+ k8s.eip.work/displayName: 认证中心数据库
+ labels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-auth-center
+spec:
+ selector:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-auth-center
+ type: ClusterIP
+ ports:
+ - port: 3306
+ targetPort: 3306
+ protocol: TCP
+ name: hzib57
+ nodePort: 0
+
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ namespace: ocp
+ name: db-log-center
+ annotations:
+ k8s.eip.work/workload: db-log-center
+ k8s.eip.work/displayName: 日志中心数据库
+ k8s.eip.work/service: ClusterIP
+ k8s.eip.work/ingress: 'false'
+ labels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-log-center
+spec:
+ selector:
+ matchLabels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-log-center
+ template:
+ metadata:
+ labels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-log-center
+ spec:
+ imagePullSecrets:
+ - {}
+ restartPolicy: Always
+ initContainers: []
+ containers:
+ - image: 'ocpsample/log-center-mysql:latest'
+ imagePullPolicy: Always
+ name: log-center-mysql
+ volumeMounts: []
+ resources: {}
+ env:
+ - name: MYSQL_ROOT_PASSWORD
+ value: root
+ volumes: []
+ replicas: 1
+ volumeClaimTemplates: []
+ serviceName: db-log-center
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: ocp
+ name: db-log-center
+ annotations:
+ k8s.eip.work/workload: db-log-center
+ k8s.eip.work/displayName: 日志中心数据库
+ labels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-log-center
+spec:
+ selector:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-log-center
+ type: ClusterIP
+ ports:
+ - port: 3306
+ targetPort: 3306
+ protocol: TCP
+ name: 4zep27
+ nodePort: 0
+
+---
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+ namespace: ocp
+ name: db-user-center
+ annotations:
+ k8s.eip.work/workload: db-user-center
+ k8s.eip.work/displayName: 用户中心数据库
+ k8s.eip.work/service: ClusterIP
+ k8s.eip.work/ingress: 'false'
+ labels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-user-center
+spec:
+ selector:
+ matchLabels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-user-center
+ template:
+ metadata:
+ labels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-user-center
+ spec:
+ imagePullSecrets:
+ - {}
+ restartPolicy: Always
+ initContainers: []
+ containers:
+ - image: 'ocpsample/user-center-mysql:latest'
+ imagePullPolicy: Always
+ name: user-center-mysql
+ volumeMounts: []
+ resources: {}
+ env:
+ - name: MYSQL_ROOT_PASSWORD
+ value: root
+ volumes: []
+ replicas: 1
+ volumeClaimTemplates: []
+ serviceName: db-user-center
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: ocp
+ name: db-user-center
+ annotations:
+ k8s.eip.work/workload: db-user-center
+ k8s.eip.work/displayName: 用户中心数据库
+ labels:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-user-center
+spec:
+ selector:
+ k8s.eip.work/layer: db
+ k8s.eip.work/name: db-user-center
+ type: ClusterIP
+ ports:
+ - port: 3306
+ targetPort: 3306
+ protocol: TCP
+ name: 2m2tyy
+ nodePort: 0
+
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: ocp
+ name: gateway-api
+ annotations:
+ k8s.eip.work/workload: gateway-api
+ k8s.eip.work/displayName: 接口网关
+ k8s.eip.work/service: ClusterIP
+ k8s.eip.work/ingress: 'true'
+ labels:
+ k8s.eip.work/layer: gateway
+ k8s.eip.work/name: gateway-api
+spec:
+ selector:
+ matchLabels:
+ k8s.eip.work/layer: gateway
+ k8s.eip.work/name: gateway-api
+ template:
+ metadata:
+ labels:
+ k8s.eip.work/layer: gateway
+ k8s.eip.work/name: gateway-api
+ spec:
+ imagePullSecrets:
+ - {}
+ restartPolicy: Always
+ initContainers: []
+ containers:
+ - image: 'ocpsample/api-gateway:latest'
+ imagePullPolicy: Always
+ name: api-gateway
+ volumeMounts: []
+ resources: {}
+ env:
+ - name: spring.datasource.druid.core.url
+ value: >-
+ jdbc:mysql://db-auth-center:3306/oauth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
+ envFrom:
+ - configMapRef:
+ name: ocp-config
+ volumes: []
+ replicas: 1
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: ocp
+ name: gateway-api
+ annotations:
+ k8s.eip.work/workload: gateway-api
+ k8s.eip.work/displayName: 接口网关
+ labels:
+ k8s.eip.work/layer: gateway
+ k8s.eip.work/name: gateway-api
+spec:
+ selector:
+ k8s.eip.work/layer: gateway
+ k8s.eip.work/name: gateway-api
+ type: ClusterIP
+ ports:
+ - port: 9200
+ targetPort: 9200
+ protocol: TCP
+ name: zmcdbh
+ nodePort: 0
+
+---
+apiVersion: networking.k8s.io/v1beta1
+kind: Ingress
+metadata:
+ namespace: ocp
+ name: gateway-api
+ annotations:
+ k8s.eip.work/workload: gateway-api
+ k8s.eip.work/displayName: 接口网关
+ labels:
+ k8s.eip.work/layer: gateway
+ k8s.eip.work/name: gateway-api
+spec:
+ rules:
+ - host: api-gateway.ocp.demo.kuboard.cn
+ http:
+ paths:
+ - path: /
+ backend:
+ serviceName: gateway-api
+ servicePort: zmcdbh
+
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: ocp
+ name: svc-auth-server
+ annotations:
+ k8s.eip.work/workload: svc-auth-server
+ k8s.eip.work/displayName: 认证中心
+ k8s.eip.work/service: ClusterIP
+ k8s.eip.work/ingress: 'true'
+ labels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-auth-server
+spec:
+ selector:
+ matchLabels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-auth-server
+ template:
+ metadata:
+ labels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-auth-server
+ spec:
+ imagePullSecrets: []
+ restartPolicy: Always
+ initContainers: []
+ containers:
+ - image: 'ocpsample/auth-server:latest'
+ imagePullPolicy: Always
+ name: auth-server
+ volumeMounts: []
+ resources: {}
+ env:
+ - name: spring.datasource.druid.core.url
+ value: >-
+ jdbc:mysql://db-auth-center:3306/oauth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
+ envFrom:
+ - configMapRef:
+ name: ocp-config
+ volumes: []
+ replicas: 1
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: ocp
+ name: svc-auth-server
+ annotations:
+ k8s.eip.work/workload: svc-auth-server
+ k8s.eip.work/displayName: 认证中心
+ labels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-auth-server
+spec:
+ selector:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-auth-server
+ type: ClusterIP
+ ports:
+ - port: 8000
+ targetPort: 8000
+ protocol: TCP
+ name: dzprby
+ nodePort: 0
+
+---
+apiVersion: networking.k8s.io/v1beta1
+kind: Ingress
+metadata:
+ namespace: ocp
+ name: svc-auth-server
+ annotations:
+ k8s.eip.work/workload: svc-auth-server
+ k8s.eip.work/displayName: 认证中心
+ labels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-auth-server
+spec:
+ rules:
+ - host: svc-auth-server.ocp.demo.kuboard.cn
+ http:
+ paths:
+ - path: /
+ backend:
+ serviceName: svc-auth-server
+ servicePort: dzprby
+
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: ocp
+ name: svc-user-center
+ annotations:
+ k8s.eip.work/workload: svc-user-center
+ k8s.eip.work/displayName: 用户中心
+ k8s.eip.work/service: ClusterIP
+ k8s.eip.work/ingress: 'true'
+ labels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-user-center
+spec:
+ selector:
+ matchLabels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-user-center
+ template:
+ metadata:
+ labels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-user-center
+ spec:
+ imagePullSecrets:
+ - {}
+ restartPolicy: Always
+ initContainers: []
+ containers:
+ - image: 'ocpsample/user-center:latest'
+ imagePullPolicy: Always
+ name: user-center
+ volumeMounts: []
+ resources: {}
+ env:
+ - name: spring.datasource.druid.core.url
+ value: >-
+ jdbc:mysql://db-user-center:3306/user-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
+ envFrom:
+ - configMapRef:
+ name: ocp-config
+ volumes: []
+ replicas: 1
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: ocp
+ name: svc-user-center
+ annotations:
+ k8s.eip.work/workload: svc-user-center
+ k8s.eip.work/displayName: 用户中心
+ labels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-user-center
+spec:
+ selector:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-user-center
+ type: ClusterIP
+ ports:
+ - port: 7000
+ targetPort: 7000
+ protocol: TCP
+ name: jhaxwk
+ nodePort: 0
+
+---
+apiVersion: networking.k8s.io/v1beta1
+kind: Ingress
+metadata:
+ namespace: ocp
+ name: svc-user-center
+ annotations:
+ k8s.eip.work/workload: svc-user-center
+ k8s.eip.work/displayName: 用户中心
+ labels:
+ k8s.eip.work/layer: svc
+ k8s.eip.work/name: svc-user-center
+spec:
+ rules:
+ - host: svc-user-center.ocp.demo.kuboard.cn
+ http:
+ paths:
+ - path: /
+ backend:
+ serviceName: svc-user-center
+ servicePort: jhaxwk
+
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ namespace: ocp
+ name: web-back-center
+ annotations:
+ k8s.eip.work/workload: web-back-center
+ k8s.eip.work/displayName: 后台中心
+ k8s.eip.work/service: ClusterIP
+ k8s.eip.work/ingress: 'true'
+ labels:
+ k8s.eip.work/layer: web
+ k8s.eip.work/name: web-back-center
+spec:
+ selector:
+ matchLabels:
+ k8s.eip.work/layer: web
+ k8s.eip.work/name: web-back-center
+ template:
+ metadata:
+ labels:
+ k8s.eip.work/layer: web
+ k8s.eip.work/name: web-back-center
+ spec:
+ imagePullSecrets:
+ - {}
+ restartPolicy: Always
+ initContainers: []
+ containers:
+ - image: 'ocpsample/back-center:latest'
+ imagePullPolicy: Always
+ name: back-center
+ volumeMounts: []
+ resources: {}
+ env: []
+ envFrom:
+ - configMapRef:
+ name: ocp-config
+ volumes: []
+ replicas: 1
+
+---
+apiVersion: v1
+kind: Service
+metadata:
+ namespace: ocp
+ name: web-back-center
+ annotations:
+ k8s.eip.work/workload: web-back-center
+ k8s.eip.work/displayName: 后台中心
+ labels:
+ k8s.eip.work/layer: web
+ k8s.eip.work/name: web-back-center
+spec:
+ selector:
+ k8s.eip.work/layer: web
+ k8s.eip.work/name: web-back-center
+ type: ClusterIP
+ ports:
+ - port: 80
+ targetPort: 80
+ protocol: TCP
+ name: rxcrxf
+ nodePort: 0
+
+---
+apiVersion: networking.k8s.io/v1beta1
+kind: Ingress
+metadata:
+ namespace: ocp
+ name: web-back-center
+ annotations:
+ k8s.eip.work/workload: web-back-center
+ k8s.eip.work/displayName: 后台中心
+ labels:
+ k8s.eip.work/layer: web
+ k8s.eip.work/name: web-back-center
+spec:
+ rules:
+ - host: back-center.ocp.demo.kuboard.cn
+ http:
+ paths:
+ - path: /
+ backend:
+ serviceName: web-back-center
+ servicePort: rxcrxf
+
+---
+metadata:
+ name: ocp-config
+ namespace: ocp
+data:
+ CLOUD_EUREKA_URL: 'http://cloud-eureka.ocp.demo.kuboard.cn/'
+ GATEWAY_API_URL: 'http://api-gateway.ocp.demo.kuboard.cn/'
+ eureka.client.serviceUrl.defaultZone: >-
+ http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka
+ spring.datasource.druid.log.url: >-
+ jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
+ spring.redis.host: cloud-redis
+kind: ConfigMap
+
diff --git a/README.md b/README.md
index b57b53c..9a71cf1 100644
--- a/README.md
+++ b/README.md
@@ -86,19 +86,21 @@ Kubernetes教程的主要依据是:Kubernetes 官网文档,以及使用 Kubo
在 Kubernetes 上部署 Spring Cloud 微服务:(Open Capacity Platform)
-* [OCP介绍](https://kuboard.cn/learning/k8s-practice/ocp/)
-* [准备OCP的构建环境和部署环境](https://kuboard.cn/learning/k8s-practice/ocp/prepare.html)
-* [构建Docker镜像并推送到仓库](https://kuboard.cn/learning/k8s-practice/ocp/build.html)
-* [部署顺序](https://kuboard.cn/learning/k8s-practice/ocp/sequence.html)
-* [在K8S上部署eureka-server](https://kuboard.cn/learning/k8s-practice/ocp/eureka-server.html)
-* [在K8S上部署mysql](https://kuboard.cn/learning/k8s-practice/ocp/mysql.html)
-* [在K8S上部署redis](https://kuboard.cn/learning/k8s-practice/ocp/redis.html)
-* [在K8S上部署auth-server](https://kuboard.cn/learning/k8s-practice/ocp/auth-server.html)
-* [在K8S上部署user-center](https://kuboard.cn/learning/k8s-practice/ocp/user-center.html)
-* [在K8S上部署api-gateway](https://kuboard.cn/learning/k8s-practice/ocp/api-gateway.html)
-* [在K8S上部署back-center](https://kuboard.cn/learning/k8s-practice/ocp/back-center.html)
-* [重新审视配置信息](https://kuboard.cn/learning/k8s-practice/ocp/review.html)
-* [导出部署配置]
-* [在新的名称空间导入部署配置]
+* 准备
+ * [准备OCP的构建环境和部署环境](https://kuboard.cn/learning/k8s-practice/ocp/prepare.html)
+ * [构建docker镜像并推送到仓库](https://kuboard.cn/learning/k8s-practice/ocp/build.html)
+* 部署
+ * [部署顺序](https://kuboard.cn/learning/k8s-practice/ocp/sequence.html)
+ * [在K8S上部署eureka-server](https://kuboard.cn/learning/k8s-practice/ocp/eureka-server.html)
+ * [在K8S上部署mysql](https://kuboard.cn/learning/k8s-practice/ocp/mysql.html)
+ * [在K8S上部署redis](https://kuboard.cn/learning/k8s-practice/ocp/redis.html)
+ * [在K8S上部署auth-server](https://kuboard.cn/learning/k8s-practice/ocp/auth-server.html)
+ * [在K8S上部署user-center](https://kuboard.cn/learning/k8s-practice/ocp/user-server.html)
+ * [在K8S上部署api-gateway](https://kuboard.cn/learning/k8s-practice/ocp/api-gateway.html)
+ * [在K8S上部署back-center](https://kuboard.cn/learning/k8s-practice/ocp/back-center.html)
+ * [重新审视配置信息](https://kuboard.cn/learning/k8s-practice/ocp/review.html)
+* 多环境
+ * [导出部署配置](https://kuboard.cn/learning/k8s-practice/ocp/export.html)
+ * [导入部署配置](https://kuboard.cn/learning/k8s-practice/ocp/import.html)
Kuboard官网免费提供 K8S教程,K8S安装文档,学习过程中如有疑问,请加QQ群在线答疑。
diff --git a/learning/README.md b/learning/README.md
index 7bc101d..5db1c63 100644
--- a/learning/README.md
+++ b/learning/README.md
@@ -84,17 +84,19 @@ description: Kubernetes免费中文教程目录
在 Kubernetes 上部署 Spring Cloud 微服务:(Open Capacity Platform)
-* [OCP介绍](/learning/k8s-practice/ocp/)
-* [准备OCP的构建环境和部署环境](/learning/k8s-practice/ocp/prepare.html)
-* [构建docker镜像并推送到仓库](/learning/k8s-practice/ocp/build.html)
-* [部署顺序](/learning/k8s-practice/ocp/sequence.html)
-* [在K8S上部署eureka-server](/learning/k8s-practice/ocp/eureka-server.html)
-* [在K8S上部署mysql](/learning/k8s-practice/ocp/mysql.html)
-* [在K8S上部署redis](/learning/k8s-practice/ocp/redis.html)
-* [在K8S上部署auth-center](/learning/k8s-practice/ocp/auth-server.html)
-* [在K8S上部署user-center](/learning/k8s-practice/ocp/user-center.html)
-* [在K8S上部署api-gateway](/learning/k8s-practice/ocp/api-gateway.html)
-* [在K8S上部署back-center](/learning/k8s-practice/ocp/back-center.html)
-* [重新审视配置信息](/learning/k8s-practice/ocp/review.html)
-* [导出部署配置]
-* [在新的名称空间导入部署配置]
+* 准备
+ * [准备OCP的构建环境和部署环境](/learning/k8s-practice/ocp/prepare.html)
+ * [构建docker镜像并推送到仓库](/learning/k8s-practice/ocp/build.html)
+* 部署
+ * [部署顺序](/learning/k8s-practice/ocp/sequence.html)
+ * [在K8S上部署eureka-server](/learning/k8s-practice/ocp/eureka-server.html)
+ * [在K8S上部署mysql](/learning/k8s-practice/ocp/mysql.html)
+ * [在K8S上部署redis](/learning/k8s-practice/ocp/redis.html)
+ * [在K8S上部署auth-server](/learning/k8s-practice/ocp/auth-server.html)
+ * [在K8S上部署user-center](/learning/k8s-practice/ocp/user-server.html)
+ * [在K8S上部署api-gateway](/learning/k8s-practice/ocp/api-gateway.html)
+ * [在K8S上部署back-center](/learning/k8s-practice/ocp/back-center.html)
+ * [重新审视配置信息](/learning/k8s-practice/ocp/review.html)
+* 多环境
+ * [导出部署配置](/learning/k8s-practice/ocp/export.html)
+ * [导入部署配置](/learning/k8s-practice/ocp/import.html)
diff --git a/learning/k8s-practice/ocp/export.assets/image-20191001125319936.png b/learning/k8s-practice/ocp/export.assets/image-20191001125319936.png
new file mode 100644
index 0000000..bdf9d36
Binary files /dev/null and b/learning/k8s-practice/ocp/export.assets/image-20191001125319936.png differ
diff --git a/learning/k8s-practice/ocp/export.assets/image-20191001125449800.png b/learning/k8s-practice/ocp/export.assets/image-20191001125449800.png
new file mode 100644
index 0000000..7a24ead
Binary files /dev/null and b/learning/k8s-practice/ocp/export.assets/image-20191001125449800.png differ
diff --git a/learning/k8s-practice/ocp/export.assets/image-20191001125539949.png b/learning/k8s-practice/ocp/export.assets/image-20191001125539949.png
new file mode 100644
index 0000000..10a1de6
Binary files /dev/null and b/learning/k8s-practice/ocp/export.assets/image-20191001125539949.png differ
diff --git a/learning/k8s-practice/ocp/export.assets/image-20191001125606055.png b/learning/k8s-practice/ocp/export.assets/image-20191001125606055.png
new file mode 100644
index 0000000..38a5c0f
Binary files /dev/null and b/learning/k8s-practice/ocp/export.assets/image-20191001125606055.png differ
diff --git a/learning/k8s-practice/ocp/export.assets/image-20191001131142691.png b/learning/k8s-practice/ocp/export.assets/image-20191001131142691.png
new file mode 100644
index 0000000..9441afa
Binary files /dev/null and b/learning/k8s-practice/ocp/export.assets/image-20191001131142691.png differ
diff --git a/learning/k8s-practice/ocp/export.md b/learning/k8s-practice/ocp/export.md
index a4277e3..31690cc 100644
--- a/learning/k8s-practice/ocp/export.md
+++ b/learning/k8s-practice/ocp/export.md
@@ -10,8 +10,38 @@ meta:
# 导出部署配置
-
-
-
+通过本系列文章前面的部分,我们终于完整了 Spring Cloud OCP 的核心组件在 Kubernetes 上的部署。此时,Kuboard 的名称空间 `ocp` 界面的截图如下所示:

+
+接下来,立刻要面临的问题是:假设刚部署完的环境是用于开发的,那我们如何快速部署一个新的环境用于测试呢?
+
+Kuboard 支持您将此名称空间界面导出到一个 yaml 文件,并在另一个名称空间(或Kubernetes集群)中导入所有的配置。本文档后面的部分将描述导出配置的过程:
+
+* 点击 **导出工作负载** 按钮
+
+ 选择 **展现层**、**网关层**、**服务层**、**持久层**、**中间件** 五个分层,点击刷新,然后全选所有的工作负载,如下图所示:
+
+ 
+
+* 点击 **下一步** 按钮
+
+ 选择 `ocp-config`,如下图所示:
+
+ 
+
+* 点击 **下一步** 按钮
+
+ 
+
+* 点击 **下一步** 按钮
+
+ 
+
+* 点击 **确定** 按钮
+
+ 并保存文件,文件名格式为 `kuboard_名称空间_年_月_日_时_分_秒.yaml`,例如 `kuboard_ocp_2019_10_01_12_56_14.yaml`
+
+ 
+
+:tada: :tada: :tada: 您已完成了部署和配置信息的导出,下一步可以在新的名称空间直接导入,请参考 [导入部署配置](./import.html)
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001141313966.png b/learning/k8s-practice/ocp/import.assets/image-20191001141313966.png
new file mode 100644
index 0000000..a76b089
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001141313966.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001141409779.png b/learning/k8s-practice/ocp/import.assets/image-20191001141409779.png
new file mode 100644
index 0000000..108e220
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001141409779.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001141454878.png b/learning/k8s-practice/ocp/import.assets/image-20191001141454878.png
new file mode 100644
index 0000000..efa534c
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001141454878.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001141532125.png b/learning/k8s-practice/ocp/import.assets/image-20191001141532125.png
new file mode 100644
index 0000000..b1fe8f6
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001141532125.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001141554887.png b/learning/k8s-practice/ocp/import.assets/image-20191001141554887.png
new file mode 100644
index 0000000..7ced7e1
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001141554887.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001141654177.png b/learning/k8s-practice/ocp/import.assets/image-20191001141654177.png
new file mode 100644
index 0000000..7d5d1ca
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001141654177.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001141951560.png b/learning/k8s-practice/ocp/import.assets/image-20191001141951560.png
new file mode 100644
index 0000000..a1d320e
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001141951560.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001142507168.png b/learning/k8s-practice/ocp/import.assets/image-20191001142507168.png
new file mode 100644
index 0000000..53c4f5b
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001142507168.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001142617667.png b/learning/k8s-practice/ocp/import.assets/image-20191001142617667.png
new file mode 100644
index 0000000..fb7c57d
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001142617667.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001142642948.png b/learning/k8s-practice/ocp/import.assets/image-20191001142642948.png
new file mode 100644
index 0000000..75bdc77
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001142642948.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001142831089.png b/learning/k8s-practice/ocp/import.assets/image-20191001142831089.png
new file mode 100644
index 0000000..fd0c750
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001142831089.png differ
diff --git a/learning/k8s-practice/ocp/import.assets/image-20191001142955738.png b/learning/k8s-practice/ocp/import.assets/image-20191001142955738.png
new file mode 100644
index 0000000..2559ddb
Binary files /dev/null and b/learning/k8s-practice/ocp/import.assets/image-20191001142955738.png differ
diff --git a/learning/k8s-practice/ocp/import.md b/learning/k8s-practice/ocp/import.md
new file mode 100644
index 0000000..67bca73
--- /dev/null
+++ b/learning/k8s-practice/ocp/import.md
@@ -0,0 +1,137 @@
+---
+vssueId: 105
+titlePrefix: 部署SpringCloud_OCP
+layout: LearningLayout
+description: Kubernetes教程_使用Kuboard在Kubernetes上部署Spring_Cloud微服务平台OCP_open_capacity_platform微服务能力开放平台_导入部署配置
+meta:
+ - name: keywords
+ content: Kubernetes部署SpringCloud,Kubernetes部署OCP,Kuboard部署OCP
+---
+
+# 导入部署配置
+
+
+
+## 获得yaml文件
+
+在 [导出部署配置](./export.html) 中,我们将 Spring Cloud OCP 部署相关的所有信息导出到一个 yaml 文件,本文描述如何在一个新的名称空间(或者新的 Kubernetes 集群)中导入该部署信息,并形成一个新的独立的部署环境。
+
+如果您还没有该 yaml 文件,可从此处
+下载 OCP部署yaml文件
+
+## 导入yaml文件
+
+假设您已创建了名称空间 `ocp-import` 用来导入部署配置。请参考接下来的导入步骤:
+
+* 点击 **导入工作负载** 按钮
+
+ 在此界面中上传前一个步骤导出的(或从 www.kuboard.cn 下载的)yaml 文件。如下图所示:
+
+ 
+
+* 点击 **下一步** 按钮
+
+ 全选所有的工作负载,如下图所示:
+
+ 
+
+* 点击 **下一步** 按钮
+
+ 选中 `ocp-config` 如下图所示:
+
+ 
+
+* 点击 **下一步** 按钮
+
+ 如下图所示:
+
+ 
+
+* 点击 **下一步** 按钮
+
+ 如下图所示:
+
+ 
+
+* 点击 **下一步** 按钮
+
+ 勾选 `使用随机端口` 此处由于我们在原集群的新名称空间中导入配置,因此,需要修改节点端口号,以避免冲突。如果您不知道该怎么分配端口号,可以在节点端口字段填写 `0`,集群将自动为您分配可用的节点端口。
+
+ 
+
+* 点击 **下一步** 按钮
+
+ 在此界面中调整对外的域名,以避免和原名称空间的部署产生域名冲突,如下图所示:
+
+ * cloud-eureka.ocp-import.demo.kuboard.cn
+ * api-gateway.ocp-import.demo.kuboard.cn
+ * svc-auth-server.ocp-import.demo.kuboard.cn
+ * svc-user-center.ocp-import.demo.kuboard.cn
+ * back-center.ocp-import.demo.kuboard.cn
+
+ 
+
+* 点击 **确定** 按钮
+
+ 
+
+* 点击 **应用** 按钮
+
+ 
+
+* 点击 **完成** 按钮
+
+* 此时进入名称空间,可看到所有的配置和部署都已经完成导入。
+
+
+
+## 导入后调整
+
+* 导入到新的名称空间以后,ConfigMap中配置参数受到影响的部分需要调整,如下图所示:
+ * eureka.client.serviceUrl.defaultZone = `http://cloud-eureka-0.cloud-eureka.ocp-import.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp-import.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp-import.svc.cluster.local:1111/eureka`
+ * spring.datasource.druid.log.url = `jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false`
+ * spring.redis.host = `cloud-redis`
+ * GATEWAY_API_URL = `http://api-gateway.ocp-import.demo.kuboard.cn/`
+ * CLOUD_EUREKA_URL = `http://cloud-eureka.ocp-import.demo.kuboard.cn/`
+
+ 
+
+* 由于 ConfigMap 中的参数发生了变化,此时必须删除所以引用该 ConfigMap 中的容器组,Kubernetes 将自动创建新的容器组以替换被删除的容器组,新的容器组中,ConfigMap 的变更将生效。
+
+ 点击名称空间上方的 **容器组列表** 按钮,全选,并删除,如下图所示:
+
+ 
+
+## 验证配置
+
+* 在浏览器打开 `http://back-end.ocp-import.demo.kuboard.cn` (此域名已失效,以节省演示服务器空间,请使用您自己的域名),可登录 OCP 后台中心的界面。
+
+:tada: :tada: :tada: 您成功学会了如何使用 Kuboard 快速复制一份 Spring Cloud 微服务架构的部署环境。
+
+## Kuboard授权
+
+使用 Kuboard 是免费的,请查看 [Kuboard 授权声明](/support/)
diff --git a/learning/k8s-practice/ocp/index.md b/learning/k8s-practice/ocp/index.md
index 5a41de1..e868100 100644
--- a/learning/k8s-practice/ocp/index.md
+++ b/learning/k8s-practice/ocp/index.md
@@ -9,27 +9,30 @@ description: Kubernetes教程_使用Kuboard在Kubernetes上部署Spring_Cloud微
## 使用 Kuboard 在 K8S 上部署 OCP
-Kuboard 网站将陆续 **连载** 如何使用 Kuboard 在 Kubernetes 上部署 OCP 的如下组件:
+本系列文章将描述如何使用 Kuboard 在 Kubernetes 上部署 OCP 的如下组件:
* eureka-server
* auth-server
* user-center
* api-gateway
* back-center
-该系列连载文章的目录如下:
-* [准备OCP的构建环境和部署环境](/learning/k8s-practice/ocp/prepare.html)
-* [构建docker镜像并推送到仓库](/learning/k8s-practice/ocp/build.html)
-* [部署顺序](/learning/k8s-practice/ocp/sequence.html)
-* [在K8S上部署eureka-server](/learning/k8s-practice/ocp/eureka-server.html)
-* [在K8S上部署mysql](/learning/k8s-practice/ocp/mysql.html)
-* [在K8S上部署redis](/learning/k8s-practice/ocp/redis.html)
-* [在K8S上部署auth-server](/learning/k8s-practice/ocp/auth-server.html)
-* [在K8S上部署user-center](/learning/k8s-practice/ocp/user-server.html)
-* [在K8S上部署api-gateway](/learning/k8s-practice/ocp/api-gateway.html)
-* [在K8S上部署back-center](/learning/k8s-practice/ocp/back-center.html)
-* [重新审视配置信息](/learning/k8s-practice/ocp/review.html)
-* [导出部署配置](/learning/k8s-practice/ocp/export.html)
-* [在新的名称空间导入部署配置]
+该系列文章的目录如下:
+* 准备
+ * [准备OCP的构建环境和部署环境](/learning/k8s-practice/ocp/prepare.html)
+ * [构建docker镜像并推送到仓库](/learning/k8s-practice/ocp/build.html)
+* 部署
+ * [部署顺序](/learning/k8s-practice/ocp/sequence.html)
+ * [在K8S上部署eureka-server](/learning/k8s-practice/ocp/eureka-server.html)
+ * [在K8S上部署mysql](/learning/k8s-practice/ocp/mysql.html)
+ * [在K8S上部署redis](/learning/k8s-practice/ocp/redis.html)
+ * [在K8S上部署auth-server](/learning/k8s-practice/ocp/auth-server.html)
+ * [在K8S上部署user-center](/learning/k8s-practice/ocp/user-server.html)
+ * [在K8S上部署api-gateway](/learning/k8s-practice/ocp/api-gateway.html)
+ * [在K8S上部署back-center](/learning/k8s-practice/ocp/back-center.html)
+ * [重新审视配置信息](/learning/k8s-practice/ocp/review.html)
+* 多环境
+ * [导出部署配置](/learning/k8s-practice/ocp/export.html)
+ * [导入部署配置](/learning/k8s-practice/ocp/import.html)
::: tip OCP答疑
与 OCP 相关的问题,请加 OCP 的 QQ群 483725710
diff --git a/learning/k8s-practice/ocp/review.assets/image-20191001090827800.png b/learning/k8s-practice/ocp/review.assets/image-20191001090827800.png
deleted file mode 100644
index c1b7180..0000000
Binary files a/learning/k8s-practice/ocp/review.assets/image-20191001090827800.png and /dev/null differ
diff --git a/learning/k8s-practice/ocp/review.assets/image-20191001135132953.png b/learning/k8s-practice/ocp/review.assets/image-20191001135132953.png
new file mode 100644
index 0000000..7d29d73
Binary files /dev/null and b/learning/k8s-practice/ocp/review.assets/image-20191001135132953.png differ
diff --git a/learning/k8s-practice/ocp/review.md b/learning/k8s-practice/ocp/review.md
index 6597462..12771e3 100644
--- a/learning/k8s-practice/ocp/review.md
+++ b/learning/k8s-practice/ocp/review.md
@@ -126,13 +126,14 @@ meta:
可参考文档 [使用ConfigMap配置您的应用程序](/learning/k8s-intermediate/config/config-map.html#configmap-%E5%AE%B9%E5%99%A8%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%EF%BC%88configmap%E7%9A%84%E6%89%80%E6%9C%89%E5%90%8D%E5%80%BC%E5%AF%B9%EF%BC%89)
* 在 Kuboard 界面中进入 `ocp` 名称空间
-* 创建ConfigMap,并填入三个名值对:
-
+* 创建ConfigMap,并填入五个名值对:
* eureka.client.serviceUrl.defaultZone = `http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka`
* spring.datasource.druid.log.url = `jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false`
* spring.redis.host = `cloud-redis`
+ * GATEWAY_API_URL = `http://api-gateway.ocp.demo.kuboard.cn/`
+ * CLOUD_EUREKA_URL = `http://cloud-eureka.ocp.demo.kuboard.cn/`
- 
+ 
* 修改 eureka-server、auth-server、user-center、api-gateway 的部署信息,将上面创建的 ConfigMap 中所有名值对注入到容器的环境变量,并去除已经在 ConfigMap 中包含的环境变量。
@@ -149,11 +150,13 @@ meta:
在本教程中,为了避免对 OCP 已有代码的修改,因此以直接注入 `spring.datasource.druid.log.url` 类似的环境变量的方式,使docker镜像适应不同的环境(开发环境、测试环境、生产环境等)。这种做法就会碰到一个比较尴尬的情况,例如,对于参数 `spring.datasource.druid.core.url` 键值相同,而不同模块中(auth-server、user-center、api-gateway)取值却不同。这是从参数使用者视角来看不可避免的现象。
一个建议的方式是,从参数提供者的视角来定义环境变量参数,并由参数使用者引用。例如,我们定义如下几个ConfigMap属性:
-* EUREKA_URLS=http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka
-* DB_AUTH_CENTER_URL=jdbc:mysql://db-auth-center:3306/auth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
-* DB_USER_CENTER_URL=jdbc:mysql://db-user-center:3306/user-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
-* DB_LOG_CENTER_URL=jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
-* REDIS_HOST=cloud-redis
+* EUREKA_URLS = `http://cloud-eureka-0.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-1.cloud-eureka.ocp.svc.cluster.local:1111/eureka,http://cloud-eureka-2.cloud-eureka.ocp.svc.cluster.local:1111/eureka`
+* DB_AUTH_CENTER_URL = `jdbc:mysql://db-auth-center:3306/auth-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false`
+* DB_USER_CENTER_URL= `jdbc:mysql://db-user-center:3306/user-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false`
+* DB_LOG_CENTER_URL = `jdbc:mysql://db-log-center:3306/log-center?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false`
+* REDIS_HOST = `cloud-redis`
+* GATEWAY_API_URL = `http://api-gateway.ocp.demo.kuboard.cn/`
+* CLOUD_EUREKA_URL = `http://cloud-eureka.ocp.demo.kuboard.cn/`
然后在参数使用者的 `application.xml` 中引用这些环境变量参数,以 auth-center 的 `application.xml` 为例:
diff --git a/overview/README.md b/overview/README.md
index 8742087..35ea41f 100644
--- a/overview/README.md
+++ b/overview/README.md
@@ -176,20 +176,22 @@ Kuboard 为 Kubernetes 初学者设计了如下学习路径:
在 Kubernetes 上部署 Spring Cloud 微服务:(Open Capacity Platform)
-* [OCP介绍](/learning/k8s-practice/ocp/)
-* [准备OCP的构建环境和部署环境](/learning/k8s-practice/ocp/prepare.html)
-* [构建docker镜像并推送到仓库](/learning/k8s-practice/ocp/build.html)
-* [部署顺序](/learning/k8s-practice/ocp/sequence.html)
-* [在K8S上部署eureka-server](/learning/k8s-practice/ocp/eureka-server.html)
-* [在K8S上部署mysql](/learning/k8s-practice/ocp/mysql.html)
-* [在K8S上部署redis](/learning/k8s-practice/ocp/redis.html)
-* [在K8S上部署auth-center](/learning/k8s-practice/ocp/auth-server.html)
-* [在K8S上部署user-center](/learning/k8s-practice/ocp/user-center.html)
-* [在K8S上部署api-gateway](/learning/k8s-practice/ocp/api-gateway.html)
-* [在K8S上部署back-center](/learning/k8s-practice/ocp/back-center.html)
-* [重新审视配置信息](/learning/k8s-practice/ocp/review.html)
-* [导出部署配置]
-* [在新的名称空间导入部署配置]
+* 准备
+ * [准备OCP的构建环境和部署环境](/learning/k8s-practice/ocp/prepare.html)
+ * [构建docker镜像并推送到仓库](/learning/k8s-practice/ocp/build.html)
+* 部署
+ * [部署顺序](/learning/k8s-practice/ocp/sequence.html)
+ * [在K8S上部署eureka-server](/learning/k8s-practice/ocp/eureka-server.html)
+ * [在K8S上部署mysql](/learning/k8s-practice/ocp/mysql.html)
+ * [在K8S上部署redis](/learning/k8s-practice/ocp/redis.html)
+ * [在K8S上部署auth-server](/learning/k8s-practice/ocp/auth-server.html)
+ * [在K8S上部署user-center](/learning/k8s-practice/ocp/user-server.html)
+ * [在K8S上部署api-gateway](/learning/k8s-practice/ocp/api-gateway.html)
+ * [在K8S上部署back-center](/learning/k8s-practice/ocp/back-center.html)
+ * [重新审视配置信息](/learning/k8s-practice/ocp/review.html)
+* 多环境
+ * [导出部署配置](/learning/k8s-practice/ocp/export.html)
+ * [导入部署配置](/learning/k8s-practice/ocp/import.html)
### Kubernetes 有经验者