调整结构
@ -70,7 +70,7 @@ module.exports = {
|
||||
{ text: '安装', link: '/install/install-dashboard' },
|
||||
{ text: '学习', link: '/learning/' },
|
||||
{ text: '使用', link: '/guide/' },
|
||||
{ text: '微服务', link: '/micro-service/overview/kuboard-view-of-k8s.html' },
|
||||
{ text: '支持', link: '/support/' },
|
||||
// { text: '博客', link: 'https://blog.kuboard.cn/compaign' }
|
||||
// { text: 'DevOps', link: '/devops/' }
|
||||
],
|
||||
@ -112,14 +112,15 @@ module.exports = {
|
||||
'why-kuboard',
|
||||
'concepts'
|
||||
]
|
||||
}, {
|
||||
title: '技术支持',
|
||||
collapsable: false,
|
||||
children: [
|
||||
'support',
|
||||
'change-log'
|
||||
]
|
||||
}
|
||||
},
|
||||
// {
|
||||
// title: '技术支持',
|
||||
// collapsable: false,
|
||||
// children: [
|
||||
// 'support',
|
||||
// 'change-log'
|
||||
// ]
|
||||
// }
|
||||
],
|
||||
|
||||
'/articles/': [
|
||||
@ -137,6 +138,7 @@ module.exports = {
|
||||
title: '安装 Kubernetes',
|
||||
collapsable: false,
|
||||
children: [
|
||||
'install-docker-desktop',
|
||||
['install-k8s', '安装 Kubernetes 单Master节点'],
|
||||
'install-kubernetes',
|
||||
['install-k8s-upgrade', '升级 Kubernetes 集群'],
|
||||
@ -212,6 +214,18 @@ module.exports = {
|
||||
'k8s-intermediate/workload/wl-statefulset/scaling.html',
|
||||
'k8s-intermediate/workload/wl-statefulset/update.html',
|
||||
]
|
||||
},
|
||||
{
|
||||
title: '控制器 - DaemonSet',
|
||||
collapsable: true,
|
||||
children: [
|
||||
'k8s-intermediate/workload/wl-daemonset/',
|
||||
'k8s-intermediate/workload/wl-daemonset/create',
|
||||
'k8s-intermediate/workload/wl-daemonset/schedule',
|
||||
'k8s-intermediate/workload/wl-daemonset/communicate',
|
||||
'k8s-intermediate/workload/wl-daemonset/update',
|
||||
'k8s-intermediate/workload/wl-daemonset/alternative',
|
||||
]
|
||||
}
|
||||
// 'k8s-intermediate/workload/wl-daemonset',
|
||||
// 'k8s-intermediate/workload/wl-job',
|
||||
@ -252,6 +266,27 @@ module.exports = {
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Kubernetes 实战',
|
||||
collapsable: false,
|
||||
children: [
|
||||
{
|
||||
title: '概述',
|
||||
collapsable: false,
|
||||
children: [
|
||||
'k8s-practice/micro-service/kuboard-view-of-k8s'
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Spring Cloud',
|
||||
collapsable: false,
|
||||
children: [
|
||||
'k8s-practice/spring-cloud/',
|
||||
// 'spring-cloud/cloud-eureka'
|
||||
]
|
||||
},
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
'/guide/': [
|
||||
@ -310,23 +345,22 @@ module.exports = {
|
||||
]
|
||||
},
|
||||
],
|
||||
|
||||
'/micro-service/': [
|
||||
|
||||
'/support/': [
|
||||
{
|
||||
title: '概述',
|
||||
title: '授权/支持',
|
||||
collapsable: false,
|
||||
children: [
|
||||
'overview/kuboard-view-of-k8s'
|
||||
'',
|
||||
]
|
||||
},
|
||||
{
|
||||
title: 'Spring Cloud',
|
||||
title: '更新说明',
|
||||
collapsable: false,
|
||||
children: [
|
||||
'spring-cloud/',
|
||||
// 'spring-cloud/cloud-eureka'
|
||||
'change-log/v1.0.x',
|
||||
]
|
||||
},
|
||||
}
|
||||
],
|
||||
|
||||
'/devops/': [
|
||||
@ -339,10 +373,6 @@ module.exports = {
|
||||
}
|
||||
],
|
||||
|
||||
'/support/': [
|
||||
'',
|
||||
'change-log'
|
||||
],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,8 +21,8 @@
|
||||
<div class="side-nav-item" :style="activeLinkStyle('/guide/')">
|
||||
<a href="/guide/" class="nav-link">使用</a>
|
||||
</div>
|
||||
<div class="side-nav-item" :style="activeLinkStyle('/micro-service/')">
|
||||
<a href="/micro-service/overview/kuboard-view-of-k8s.html" class="nav-link">微服务</a>
|
||||
<div class="side-nav-item" :style="activeLinkStyle('/support/')">
|
||||
<a href="/support/" class="nav-link">支持</a>
|
||||
</div>
|
||||
<!-- <div class="side-nav-item" :style="activeLinkStyle('/noactive/')">
|
||||
<a href="https://blog.kuboard.cn/compaign/" target="_blank" class="nav-link">博客</a>
|
||||
|
||||
@ -21,8 +21,8 @@
|
||||
<div class="side-nav-item" :style="activeLinkStyle('/guide/')">
|
||||
<a href="/guide/" class="nav-link">使用</a>
|
||||
</div>
|
||||
<div class="side-nav-item" :style="activeLinkStyle('/micro-service/')">
|
||||
<a href="/micro-service/overview/kuboard-view-of-k8s.html" class="nav-link">微服务</a>
|
||||
<div class="side-nav-item" :style="activeLinkStyle('/support/')">
|
||||
<a href="/support/" class="nav-link">支持</a>
|
||||
</div>
|
||||
<!-- <div class="side-nav-item" :style="activeLinkStyle('/noactive/')">
|
||||
<a href="https://blog.kuboard.cn/compaign/" target="_blank" class="nav-link">博客</a>
|
||||
|
||||
@ -28,7 +28,9 @@ storyBook:
|
||||
|
||||
如果没有 Kubernetes 集群:
|
||||
|
||||
* 初学者, 请参考 [安装 Kubernetes 单Master节点](install-k8s.html)
|
||||
* 初学者, 请参考
|
||||
* [在 Windows/Mac 安装 Kubernetes 测试集群](install-docker-desktop.html)
|
||||
* [安装 Kubernetes 单Master节点](install-k8s.html)
|
||||
* 用于生产,请参考 [安装 Kubernetes 高可用](install-kubernetes.html)
|
||||
|
||||
## 兼容性
|
||||
|
||||
|
After Width: | Height: | Size: 378 KiB |
|
After Width: | Height: | Size: 1.4 MiB |
47
install/install-docker-desktop.md
Normal file
@ -0,0 +1,47 @@
|
||||
---
|
||||
description: 本文介绍了如何在 Windows/Mac 电脑安装 Kubernetes 测试集群
|
||||
---
|
||||
|
||||
# 安装 Kubernetes 测试集群 Win/Mac
|
||||
|
||||
只需要一台笔记本/台式机,就可以拥有一台用于学习的 Kubernetes 集群。单台机器可以用于学习 Kubernetes,但是,单台机器始终玩不出集群的感觉...
|
||||
|
||||
## 前提
|
||||
|
||||
如果您的笔记本/台式机电脑的性能足够强劲(内存不低于 8G),您可以直接安装 docker-desktop,并启用其中内嵌的 Kubernetes 集群,用做学习、测试,也可以用作日常开发。
|
||||
|
||||
## 下载 docker-desktop
|
||||
|
||||
从 docker 官网下载 [docker-desktop](https://hub.docker.com/?overlay=onboarding),并完成安装
|
||||
|
||||
## 启用 Kubernetes 集群
|
||||
|
||||
:::: tabs type:border-card
|
||||
|
||||
::: tab MAC
|
||||
|
||||
* **启动 docker-desktop**
|
||||
|
||||
* **打开 docker-desktop 的 preference 面板**
|
||||
|
||||
<p>
|
||||
<img src="./install-docker-desktop.assets/image-20190914223622217.png" style="max-width: 600px;"/>
|
||||
</p>
|
||||
|
||||
* **切换到 Kubernetes 标签页**
|
||||
|
||||
并勾选启动 **Enable Kubernetes**,点击 **Apply**
|
||||
|
||||
<p>
|
||||
<img src="./install-docker-desktop.assets/image-20190914223501758.png" style="max-width: 600px;"/>
|
||||
</p>
|
||||
|
||||
:::
|
||||
|
||||
::: tab Windows
|
||||
|
||||
具体操作与 Mac 的操作过程相似,已有许多网友验证过。作者使用的是 MAC 电脑,所以未能提供 Windows 上的截图。
|
||||
|
||||
:::
|
||||
|
||||
::::
|
||||
@ -37,7 +37,7 @@ description: Kubernetes 免费教程
|
||||
* [控制器 - 概述](/learning/k8s-intermediate/workload/workload.html)
|
||||
* [控制器 - Deployment](/learning/k8s-intermediate/workload/wl-deployment/)
|
||||
* [控制器 - StatefulSet](/learning/k8s-intermediate/workload/wl-statefulset/)
|
||||
* [控制器 - DaemonSet](/learning/k8s-intermediate/workload/wl-daemonset/) <Badge text="正在撰写" type="warn"/>
|
||||
* [控制器 - DaemonSet](/learning/k8s-intermediate/workload/wl-daemonset/)
|
||||
* [控制器 - Job](/learning/k8s-intermediate/workload/wl-job/) <Badge text="正在撰写" type="warn"/>
|
||||
* [控制器 - CronJob](/learning/k8s-intermediate/workload/wl-cronjob/) <Badge text="正在撰写" type="warn"/>
|
||||
* 服务发现、负载均衡、网络
|
||||
@ -58,12 +58,19 @@ description: Kubernetes 免费教程
|
||||
* [污点和容忍 taints and toleration](/learning/k8s-intermediate/config/taints-and-toleration.html) <Badge text="正在撰写" type="warn"/>
|
||||
* [Secrets](/learning/k8s-intermediate/config/secret.html) <Badge text="正在撰写" type="warn"/>
|
||||
|
||||
## **Kubernetes 高级**
|
||||
|
||||
* Kubernetes 日志可视化
|
||||
* Kubernetes 监控
|
||||
* Kubernetes 联邦
|
||||
|
||||
## **Kubernetes 实战**
|
||||
|
||||
[从微服务视角理解 Kubernetes](/learning/k8s-practice/micro-service/kuboard-view-of-k8s.html)
|
||||
|
||||
在 Kubernetes 上部署 Spring Cloud 微服务:
|
||||
|
||||
* [概述](/micro-service/spring-cloud/)
|
||||
* [概述](/learning/k8s-practice/spring-cloud/)
|
||||
* [部署服务注册中心]
|
||||
* [部署数据库]
|
||||
* [部署微服务]
|
||||
|
||||
6
learning/k8s-advanced/federation/index.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了如何配置 Kubernetes 联邦
|
||||
---
|
||||
|
||||
# Kubernetes 联邦
|
||||
6
learning/k8s-advanced/logging/index.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了如何配置 Kubernetes 日志
|
||||
---
|
||||
|
||||
# Kubernetes 日志
|
||||
6
learning/k8s-advanced/monitor/index.md
Normal file
@ -0,0 +1,6 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了如何配置 Kubernetes 监控
|
||||
---
|
||||
|
||||
# Kubernetes 监控
|
||||
23
learning/k8s-intermediate/workload/pod-kuboard.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
description: 本文描述了 Kuboard 如何处理 Kubernetes 容器组
|
||||
---
|
||||
|
||||
# 容器组 - Kuboard
|
||||
|
||||
## 通过 Kuboard 创建容器组
|
||||
|
||||
由于在 Kubernetes 中,任何时候都是不推荐用户直接创建容器组,而是应该通过控制器创建容器组,Kuboard 管理工具并不提供直接创建容器组的界面,而是通过 **工作负载编辑器** 创建 Deployment、StatefulSet、DaemonSet 等方式来创建容器组。
|
||||
|
||||
在 Kuboard **工作负载编辑器** 中,容器组的概念处于如下图所示的位置:
|
||||
|
||||
在 Kuboard **工作负载编辑器** 界面中,容器组的 template 由界面中的如下几个部分指定:
|
||||
|
||||
## 通过 Kuboard 查看容器组
|
||||
|
||||
Kuboard 中,有两种方式可以查看容器组的信息:
|
||||
* 通过 **工作负载编辑器** 显示界面查看
|
||||
* 通过 **容器组列表** 查看
|
||||
|
||||
## 工作负载编辑器
|
||||
|
||||
## 容器组列表
|
||||
@ -0,0 +1,44 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes DaemonSet 的概念、行为及用法
|
||||
---
|
||||
|
||||
# DaemonSet 的替代选项
|
||||
|
||||
> 参考文档: Kubernetes 官网文档 [Alternatives to DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/#alternatives-to-daemonset)
|
||||
|
||||
DaemonSet 有如下替代选项可以选择
|
||||
|
||||
## Init Scripts
|
||||
|
||||
您可以通过脚本(例如,`init`、`upstartd`、`systemd`)直接在节点上启动一个守护进程。相对而言,DaemonSet 在处理守护进程时,有如下优势:
|
||||
|
||||
* 使用与应用程序相同的方式处理守护进程的日志和监控
|
||||
* 使用与应用程序相同的配置语言和工具(例如:Pod template、kubectl)处理守护进程
|
||||
* 在容器中运行守护进程,可为守护进程增加 resource limits 等限定
|
||||
|
||||
## Pods
|
||||
|
||||
您可以直接创建 Pod,并指定其在某一个节点上运行。相对而言,使用 DaemonSet 可获得如下优势:
|
||||
|
||||
* Pod 终止后,DaemonSet 可以立刻新建 Pod 以顶替已终止的 Pod。Pod 终止的原因可能是:
|
||||
* 节点故障
|
||||
* 节点停机维护
|
||||
|
||||
## 静态 Pod
|
||||
|
||||
您可以在 Kubelet 监听的目录下创建一个 Pod 的 yaml 文件,这种形式的 Pod 叫做 [静态 Pod(static pod)](https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/)。与 DaemonSet 不同,静态 Pod 不能通过 kubectl 或者 Kuboard 进行管理。静态 Pod 不依赖 Kubernetes APIServer 的特点,使得它在引导集群启动的过程中非常有用。
|
||||
|
||||
::: warning
|
||||
静态 Pod 将来可能被不推荐使用 (deprecated)
|
||||
:::
|
||||
|
||||
## Deployment
|
||||
|
||||
DaemonSet 和 Deployment 一样,他们都创建长时间运行的 Pod(例如 web server、storage server 等)
|
||||
|
||||
* Deployment 适用于无状态服务(例如前端程序),对于这些程序而言,扩容(scale up)/ 缩容(scale down)、滚动更新等特性比精确控制 Pod 所运行的节点更重要。
|
||||
|
||||
* DaemonSet 更适合如下情况:
|
||||
* Pod 的副本总是在所有(或者部分指定的)节点上运行
|
||||
* 需要在其他 Pod 启动之前运行
|
||||
@ -0,0 +1,15 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes DaemonSet 的概念、行为及用法
|
||||
---
|
||||
|
||||
# 与 DaemonSet 通信
|
||||
|
||||
> 参考文档 Kubernetes 官网文档 [Communicating with Daemon Pods](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/#communicating-with-daemon-pods)
|
||||
|
||||
与 DaemonSet 容器组通信的模式有:
|
||||
|
||||
* **Push:** DaemonSet 容器组用来向另一个服务推送信息,例如数据库的统计信息。这种情况下 DaemonSet 容器组没有客户端
|
||||
* **NodeIP + Port:** DaemonSet 容器组可以使用 `hostPort`,此时可通过节点的 IP 地址直接访问该容器组。客户端需要知道节点的 IP 地址,以及 DaemonSet 容器组的 端口号
|
||||
* **DNS:** 创建一个 [headless service](https://kubernetes.io/docs/concepts/services-networking/service/#headless-services),且该 Service 与 DaemonSet 有相同的 Pod Selector。此时,客户端可通过该 Service 的 DNS 解析到 DaemonSet 的 IP 地址
|
||||
* **Service:** 创建一个 Service,且该 Service 与 DaemonSet 有相同的 Pod Selector,客户端通过该 Service,可随机访问到某一个节点上的 DaemonSet 容器组
|
||||
96
learning/k8s-intermediate/workload/wl-daemonset/create.md
Normal file
@ -0,0 +1,96 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes 中如何创建 DaemonSet
|
||||
---
|
||||
|
||||
# 创建 DaemonSet
|
||||
|
||||
## YAML 示例
|
||||
|
||||
下面是 DaemonSet 的 YAML 文件示例 daemonset.yaml。该例子中的 DaemonSet 运行了一个 fluentd-elasticsearch 的 docker 镜像:
|
||||
|
||||
``` yaml
|
||||
apiVersion: apps/v1
|
||||
kind: DaemonSet
|
||||
metadata:
|
||||
name: fluentd-elasticsearch
|
||||
namespace: kube-system
|
||||
labels:
|
||||
k8s-app: fluentd-logging
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
name: fluentd-elasticsearch
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
name: fluentd-elasticsearch
|
||||
spec:
|
||||
tolerations:
|
||||
- key: node-role.kubernetes.io/master
|
||||
effect: NoSchedule
|
||||
containers:
|
||||
- name: fluentd-elasticsearch
|
||||
image: fluent/fluentd-kubernetes-daemonset:v1.7.1-debian-syslog-1.0
|
||||
resources:
|
||||
limits:
|
||||
memory: 200Mi
|
||||
requests:
|
||||
cpu: 100m
|
||||
memory: 200Mi
|
||||
volumeMounts:
|
||||
- name: varlog
|
||||
mountPath: /var/log
|
||||
- name: varlibdockercontainers
|
||||
mountPath: /var/lib/docker/containers
|
||||
readOnly: true
|
||||
terminationGracePeriodSeconds: 30
|
||||
volumes:
|
||||
- name: varlog
|
||||
hostPath:
|
||||
path: /var/log
|
||||
- name: varlibdockercontainers
|
||||
hostPath:
|
||||
path: /var/lib/docker/containers
|
||||
```
|
||||
|
||||
执行如下命令可创建该 DaemonSet:
|
||||
|
||||
``` sh
|
||||
kubectl apply -f ./daemonset.yaml
|
||||
```
|
||||
|
||||
## 必填字段
|
||||
|
||||
与其他所有 Kubernetes API 对象相同,DaemonSet 需要如下字段:
|
||||
* apiVersion
|
||||
* kind
|
||||
* metadata
|
||||
|
||||
除此之外,DaemonSet 还需要 `.spec` 字段
|
||||
|
||||
## Pod Template
|
||||
|
||||
`.spec.template` 是必填字段,定义了 Pod 的模板,与定义 Pod 的 yaml 格式完全相同(除了内嵌在 DaemonSet 中以外,没有 kind、APIVersion 字段以外)。
|
||||
|
||||
在 DaemonSet 中,您必须指定 `.spec.template.metadata.labels` 字段和 `.spec.tempalte.spec` 字段。
|
||||
|
||||
DaemonSet 的 `.spec.template.spec.restartPolicy` 字段必须为 Always,或者不填(默认值为 Always)
|
||||
|
||||
## Pod Selector
|
||||
|
||||
`.spec.selector` 字段定义了 DaemonSet 的 pod selector,DaemonSet 认为符合该选择器的 Pod 由其管理。
|
||||
|
||||
自 Kubernets v1.8 以后,`.spec.selector` 是必填字段,且您指定该字段时,必须与 `.spec.template.metata.labels` 字段匹配(不匹配的情况下创建 DaemonSet 将失败)。DaemonSet 创建以后,`.spec.selector` 字段就不可再修改。如果修改,可能导致不可预见的结果。
|
||||
|
||||
`.spec.selector` 由两个字段组成:
|
||||
* matchLabels <Badge text="Kuboard 已支持" type="success"/>
|
||||
* matchExpressions <Badge text="Kuboard 暂不支持" type="warn"/> 通过指定 key、value列表以及运算符,可以构造更复杂的选择器
|
||||
|
||||
如果两个字段同时存在,则必须同时满足两个条件的 Pod 才被选中。
|
||||
|
||||
任何情况下,您不能以任何方式创建符合 DaemonSet 的 `.spec.selector` 选择器的 Pod。否则 DaemonSet Controller 会认为这些 Pod 是由它创建的。这将导致不可预期的行为出现。
|
||||
|
||||
## 只在部分节点上运行
|
||||
|
||||
指定 `.spec.template.spec.nodeSelector` <Badge text="Kuboard 已支持" type="success"/>,DaemonSet Controller 将只在指定的节点上创建 Pod (参考 [节点选择器 nodeSelector](/learning/k8s-intermediate/config/assign-pod-node.html#节点选择器-nodeselector))。同样的,如果指定 `.spec.template.spec.affinity` <Badge text="Kuboard 暂不支持" type="warn"/>,DaemonSet Controller 将只在与 [node affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/) 匹配的节点上创建 Pod。
|
||||
@ -3,6 +3,27 @@ layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes DaemonSet 的概念、行为及用法
|
||||
---
|
||||
|
||||
# 控制器 - DaemonSet
|
||||
# 介绍 DaemonSet
|
||||
|
||||
正在撰写...
|
||||
> 参考文档: Kubernetes 官网文档 [DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/)
|
||||
|
||||
|
||||
DaemonSet 控制器确保所有(或一部分)的节点都运行了一个指定的 Pod 副本。
|
||||
* 每当向集群中添加一个节点时,指定的 Pod 副本也将添加到该节点上
|
||||
* 当节点从集群中移除时,Pod 也就被垃圾回收了
|
||||
* 删除一个 DaemonSet 可以清理所有由其创建的 Pod
|
||||
|
||||
DaemonSet 的典型使用场景有:
|
||||
|
||||
* 在每个节点上运行集群的存储守护进程,例如 glusterd、ceph
|
||||
* 在每个节点上运行日志收集守护进程,例如 fluentd、logstash
|
||||
* 在每个节点上运行监控守护进程,例如 [Prometheus Node Exporter](https://github.com/prometheus/node_exporter)、[Sysdig Agent](https://sysdigdocs.atlassian.net/wiki/spaces/Platform)、collectd、[Dynatrace OneAgent](https://www.dynatrace.com/technologies/kubernetes-monitoring/)、[APPDynamics Agent](https://docs.appdynamics.com/display/CLOUD/Container+Visibility+with+Kubernetes)、[Datadog agent](https://docs.datadoghq.com/agent/kubernetes/daemonset_setup/)、[New Relic agent](https://docs.newrelic.com/docs/integrations/kubernetes-integration/installation/kubernetes-installation-configuration)、Ganglia gmond、[Instana Agent](https://www.instana.com/supported-integrations/kubernetes-monitoring/) 等
|
||||
|
||||
通常情况下,一个 DaemonSet 将覆盖所有的节点。复杂一点儿的用法,可能会为某一类守护进程设置多个 DaemonSets,每一个 DaemonSet 针对不同类硬件类型设定不同的内存、cpu请求。
|
||||
|
||||
本文从以下几方面介绍 DaemonSet:
|
||||
* [创建 DaemonSet](./create.html)
|
||||
* [DaemonSet 是如何调度的](./schedule.html)
|
||||
* [与 DaemonSet 通信](./communicate.html)
|
||||
* [更新 DaemonSet](./update.html)
|
||||
* [DaemonSet 的替代选项](./alternative.html)
|
||||
|
||||
54
learning/k8s-intermediate/workload/wl-daemonset/schedule.md
Normal file
@ -0,0 +1,54 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes DaemonSet 如何调度 Pod
|
||||
---
|
||||
|
||||
# DaemonSet 是如何调度的
|
||||
|
||||
> 参考文档 Kubernetes 官网文档 [How Daemon Pods are Scheduled](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/#how-daemon-pods-are-scheduled)
|
||||
|
||||
## 由 DaemonSet 控制器调度
|
||||
|
||||
**v1.12以后默认禁用**
|
||||
|
||||
通常,Kubernetes Scheduler(调度器)决定了 Pod 在哪个节点上运行。然而 DaemonSet Controller 创建的 Pod 已经指定了 `.spec.nodeName` 字段,因此:
|
||||
* Node 节点的 [unschedulable](https://kubernetes.io/docs/concepts/architecture/nodes/#manual-node-administration) 字段将被 DaemonSet Controller 忽略
|
||||
* DaemonSet Controller 可以在 kubernetes scheduler 启动之前创建 Pod,这个特性在引导集群启动的时候非常有用(集群使用者无需关心)
|
||||
|
||||
## 由默认调度器调度
|
||||
|
||||
**v1.12以后默认启用**
|
||||
|
||||
DaemonSet 确保所以符合条件的节点运行了一个指定的 Pod。通常,Kubernetes Scheduler 决定 Pod 在哪个节点上运行。然而如果 DaemonSet 的 Pod 由 DaemonSet Controller 创建和调度,会引发如下问题:
|
||||
|
||||
* Pod 的行为不一致:普通的 Pod 在创建后处于 **Pending** 状态,并等待被调度,但是 DaemonSet Pod 创建后,初始状态不是 **Pending**。这会使用户感到困惑
|
||||
* [Pod 的优先权(preemption)](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/) 由 kubernetes 调度器处理。如果 Pod 优先权被启用,DaemonSet Controller 在创建和调度 Pod 时,不会考虑 Pod 的优先权
|
||||
|
||||
Kubernetes v1.12 版本以后,默认通过 kubernetes 调度器来调度 DaemonSet 的 Pod。DaemonSet Controller 将会向 DaemonSet 的 Pod 添加 `.spec.nodeAffinity` 字段,而不是 `.spec.nodeName` 字段,并进一步由 kubernetes 调度器将 Pod 绑定到目标节点。如果 DaemonSet 的 Pod 已经存在了 `nodeAffinity` 字段,该字段的值将被替换。
|
||||
|
||||
``` yaml
|
||||
nodeAffinity:
|
||||
requiredDuringSchedulingIgnoredDuringExecution:
|
||||
nodeSelectorTerms:
|
||||
- matchFields:
|
||||
- key: metadata.name
|
||||
operator: In
|
||||
values:
|
||||
- target-host-name
|
||||
```
|
||||
|
||||
此外, `node.kubernetes.io/unschedulable:NoSchedule` 容忍([toleration](/learning/k8s-intermediate/config/taints-and-toleration.html))将被自动添加到 DaemonSet 的 Pod 中。由此,默认调度器在调度 DaemonSet 的 Pod 时可以忽略节点的 **unschedulable** 属性
|
||||
|
||||
## 污点和容忍
|
||||
|
||||
在调度 DaemonSet 的 Pod 时,污点和容忍([taints and tolerations](/learning/k8s-intermediate/config/taints-and-toleration.html))会被考量到,同时,以下容忍(toleration)将被自动添加到 DaemonSet 的 Pod 中:
|
||||
|
||||
| Toleration Key | Effect | Version | 描述 |
|
||||
| -------------------------------------- | ---------- | ------- | ------------------------------------------------------------ |
|
||||
| node.kubernetes.io/not-ready | NoExecute | 1.13+ | 节点出现问题时(例如网络故障),DaemonSet 容器组将不会从节点上驱逐 |
|
||||
| node.kubernetes.io/unreachable | NoExecute | 1.13+ | 节点出现问题时(例如网络故障),DaemonSet 容器组将不会从节点上驱逐 |
|
||||
| node.kubernetes.io/disk-pressure | NoSchedule | 1.8+ | |
|
||||
| node.kubernetes.io/memory-pressure | NoSchedule | 1.8+ | |
|
||||
| node.kubernetes.io/unschedulable | NoSchedule | 1.12+ | 默认调度器针对 DaemonSet 容器组,容忍节点的 `unschedulable `属性 |
|
||||
| node.kubernetes.io/network-unavailable | NoSchedule | 1.12+ | 默认调度器针对 DaemonSet 容器组,在其使用 host network 时,容忍节点的 `network-unavailable` 属性 |
|
||||
|
||||
23
learning/k8s-intermediate/workload/wl-daemonset/update.md
Normal file
@ -0,0 +1,23 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了 Kubernetes DaemonSet 的概念、行为及用法
|
||||
---
|
||||
|
||||
# 更新 DaemonSet
|
||||
|
||||
> 参考文档 Kubernetes 官网文档 [Updating a DaemonSet](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/#updating-a-daemonset)
|
||||
|
||||
## 更新信息
|
||||
|
||||
* 在改变节点的标签时:
|
||||
* 如果该节点匹配了 DaemonSet 的 `.spec.template.spec.nodeSelector`,DaemonSet 将会在该节点上创建一个 Pod
|
||||
* 如果该节点原来匹配 DaemonSet 的 `.spec.template.spec.nodeSelector`,现在不匹配了,则,DaemonSet 将会删除该节点上对应的 Pod
|
||||
|
||||
* 您可以修改 DaemonSet 的 Pod 的部分字段,但是,DaemonSet 控制器在创建新的 Pod 时,仍然会使用原有的 Template 进行 Pod 创建。
|
||||
|
||||
* 您可以删除 DaemonSet。如果在 `kubectl` 命令中指定 `--cascade=false` 选项,DaemonSet 容器组将不会被删除。紧接着,如果您创建一个新的 DaemonSet,与之前删除的 DaemonSet 有相同的 `.spec.selector`,新建 DaemonSet 将直接把这些未删除的 Pod 纳入管理。DaemonSet 根据其 `updateStrategy` 决定是否更新这些 Pod
|
||||
|
||||
## 执行滚动更新
|
||||
|
||||
|
||||
https://kubernetes.io/docs/tasks/manage-daemon/update-daemon-set/
|
||||
@ -47,7 +47,7 @@ spec:
|
||||
terminationGracePeriodSeconds: 10
|
||||
containers:
|
||||
- name: nginx
|
||||
image: k8s.gcr.io/nginx-slim:0.8
|
||||
image: nginx:1.7.9
|
||||
ports:
|
||||
- containerPort: 80
|
||||
name: web
|
||||
|
||||
@ -5,6 +5,8 @@ description: 本文描述了 Kubernetes StatefulSet 的概念、行为及用法
|
||||
|
||||
# StatefulSet 的使用场景
|
||||
|
||||
> 参考文档: Kubernetes 官网文档 [StatefulSets](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)
|
||||
|
||||
## StatefulSet 概述
|
||||
|
||||
StatefulSet 顾名思义,用于管理 Stateful(有状态)的应用程序。
|
||||
|
||||
|
Before Width: | Height: | Size: 210 KiB After Width: | Height: | Size: 210 KiB |
|
Before Width: | Height: | Size: 86 KiB After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 284 KiB After Width: | Height: | Size: 284 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 476 KiB After Width: | Height: | Size: 476 KiB |
|
Before Width: | Height: | Size: 226 KiB After Width: | Height: | Size: 226 KiB |
|
Before Width: | Height: | Size: 392 KiB After Width: | Height: | Size: 392 KiB |
@ -1,4 +1,5 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 本文描述了一个经典微服务参考架构,并且通过三个视图(集群概览、名称空间、工作负载)理解微服务与 Kubernetes 的映射关系。
|
||||
---
|
||||
|
||||
@ -188,6 +189,4 @@ Kuboard 产生于 Spring Cloud 微服务落地的实践中,并在许多的实
|
||||
* 工作负载视图
|
||||
* 监控视图
|
||||
|
||||
Kuboard 在实际项目中经过多次历练,功能不断完善,成长为一个基于 Kubernetes 的成熟的微服务管理工具。自 www.kuboard.cn 推出以来,得到了众多网友非常多的反馈,碰到问题,可以通过 Kuboard 社群得到支持,如需要获得商业支持请通过微信联系作者。
|
||||
|
||||

|
||||
Kuboard 在实际项目中经过多次历练,功能不断完善,成长为一个基于 Kubernetes 的成熟的微服务管理工具。自 www.kuboard.cn 推出以来,得到了众多网友非常多的反馈,碰到问题,可以通过 Kuboard 社群得到支持。
|
||||
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 449 KiB After Width: | Height: | Size: 449 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
@ -1,4 +1,5 @@
|
||||
---
|
||||
layout: LearningLayout
|
||||
description: 微服务参考架构:包含微服务运行时、构建及测试、部署及运维、监控及评估。设计和研发 Kuboard 的初心便源于此 Spring Cloud 微服务参考架构。
|
||||
---
|
||||
|
||||
@ -101,17 +101,17 @@ description: 介绍 Kuboard - Kubernetes 微服务管理界面,并为 Kubernet
|
||||
|
||||
Kuboard 为 Kubernetes 初学者设计了如下学习路径:
|
||||
|
||||
* **Kubernetes 体验**
|
||||
**Kubernetes 体验**
|
||||
* [安装 Kubernetes 单Master节点](/install/install-k8s.html) (30分钟,初学者也许需要更多)
|
||||
* 参照经过众多网友验证,不断优化的安装文档,迅速完成 Kubernetes 安装,拥有属于自己的 Kubernetes 集群。
|
||||
* [安装 Kuboard](/install/install-dashboard.html) (5分钟)
|
||||
* [安装微服务管理界面](/install/install-dashboard.html) (5分钟)
|
||||
* 使用 Kuboard,无需编写复杂冗长的 YAML 文件,就可以轻松管理 Kubernetes 集群。
|
||||
* [创建 busybox](/guide/example/busybox.html) (10分钟)
|
||||
* 快速在 Kubernetes 集群中安装一个部署,并与当中的容器组交互。
|
||||
* [导入 example 微服务应用](/guide/example/import.html) (15分钟)
|
||||
* 导入一个完整的 example 微服务应用,体验 Spring Cloud 在 Kubernetes 上的部署过程。
|
||||
|
||||
* **Kubernetes 入门**
|
||||
**Kubernetes 入门**
|
||||
* [0. 学习Kubernetes基础知识](/learning/k8s-basics/kubernetes-basics.html) (10分钟)
|
||||
* [1. 部署第一个应用程序](/learning/k8s-basics/deploy-app.html) (5分钟)
|
||||
* [2. 查看 Pods / Nodes](/learning/k8s-basics/explore.html) (10分钟)
|
||||
@ -120,7 +120,7 @@ Kuboard 为 Kubernetes 初学者设计了如下学习路径:
|
||||
* [5. 执行滚动更新](/learning/k8s-basics/update.html) (10分钟)
|
||||
* [6. 复习Kubernetes核心概念](/learning/k8s-basics/k8s-core-concepts.html) (10分钟)
|
||||
|
||||
* **Kubernetes 进阶**
|
||||
**Kubernetes 进阶**
|
||||
* [使用私有 registry 中的 docker 镜像](/learning/k8s-intermediate/private-registry.html)
|
||||
* 工作负载
|
||||
* [容器组 - 概述](/learning/k8s-intermediate/workload/pod.html)
|
||||
@ -129,7 +129,7 @@ Kuboard 为 Kubernetes 初学者设计了如下学习路径:
|
||||
* [控制器 - 概述](/learning/k8s-intermediate/workload/workload.html)
|
||||
* [控制器 - Deployment](/learning/k8s-intermediate/workload/wl-deployment/)
|
||||
* [控制器 - StatefulSet](/learning/k8s-intermediate/workload/wl-statefulset/)
|
||||
* [控制器 - DaemonSet](/learning/k8s-intermediate/workload/wl-daemonset/) <Badge text="正在撰写" type="warn"/>
|
||||
* [控制器 - DaemonSet](/learning/k8s-intermediate/workload/wl-daemonset/)
|
||||
* [控制器 - Job](/learning/k8s-intermediate/workload/wl-job/) <Badge text="正在撰写" type="warn"/>
|
||||
* [控制器 - CronJob](/learning/k8s-intermediate/workload/wl-cronjob/) <Badge text="正在撰写" type="warn"/>
|
||||
* 服务发现、负载均衡、网络
|
||||
@ -150,18 +150,26 @@ Kuboard 为 Kubernetes 初学者设计了如下学习路径:
|
||||
* [污点和容忍 taints and toleration](/learning/k8s-intermediate/config/taints-and-toleration.html) <Badge text="正在撰写" type="warn"/>
|
||||
* [Secrets](/learning/k8s-intermediate/config/secret.html) <Badge text="正在撰写" type="warn"/>
|
||||
|
||||
**Kubernetes 高级**
|
||||
|
||||
* **Kubernetes 实战**
|
||||
* Kubernetes 日志可视化
|
||||
* Kubernetes 监控
|
||||
* Kubernetes 联邦
|
||||
|
||||
在 Kubernetes 上部署 Spring Cloud 微服务:
|
||||
**Kubernetes 实战**
|
||||
|
||||
[从微服务视角理解 Kubernetes](/learning/k8s-practice/micro-service/kuboard-view-of-k8s.html)
|
||||
|
||||
在 Kubernetes 上部署 Spring Cloud 微服务:
|
||||
|
||||
* [概述](/learning/k8s-practice/spring-cloud/)
|
||||
* [部署服务注册中心]
|
||||
* [部署数据库]
|
||||
* [部署微服务]
|
||||
* [部署服务网关]
|
||||
* [部署Web前端]
|
||||
* [管理多环境]
|
||||
|
||||
* [概述](/micro-service/spring-cloud/)
|
||||
* [部署服务注册中心]
|
||||
* [部署数据库]
|
||||
* [部署微服务]
|
||||
* [部署服务网关]
|
||||
* [部署Web前端]
|
||||
* [管理多环境]
|
||||
|
||||
### Kubernetes 有经验者
|
||||
|
||||
|
||||
@ -4,6 +4,10 @@ description: Kuboard 更新日志的详细信息
|
||||
|
||||
# 更新日志
|
||||
|
||||
::: danger 页面已迁移
|
||||
本页面已迁移到 [Kuboard 更新日志](/support/change-log/v1.0.x.html)
|
||||
:::
|
||||
|
||||
## v1.0.3-beta.1
|
||||
|
||||
**发布日期**
|
||||
|
||||
221
support/change-log/v1.0.x.md
Normal file
@ -0,0 +1,221 @@
|
||||
---
|
||||
description: 本文描述了 Kuboard v1.0.x 的版本变更说明
|
||||
---
|
||||
|
||||
# Kuboard v1.0.x
|
||||
|
||||
Kuboard v1.0.x 的更新说明
|
||||
|
||||
## v1.0.3-beta.1
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019年9月11日
|
||||
|
||||
**新特性**
|
||||
|
||||
* 设置菜单中可查看 kubernetes 版本信息
|
||||
|
||||
**BUG 修复**
|
||||
|
||||
* 创建 NFS 时,MountOptions 应该是可填选项
|
||||
|
||||
## v1.0.2
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-09-01
|
||||
|
||||
**优化**
|
||||
|
||||
* 页头增加返回名称空间的导航
|
||||
|
||||
## v1.0.2-beta.5
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-29
|
||||
|
||||
**优化**
|
||||
|
||||
* 工作负载编辑器 - 容器,env 支持 ConfigMapKeyRef
|
||||
* 工作负载编辑器 - 容器,env 支持 SecretKeyRef
|
||||
|
||||
## v1.0.2-beta.4
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-28
|
||||
|
||||
**新特性**
|
||||
|
||||
* 工作负载编辑器 - 数据卷,支持 ConfigMap 类型
|
||||
|
||||
|
||||
## v1.0.2-beta.3
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-28
|
||||
|
||||
**优化**
|
||||
|
||||
* 工作负载查看页,可以查看工作负载对应的 YAML 文件内容
|
||||
|
||||
**BUG 修复**
|
||||
|
||||
* 工作负载查看页,提示访问方式时,NodePort的端口号错误
|
||||
* 在 Safari 浏览器下,页头显示错误
|
||||
|
||||
## v1.0.2-beta.2
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-24
|
||||
|
||||
**新特性**
|
||||
|
||||
* 就绪检查
|
||||
* 存活检查
|
||||
|
||||
**优化**
|
||||
|
||||
* 优化删除确认的输入内容的提示
|
||||
|
||||
**BUG 修复**
|
||||
|
||||
* 更新版本后,版本号显示仍然为旧版本,需要强制刷新才能显示新版本
|
||||
* 重复打开预览 YAML 的窗口,YAML 内容会不断累加
|
||||
|
||||
## v1.0.2-beta.1
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-21
|
||||
|
||||
**BUG 修复**
|
||||
|
||||
* Pod 中存在多个 Container 时,不能正常进入 日志界面和终端界面
|
||||
|
||||
## v1.0.1
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-20
|
||||
|
||||
**BUG 修复**
|
||||
|
||||
* 修复自定义 Kubernetes DNS Domain 时,无法使用监控套件的问题
|
||||
|
||||
## v1.0.1-beta.3
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-18
|
||||
|
||||
**新特性**
|
||||
|
||||
* 执行变更前预览 YAML
|
||||
|
||||
**优化**
|
||||
|
||||
* ConfigMap 详情页中使用带行号的代码编辑器
|
||||
* 工作复杂编辑器 - 显示 Kubernetes Object 名称
|
||||
|
||||
**BUG 修复**
|
||||
|
||||
* chrome 32位浏览器下,工作负载编辑器对服务名称的校验不正常
|
||||
* 卸载局部监控套件时,显示的标题和提示信息仍然是卸载全局监控套件
|
||||
* 编辑工作负载时,如果使用了 NFS 数据卷,不能保存的问题
|
||||
|
||||
## v1.0.1-beta.2
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-16
|
||||
|
||||
**新特性**
|
||||
|
||||
* 工作负载编辑器 - 节点选择,可按 nodeName 或 nodeSelector 指定容器组分配的节点
|
||||
|
||||
**优化**
|
||||
|
||||
* 节点详情页,编辑节点标签
|
||||
* 如果与工作服务载相关的最新事件不是 Warning 或者 BackOff,则不在工作负载图标上提示错误信息
|
||||
* 工作负载查看页 - 增加访问提示
|
||||
|
||||
**BUG 修复**
|
||||
|
||||
* 节点详情页,修复加载进度条显示
|
||||
* 资源删除对话框,对要删除的资源名称先 trim,再比较是否正确
|
||||
|
||||
## v1.0.1-beta.1
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-15
|
||||
|
||||
**新特性**
|
||||
|
||||
* 工作负载编辑器 - 数据卷,增加 hostPath 类型
|
||||
|
||||
**优化**
|
||||
|
||||
* 工作负载编辑器 - 服务分层,点击时跳转到微服务参考架构页面
|
||||
* 工作负载编辑器 - 资源限制,增加格式提示
|
||||
* 工作负载编辑器 - 容器,可以自定义抓取策略 imagePullPolicy
|
||||
* NFS 类型的 StorageClass 增加 mountOptions 选项
|
||||
|
||||
**BUG 修复**
|
||||
|
||||
* 工作负载查看页面 - 接收到容器组变化事件后,容器组详情未触发更新
|
||||
|
||||
## v1.0.0
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-11
|
||||
|
||||
**发布说明**
|
||||
|
||||
Kuboard 在实际项目中经过多次历练,功能不断完善,成长为一个基于 Kubernetes 的成熟的[微服务管理工具](/articles/201908/kuboard-view-of-k8s.md)。自 www.kuboard.cn 推出以来,得到了众多网友非常多的反馈,在大家的帮助下,修正了许多不同环境下的兼容性问题。今天终于结束了 beta 阶段,发布 **v1.0.0 正式版本**。该版本将是一个<font color="red">**长期支持版本**</font>,碰到问题,可以通过 Kuboard 社群得到支持,如需要获得商业支持请通过微信联系作者。
|
||||
|
||||
<!--  -->
|
||||
|
||||
**优化**
|
||||
|
||||
* 可以通过查询参数中的 k8sToken 字段直接登录系统,无需在登录界面输入 Token
|
||||
* 例如,如果想要无登录直接访问容器组的控制台,可使用如下格式的 url 进入:
|
||||
`http://yourip:yourport/#/console/pzy/yourPod?containerName=yourContainer&k8sToken=yourToken`
|
||||
* 登录界面显示帮助链接
|
||||
* 登录界面增加记住登录状态选项
|
||||
* 日志/终端界面增加返回名称空间按钮
|
||||
|
||||
## v1.0.0-beta.14
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-08-03
|
||||
|
||||
**优化**
|
||||
|
||||
* 创建 namespace/configmap/secrets/pvc/deployment/Service/Ingress 等 K8S 对象时,对表单中的名字等字段做 trim() 操作
|
||||
* 修改日志、终端连接错误时的提示信息
|
||||
|
||||
|
||||
## v1.0.0-beta.13
|
||||
|
||||
**发布日期**
|
||||
|
||||
2019-07-28
|
||||
|
||||
**优化**
|
||||
|
||||
* 调整主题色
|
||||
* 查看 Kuboard 版本信息
|
||||
* 一次删除 Deployment 下所有的错误事件 ([# 1](https://github.com/shaohq/kuboard-issues/issues/1))
|
||||
|
||||
**BUG 修复**
|
||||
|
||||
* Kubernetes 二进制安装时, Kuboard 无法启动
|
||||
* Kubernetes 中缺少 kube-dns Service 时, Kuboard 无法启动
|
||||
43
support/index.md
Normal file
@ -0,0 +1,43 @@
|
||||
---
|
||||
description: 本文描述了如何获得 Kuboard 授权
|
||||
---
|
||||
|
||||
# Kuboard
|
||||
|
||||
## Kuboard 授权声明
|
||||
|
||||
* 使用 Kuboard 是免费的,无论您是用于学习还是用于生产
|
||||
* 将来可能会推出 Kuboard Plus,当前所有的功能,将来仍然免费。Kuboard Plus 侧重点:
|
||||
* 更完善的权限管理(当前只区分集群管理员权限和只读权限)
|
||||
* 审计日志
|
||||
|
||||
## Kuboard 支持
|
||||
|
||||
### 免费支持
|
||||
|
||||
<p>
|
||||
<Qq/>
|
||||
</p>
|
||||
<p>
|
||||
<img src="/images/kuboard_qq.png" />
|
||||
</p>
|
||||
|
||||
### 承诺24小时内答复
|
||||
|
||||
<div>
|
||||
<div style="margin-top: 10px;">微信群聊里的问题,承诺 24 小时答复</div>
|
||||
<div style="margin-top: 10px;">未打赏用户可进 QQ 群聊,<span style="color: red;">打赏用户可进微信群聊</span>。</div>
|
||||
<div style="margin-top: 10px;">
|
||||
<span>扫第一个二维码完成打赏,扫第二个进微信群聊。</span>
|
||||
<p style="margin-top: 10px;">
|
||||
<img src="/images/dz.png" style="width: 200px; margin-right: 150px;"></img>
|
||||
<img src="/images/dz2.jpeg" style="width: 200px;"></img>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
### 微服务落地咨询
|
||||
|
||||
<p>
|
||||
<img src="/images/dz2.jpeg" style="width: 200px;"></img>
|
||||
</p>
|
||||