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 名称空间,如下图所示: ![Kubernetes教程:在Kuboard中监控-进入名称空间](./import.assets/image-20190723121433809.png) @@ -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` 图标。 + +![image-20191108220746427](./warning.assets/image-20191108220746427.png) + +此为 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/