diff --git a/.vuepress/config-sidebar.js b/.vuepress/config-sidebar.js
index 4015747..381a64d 100644
--- a/.vuepress/config-sidebar.js
+++ b/.vuepress/config-sidebar.js
@@ -434,6 +434,13 @@ module.exports = {
},
]
},
+ // {
+ // title: '部署LNMP应用',
+ // collapsable: true,
+ // children: [
+ // '/learning/k8s-practice/lnmp/wordpress'
+ // ]
+ // }
]
}
],
diff --git a/.vuepress/public/statics/learning/ptc/lnmp/wordpress-deployment.yaml b/.vuepress/public/statics/learning/ptc/lnmp/wordpress-deployment.yaml
new file mode 100644
index 0000000..d898474
--- /dev/null
+++ b/.vuepress/public/statics/learning/ptc/lnmp/wordpress-deployment.yaml
@@ -0,0 +1,67 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: wordpress
+ labels:
+ app: wordpress
+spec:
+ ports:
+ - port: 80
+ selector:
+ app: wordpress
+ tier: frontend
+ type: LoadBalancer
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: wp-pv-claim
+ labels:
+ app: wordpress
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 20Gi
+---
+apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
+kind: Deployment
+metadata:
+ name: wordpress
+ labels:
+ app: wordpress
+spec:
+ selector:
+ matchLabels:
+ app: wordpress
+ tier: frontend
+ strategy:
+ type: Recreate
+ template:
+ metadata:
+ labels:
+ app: wordpress
+ tier: frontend
+ spec:
+ containers:
+ - image: wordpress:4.8-apache
+ name: wordpress
+ env:
+ - name: WORDPRESS_DB_HOST
+ value: wordpress-mysql
+ - name: WORDPRESS_DB_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: mysql-pass
+ key: password
+ ports:
+ - containerPort: 80
+ name: wordpress
+ volumeMounts:
+ - name: wordpress-persistent-storage
+ mountPath: /var/www/html
+ volumes:
+ - name: wordpress-persistent-storage
+ persistentVolumeClaim:
+ claimName: wp-pv-claim
diff --git a/.vuepress/public/statics/learning/ptc/lnmp/wordpress-mysql.yaml b/.vuepress/public/statics/learning/ptc/lnmp/wordpress-mysql.yaml
new file mode 100644
index 0000000..8b92b76
--- /dev/null
+++ b/.vuepress/public/statics/learning/ptc/lnmp/wordpress-mysql.yaml
@@ -0,0 +1,65 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: wordpress-mysql
+ labels:
+ app: wordpress
+spec:
+ ports:
+ - port: 3306
+ selector:
+ app: wordpress
+ tier: mysql
+ clusterIP: None
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: mysql-pv-claim
+ labels:
+ app: wordpress
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 20Gi
+---
+apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
+kind: Deployment
+metadata:
+ name: wordpress-mysql
+ labels:
+ app: wordpress
+spec:
+ selector:
+ matchLabels:
+ app: wordpress
+ tier: mysql
+ strategy:
+ type: Recreate
+ template:
+ metadata:
+ labels:
+ app: wordpress
+ tier: mysql
+ spec:
+ containers:
+ - image: mysql:5.6
+ name: mysql
+ env:
+ - name: MYSQL_ROOT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: mysql-pass
+ key: password
+ ports:
+ - containerPort: 3306
+ name: mysql
+ volumeMounts:
+ - name: mysql-persistent-storage
+ mountPath: /var/lib/mysql
+ volumes:
+ - name: mysql-persistent-storage
+ persistentVolumeClaim:
+ claimName: mysql-pv-claim
diff --git a/guide/example/monitor.md b/guide/example/monitor.md
index d55bcff..6c8ab38 100644
--- a/guide/example/monitor.md
+++ b/guide/example/monitor.md
@@ -12,6 +12,7 @@ description: 使用Kuboard在Kubernetes上安装监控套件,并对example微
必须具备如下条件:
* 已完成 [导入 example 微服务](/guide/example/import.html)
+* 已配置了 NFS [StorageClass](/learning/k8s-intermediate/persistent/storage-class.html)
::: warning
@@ -19,6 +20,10 @@ description: 使用Kuboard在Kubernetes上安装监控套件,并对example微
:::
+::: tip
+许多网友自己搭建 NFS 测试环境,再创建 NFS存储类,经常碰到 `access denied` 这类权限问题。为了帮助大家更快地完成 NFS 测试环境搭建,Kuboard提供了一篇NFS相关的简明文档,请参考 [搭建NFS Server](/learning/k8s-intermediate/persistent/nfs.html)
+:::
+
假设您已进入 example 名称空间,如下图所示:

@@ -29,11 +34,7 @@ description: 使用Kuboard在Kubernetes上安装监控套件,并对example微
### 安装全局监控套件
-::: tip
-许多网友自己搭建 NFS 测试环境,再创建 NFS存储类,经常碰到 `access denied` 这类权限问题。为了帮助大家更快地完成 NFS 测试环境搭建,Kuboard提供了一篇NFS相关的简明文档,请参考 [搭建NFS Server](/learning/k8s-intermediate/persistent/nfs.html)
-:::
-
-* 在 master 节点执行 此步骤不可忽略
+* 在 master 节点执行 此步骤必须执行
```bash
kubectl -n kube-system create secret generic etcd-certs --from-file=/etc/kubernetes/pki/etcd/server.crt --from-file=/etc/kubernetes/pki/etcd/server.key
diff --git a/install/faq/warning.assets/image-20191108220746427.png b/install/faq/warning.assets/image-20191108220746427.png
new file mode 100644
index 0000000..4b6e5e5
Binary files /dev/null and b/install/faq/warning.assets/image-20191108220746427.png differ
diff --git a/install/faq/warning.md b/install/faq/warning.md
new file mode 100644
index 0000000..7c43b0a
--- /dev/null
+++ b/install/faq/warning.md
@@ -0,0 +1,66 @@
+---
+vssueId: 150
+description: Kuboard界面上_时常会出现工作负载_Deployment_StatefulSet_DaemonSet_等为红色_且带一个红色E图标的情况_本文解释了该图标的含义以及如何清理
+meta:
+ - name: keywords
+ content: Kubernetes 管理界面, Kuboard, K8S管理界面
+---
+
+# 错误提示
+
+Kuboard中经常会出现如下情况,某一个工作负载(Deployment/StatefulSet/DaemonSet等)显示为红色,且有一个闪烁的红色 `E` 图标。
+
+
+
+此为 Kuboard 中设计的一个错误提示方式,其具体实现方式是:
+* 遍历当前的所有事件,对于每一个事件:
+ * 如果事件类型为 Normal,则跳过
+ * 如果事件类型为 Warining,则对比该事件源对象(产生该事件的Kubernetes 对象)的名字(假设为 event_source_name)与当前工作负载(假设为work_load_name)的名字:
+ * 如果 event_source_name.indexOf(work_load_name) === 0,则该工作负载显示错误提示
+ * 如果 event_source_name.indexOf(work_load_name) !== 0,则跳过
+
+使用此方式,我们可以快速查看到名称空间中存在问题的工作负载,并迅速对其进行诊断。
+
+但是这种告警方式并不是完美的,具体来说,会发生如下情况:
+
+## 实际正常,但提示错误
+
+实际上,您的工作负载(Deployment、StatefulSet、DaemonSet等)已经正常工作,但是仍然提示有错误信息。此种情况通常发生在类似如下的场景中:
+
+### 场景一:
+
+* 创建Deployment,但未创建所需要的PVC
+ * 此时该Deployment的Pod不能调度,并伴随着 PVC 未绑定的错误事件
+* 创建PVC,Pod成功调度,Deployment正常工作
+ * 此时,虽然Pod已经正常,但是该Pod原来的错误事件仍然存在,因此Kuboard仍然会显示此错误提示
+
+### 场景二:
+
+* 创建Deployment,但该Deployment依赖的数据库未启动
+ * 此时该Deployment的Pod将Crash
+* 启动数据库
+* 删除Deployment原有的Pod
+ * 此时Deployment创建新Pod以维持所需要的副本数
+ * 新的Pod正常工作
+ * 此时,虽然与错误事件关联的Pod已经删除,但是该Pod产生的错误事件仍然存在,且与Deployment的名称匹配,因此,Kuboard仍将显示错误标志
+
+### 修正办法
+
+* 在名称空间左上角点击 **事件** 按钮,将进入事件列表查看界面
+* 将已经失效的错误事件删除
+ > 点击事件的图标,可删除事件
+
+## 界面卡顿
+
+当名称空间中工作负载的数量,以及集群中错误事件的数量特别多时,在进入名称空间界面时可能出现卡顿,但是只要成功进入,一切工作都是正常的。
+
+卡顿的原因是,Kuboard在循环遍历事件与工作负载的匹配情况,通常只有在在工作负载数量和事件数量都特别多时,才会出现卡顿,在 1.0.4 版本中优化之后,速度已经得到了非常可观的提升。
+
+如果您仍然碰到了卡顿的现象,可以尝试:
+* 删除事件
+
+ 执行命令 `kubectl delete events --all-namespaces`。由于 Kubernetes 的控制器模式,Kubernetes会不断尝试失败的操作,因此,删除事件通常是安全的,过一阵子,原有的错误事件又会重复出现
+
+* 向Kuboard反馈此问题
+
+ 本文页尾有Kuboard支持社群的入群方式,直接联系群主即可
diff --git a/learning/k8s-practice/lnmp/wordpress.md b/learning/k8s-practice/lnmp/wordpress.md
new file mode 100644
index 0000000..c7d15f9
--- /dev/null
+++ b/learning/k8s-practice/lnmp/wordpress.md
@@ -0,0 +1,77 @@
+---
+# vssueId: 67
+layout: LearningLayout
+lessAds: true
+description: Kubernetes教程_本文描述了如何在K8S上部署一个WordPress和MySQL应用_并将数据存储在PersistentVolume中
+meta:
+ - name: keywords
+ content: Kubernetes教程,K8S教程,K8S PHP,K8S培训,K8S教程
+---
+
+# 在K8S上部署WordPress和MySQL
+
+
+
+> 参考文档: [Example: Deploying WordPress and MySQL with Persistent Volumes](https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/)
+
+本文描述了如何在K8S上部署一个WordPress和MySQL应用,本文中WordPress和MySQL都使用 PersistentVolume 和 PersistentVolumeClaim 存储数据。
+
+[PersistentVolume](/learning/k8s-intermediate/persistent/pv.html) 是集群中可用的一片存储空间,通常由集群管理员手工提供,或者由 Kubernetes 使用 [StorageClass](/learning/k8s-intermediate/persistent/storage-class.html) 自动提供。
+
+[PersistentVolumeClaim](/learning/k8s-intermediate/persistent/pv.html#存储卷和存储卷声明的关系) 代表了用户(应用程序)对存储空间的需求,此需求可由 PersistentVolume 满足。
+
+PersistentVolume 和 PersistentVolumeClaim 都是独立于 Pod 的生命周期,可用于在 Pod 重启、重新调度、甚至删除之后保存数据。
+
+::: danger 警告
+本文中的例子不适合用于生产环境使用,因为例子中使用了一个 WordPress 实例和一个 MySQL 实例。可以考虑使用 [WordPress Helm Chart](https://github.com/kubernetes/charts/tree/master/stable/wordpress) 在生产环境中部署 WordPress。
+:::
+
+[[TOC]]
+
+
+
+## 主要步骤
+
+* 创建 PersistentVolumeClaim 和 PersistentVolume
+* 创建一个 `kustomization.yaml`,其中包括:
+ * 一个 Secret generator
+ * MySQL配置资源
+ * WordPress配置资源
+* 执行 `kubectl apply -k ./` 将 kustomization 目录应用到集群
+* 执行清理
+
+## 前提条件
+
+* 您必须有一个K8S集群
+ * 可参考 [安装Kubernetes单Master节点集群](/install/install-k8s.html)
+ * kubectl 版本不低于 1.14,可参考 [安装kubectl](/install/install-kubectl.html)
+* 在执行 kubectl 命令的机器上任意位置创建一个空白目录用于本例子的执行。本文假设后续所有命令的当前目录都是此时创建的这个目录。
+
+## 创建PersistentVolumeClaim和PersistentVolume
+
+MySQL 和 WordPress 都需要一个 PersistentVolume 存储数据。他们的 PersistentVolumeClaim 将被在部署应用时创建。
+
+## 创建kustomization.yaml
+
+### 添加一个Secret generator
+
+[Secret](/learning/k8s-intermediate/config/secrets/) 对象可以存储敏感信息,例如 password 或者 key。自 Kubernetes 1.14 开始,`kubectl` 支持使用 kustomization 文件管理对象。可以在 `kustomization.yaml` 文件中定义一个 generator 以创建 Secret 对象。
+
+执行下面的命令,创建 `kustomization.yaml` 文件,该文件中包含一个 Secret generator。
+> 您需要将 `YOUR_PASSWORD` 替换成您自己想要使用的密码
+
+``` sh
+cat <./kustomization.yaml
+secretGenerator:
+- name: mysql-pass
+ literals:
+ - password=YOUR_PASSWORD
+EOF
+```
+
+
+## 为MySQL和WordPress添加配置信息
+
+## 应用和验证
+
+## 清理
diff --git a/support/change-log/change-log-on-the-way.md b/support/change-log/change-log-on-the-way.md
index 8f32a35..2a97045 100644
--- a/support/change-log/change-log-on-the-way.md
+++ b/support/change-log/change-log-on-the-way.md
@@ -12,6 +12,7 @@ Kuboard v1.0.x 的更新说明
+* 清理事件
* EndPoint
* 导入工作负载时,如果存储类没有 annotations,不应该报错
* 表单校验:数据卷名不能带小数点
@@ -19,6 +20,10 @@ Kuboard v1.0.x 的更新说明
* 工作负载编辑器 --> 容器组 --> 容忍 -- 正在开发
* Limit Range
+
+* 可以在这里加一个自动部署的按钮,点击按钮显示部署秘钥。shell 脚本可以加一句curl http://kubord.com?秘钥+版本。镜像推送到仓库之后,shell脚本加一句这个curl就可以完成k8s自动集成了
+*
+
* 容器组列表,筛选结果为空时,提示筛选 “其他”
* https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/