-[领取腾讯云最高2860元代金券](https://cloud.tencent.com/act/cps/redirect?redirect=1040&cps_key=2ee6baa049659f4713ddc55a51314372&from=console)
+
[领取阿里云最高2000元红包](https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=obezo3pg)
@@ -195,6 +195,8 @@ echo "127.0.0.1 $(hostname)" >> /etc/hosts
## 安装 docker / kubelet
+
+
使用 root 身份在所有节点执行如下代码,以安装软件:
@@ -228,6 +230,9 @@ curl -sSL https://kuboard.cn/install-script/v1.16.2/install_kubelet.sh | sh
+
+
+
diff --git a/learning/README.md b/learning/README.md
index 455f937..2b90d7c 100644
--- a/learning/README.md
+++ b/learning/README.md
@@ -48,10 +48,12 @@ meta:
* [4. 伸缩应用程序](/learning/k8s-basics/scale.html) (10分钟)
* [5. 执行滚动更新](/learning/k8s-basics/update.html) (10分钟)
* [6. 复习Kubernetes核心概念](/learning/k8s-basics/k8s-core-concepts.html) (10分钟)
- ::: tip
+ ::: tip 学习路径建议
* 入门教程是经典。推荐初学者学习入门教程 2 - 3 遍,甚至更多。
* 完成入门教程之后,建议首先阅读的文章内容是:
* [控制器](/learning/k8s-bg/architecture/controller.html)
+ * [Pod容器组](/learning/k8s-intermediate/workload/pod.html)
+ * [Deployment](/learning/k8s-intermediate/workload/wl-deployment/)
* [诊断应用程序](/learning/k8s-advanced/ts/application.html)
* [使用私有 registry 中的 docker 镜像](/learning/k8s-intermediate/private-registry.html)
* [Service 连接应用程序](/learning/k8s-intermediate/service/connecting.html)
@@ -85,7 +87,7 @@ meta:
* [控制器 - Deployment](/learning/k8s-intermediate/workload/wl-deployment/)
* [控制器 - StatefulSet](/learning/k8s-intermediate/workload/wl-statefulset/)
* [控制器 - DaemonSet](/learning/k8s-intermediate/workload/wl-daemonset/)
- * [控制器 - Job](/learning/k8s-intermediate/workload/wl-job/)
+ * [控制器 - Job](/learning/k8s-intermediate/workload/wl-job/)
* [控制器 - CronJob](/learning/k8s-intermediate/workload/wl-cronjob/)
* 服务发现、负载均衡、网络
* [Service 概述](/learning/k8s-intermediate/service/service.html)
diff --git a/learning/k8s-basics/explore.md b/learning/k8s-basics/explore.md
index 28778cf..db171a1 100644
--- a/learning/k8s-basics/explore.md
+++ b/learning/k8s-basics/explore.md
@@ -82,6 +82,18 @@ Pod(容器组)总是在 **Node(节点)** 上运行。Node(节点)是
kubectl get nodes
```
+ ::: tip 名称空间
+ 在命令后增加 `-A` 或 `--all-namespaces` 可查看所有 [名称空间中](/learning/k8s-intermediate/obj/namespaces.html) 的对象,使用参数 `-n` 可查看指定名称空间的对象,例如
+ ``` sh
+ # 查看所有名称空间的 Deployment
+ kubectl get deployments -A
+ kubectl get deployments --all-namespaces
+ # 查看 kube-system 名称空间的 Deployment
+ kubectl get deployments -n kube-system
+ ```
+ > [并非所有对象都在名称空间里](/learning/k8s-intermediate/obj/namespaces.html#并非所有对象都在名称空间里)
+ :::
+
- **kubectl describe** - 显示有关资源的详细信息
``` sh
diff --git a/learning/k8s-intermediate/persistent/limits.md b/learning/k8s-intermediate/persistent/limits.md
index e0cf5bd..b6e42da 100644
--- a/learning/k8s-intermediate/persistent/limits.md
+++ b/learning/k8s-intermediate/persistent/limits.md
@@ -1,5 +1,5 @@
---
-# vssueId: 59
+vssueId: 152
layout: LearningLayout
description: Kubernetes教程_本文介绍Kubernetes中Volume(数据卷)的基本概念_用法以及支持的数据卷类型
meta:
diff --git a/learning/k8s-intermediate/service/connecting.md b/learning/k8s-intermediate/service/connecting.md
index b552bca..48ab2a2 100644
--- a/learning/k8s-intermediate/service/connecting.md
+++ b/learning/k8s-intermediate/service/connecting.md
@@ -420,6 +420,8 @@ Hit enter for command prompt
## 暴露 Service
+
+
在您的应用程序中,可能有一部分功能需要通过 Service 发布到一个外部的 IP 地址上。Kubernetes 支持如下两种方式:
* [NodePort](./service-types.html#nodeport)
* [LoadBalancer](./service-types.html#loadbalancer)
@@ -458,3 +460,5 @@ spec:
* 对于 HTTP、HTTPS 形式的访问推荐使用 Ingress 替代这种用法,参考 [Ingress通过互联网访问您的应用](./ingress.html)
* 对于 TCP、UDP 等形式的访问,您仍然应该使用 Service NodePort
:::
+
+
diff --git a/learning/k8s-intermediate/service/host-alias.md b/learning/k8s-intermediate/service/host-alias.md
index 72acfc7..8ac6e40 100644
--- a/learning/k8s-intermediate/service/host-alias.md
+++ b/learning/k8s-intermediate/service/host-alias.md
@@ -108,6 +108,8 @@ fe00::2 ip6-allrouters
## 为什么kubelet要管理hosts文件
+
+
Kubelet [管理](https://github.com/kubernetes/kubernetes/issues/14633) `hosts` Pod 中每个容器的 hosts 文件,以便可以阻止 Docker 在容器启动以后 [修改](https://github.com/moby/moby/issues/17190) 该文件。
细节情况请参考两个 github issue:
@@ -117,3 +119,5 @@ Kubelet [管理](https://github.com/kubernetes/kubernetes/issues/14633) `hosts`
[https://github.com/moby/moby/issues/17190](https://github.com/moby/moby/issues/17190)
由于该文件已经被 Kubelet 管理起来,任何对该文件手工修改的内容,都将在 Kubelet 重启容器或者 Pod 重新调度时被覆盖。因此,最好是通过 `hostAliases` 修改 Pod 的 /etc/hosts 文件,而不是手工修改。
+
+
diff --git a/learning/k8s-intermediate/workload/wl-job/index.md b/learning/k8s-intermediate/workload/wl-job/index.md
index bd452cd..e48c338 100644
--- a/learning/k8s-intermediate/workload/wl-job/index.md
+++ b/learning/k8s-intermediate/workload/wl-job/index.md
@@ -1,11 +1,98 @@
---
+vssueId: 151
layout: LearningLayout
-description: 本文描述了 Kubernetes Job 的概念、行为及用法
+description: Kubernetes中的Job对象将创建一个或多个Pod_并确保指定数量的Pod可以成功执行到进程正常结束_当Job创建的 Pod执行成功并正常结束时_Job将记录成功结束的Pod数量_当成功结束的Pod达到指定的数量时_Job将完成执行
meta:
- name: keywords
- content: Kubernetes教程,K8S教程,Kubernetes Job
+ content: Kubernetes教程,K8S教程,K8S培训,Kubernetes Job
---
# 控制器 - Job
-正在撰写...
+
+
+
+
+Kubernetes中的 Job 对象将创建一个或多个 Pod,并确保指定数量的 Pod 可以成功执行到进程正常结束:
+* 当 Job 创建的 Pod 执行成功并正常结束时,Job 将记录成功结束的 Pod 数量
+* 当成功结束的 Pod 达到指定的数量时,Job 将完成执行
+* 删除 Job 对象时,将清理掉由 Job 创建的 Pod
+
+一个简单的例子是:创建一个 Job 对象用来确保一个 Pod 的成功执行并结束。在第一个 Pod 执行失败或者被删除(例如,节点硬件故障或机器重启)的情况下,该 Job 对象将创建一个新的 Pod 以重新执行。
+
+当然,您也可以使用 Job 对象并行执行多个 Pod。
+
+
+## 运行一个Job的例子
+
+在下面这个 Job 的例子中,Pod 执行了一个跟 π 相关的计算,并打印出最终结果,该计算大约需要 10 秒钟执行结束。
+
+<<< @/.vuepress/public/statics/learning/job/job.yaml
+
+* 执行如下命令创建该对象:
+
+ ``` sh
+ kubectl apply -f https://kuboard.cn/statics/learning/job/job.yaml
+ ```
+
+* 执行命令查看创建结果
+ ``` sh
+ kubectl describe jobs/pi
+ ```
+ 输出结果如下
+ ```
+ Name: pi
+ Namespace: default
+ Selector: controller-uid=b1db589a-2c8d-11e6-b324-0209dc45a495
+ Labels: controller-uid=b1db589a-2c8d-11e6-b324-0209dc45a495
+ job-name=pi
+ Annotations:
+ Parallelism: 1
+ Completions: 1
+ Start Time: Tue, 07 Jun 2016 10:56:16 +0200
+ Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
+ Pod Template:
+ Labels: controller-uid=b1db589a-2c8d-11e6-b324-0209dc45a495
+ job-name=pi
+ Containers:
+ pi:
+ Image: perl
+ Port:
+ Command:
+ perl
+ -Mbignum=bpi
+ -wle
+ print bpi(2000)
+ Environment:
+ Mounts:
+ Volumes:
+ Events:
+ FirstSeen LastSeen Count From SubobjectPath Type Reason Message
+ --------- -------- ----- ---- ------------- -------- ------ -------
+ 1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: pi-dtn4q
+ ```
+
+ * 执行以下命令可查看所有结束的 Pod
+ ``` sh
+ kubectl get pods
+ ```
+ * 执行以下命令可获得该 Job 所有 Pod 的名字:
+ ``` sh
+ pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath='{.items[*].metadata.name}')
+ echo $pods
+ ```
+ 输出结果如下
+ ```
+ pi-aiw0a
+ ```
+ 在这个命令中:
+ * selector 与 Job 定义中的 selector 相同
+ * `--output=jsonpath` 选项指定了一个表达式,该表达式从返回结果列表中的每一个 Pod 的信息中定位出 `name` 字段的取值
+ * 执行以下命令可查看 Pod 的日志:
+ ``` sh
+ kubectl logs $pods
+ ```
+ 输出结果如下:
+ ```
+ 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
+ ```
diff --git a/learning/k8s-intermediate/workload/wl-job/spec.md b/learning/k8s-intermediate/workload/wl-job/spec.md
new file mode 100644
index 0000000..56d854a
--- /dev/null
+++ b/learning/k8s-intermediate/workload/wl-job/spec.md
@@ -0,0 +1,71 @@
+---
+vssueId: 151
+layout: LearningLayout
+description: Kubernetes中的Job对象将创建一个或多个Pod_并确保指定数量的Pod可以成功执行到进程正常结束_当Job创建的 Pod执行成功并正常结束时_Job将记录成功结束的Pod数量_当成功结束的Pod达到指定的数量时_Job将完成执行
+meta:
+ - name: keywords
+ content: Kubernetes教程,K8S教程,K8S培训,Kubernetes Job
+---
+
+# 编写Job的定义
+
+
+
+与所有的 Kubernetes 对象一样,Job 对象的 YAML 文件中,都需要包括如下三个字段:
+* `.apiVersion`
+* `.kind`
+* `.metadata`
+
+Job 对象的 YAML 文件,还需要一个 `.spec` 字段。
+
+
+
+## Pod Template
+
+`.spec.template` 是必填字段:
+* 用于定义 [pod template](/learning/k8s-intermediate/workload/pod.html#容器组和控制器)
+* 与 Pod 有相同的字段内容,但由于是内嵌元素,pod template 不包括阿 `apiVersion` 字段和 `kind` 字段
+* 除了 Pod 所需的必填字段之外,Job 中的 pod template 必须指定
+ * 合适的标签 `.spec.template.spec.labels`,参考 [Pod Selector](#pod-selector)
+ * 指定合适的[重启策略 restartPolicy](/learning/k8s-intermediate/workload/pod-lifecycle.html#重启策略) `.spec.template.spec.restartPolicy`,此处只允许使用 `Never` 和 `OnFailure` 两个取值
+
+## Pod Selector
+
+`.spec.selector` 字段是可选的。绝大部分情况下,您不需要指定该字段。
+
+
+## Parallel Jobs
+
+有三种主要的任务类型适合使用 Job 运行:
+* Non-parallel Jobs
+ * 通常,只启动一个 Pod,除非该 Pod 执行失败
+ * Pod 执行成功并结束以后,Job 也立刻进入完成 completed 状态
+* Parallel Jobs with a fixed completion count
+ * `.spec.completions` 为一个非零正整数
+ * Job 将创建至少 `.spec.completions` 个 Pod,编号为 1 - `.spec.completions` 尚未实现
+ * Job 记录了任务的整体执行情况,当 1 - `.spec.completions` 中每一个编号都有一个对应的 Pod 执行成功时,Job 进入完成状态
+* Parallel Jobs with a work queue
+ * 不指定 `.spec.completions`,使用 `.spec.parallelism`
+ * Pod 之间必须相互之间自行协调并发,或者使用一个外部服务决定每个 Pod 各自执行哪些任务。例如,某个Pod可能从带工作队列(work queue)中取出最多N个条目的批次数据
+ * 每个 Pod 都可以独立判断其他同僚(peers)是否完成,并确定整个Job是否完成
+ * 当 Job 中任何一个 Pod 成功结束,将不再为其创建新的 Pod
+ * 当所有的 Pod 都结束了,且至少有一个 Pod 执行成功后才结束,则 Job 判定为成功结束
+ * 一旦任何一个 Pod 执行成功并退出,Job 中的任何其他 Pod 都应停止工作和输出信息,并开始终止该 Pod 的进程
+
+completions 和 parallelism
+* 对于 non-parallel Job,`.spec.completions` 和 `.spec.parallelism` 可以不填写,默认值都为 1
+* 对于 fixed completion count Job,需要设置 `.spec.completions` 为您期望的个数;同时不设置 `.spec.parallelism` 字段(默认值为 1)
+* 对于 work queue Job,不能设置 `.spec.completions` 字段,且必须设置 `.spec.parallelism` 为0或任何正整数
+
+## Controlling Parallelism 并发控制
+
+并发数 `.spec.parallelism` 可以被设置为0或者任何正整数,如果不设置,默认为1,如果设置为 0,则 Job 被暂停,直到该数字被调整为一个正整数。
+
+实际的并发数(同一时刻正在运行的 Pod 数量)可能比设定的并发数 `.spec.parallelism` 要大一些或小一些,不一定严格相等,主要的原因有:
+
+* 对于 fixed completion count Job,实际并发运行的 Pod 数量不会超过剩余未完成的数量。如果 `.spec.parallelism` 比这个数字更大,将被忽略
+* 对于 work queue Job,任何一个 Pod 成功执行后,将不再创建新的 Pod (剩余的 Pod 将继续执行)
+* Job 控制器可能没有足够的时间处理并发控制
+* 如果 Job 控制器创建 Pod 失败(例如,[ResourceQuota](/learning/k8s-advanced/policy/rq.html) 不够用,没有足够的权限等)
+* 同一个Job中,在已创建的 Pod 出现大量失败的情况下,Job 控制器可能限制 Pod 的创建
+* 当 Pod 被优雅地关闭时(gracefully shut down),需要等候一段时间才能结束
diff --git a/learning/k8s-practice/micro-service/kuboard-view-of-k8s.md b/learning/k8s-practice/micro-service/kuboard-view-of-k8s.md
index 660e391..2e03899 100644
--- a/learning/k8s-practice/micro-service/kuboard-view-of-k8s.md
+++ b/learning/k8s-practice/micro-service/kuboard-view-of-k8s.md
@@ -1,13 +1,14 @@
---
vssueId: 67
layout: LearningLayout
+lessAds: true
description: Kubernetes教程_本文描述了一个经典微服务参考架构_并且通过三个视图(集群概览、名称空间、工作负载)理解微服务与Kubernetes的映射关系。
meta:
- name: keywords
content: Kubernetes教程,K8S教程,Kubernetes微服务,K8S培训,K8S教程
---
-# 从微服务视角看Kubernetes
+# 从微服务视角理解Kubernetes,并快速在K8S上落地微服务
@@ -20,7 +21,24 @@ meta:
* 更多的部署单元
* 更复杂的部署脚本
-作者在落地 Spring Cloud 微服务的过程中,设计了如下图所示的微服务参考架构:
+Kuboard 为了降低 Kubernetes 学习使用门槛,提供了:
+* **K8S快速安装文档**
+
+ 过去仅仅是安装 Kubernetes 这件事情,初学者都需要用 1 个星期甚至 1 个月才能搞定。如今 Kuboard 提供了安装文档,每天有300多人验证的,初学者30分钟即可完成安装,碰到问题还可在QQ社群在线免费答疑。
+
+* **免费K8S教程**
+
+ Kubernetes 作为一款开源软件,其官方文档为英文,市面上大部分中文书籍与当前最新的版本存在出入。kuboard.cn 提供了最新的 K8S 免费中文教程,整理了最佳学习路径,帮助初学者快速完成从入门到投产的过程。
+
+* **管理面板**
+
+ 使用 Kuboard 作为 Kubernetes 管理面板,无需编写 yaml 文件,直接以图形界面完成 Kubernetes 的管理和运维任务
+
+* **微服务实战**
+
+ 以当下主流的 Spring Cloud 微服务架构作为例子,完成在 Kubernetes 上落地微服务架构的任务。
+
+Kuboard 在落地 Spring Cloud 微服务的过程中,设计了如下图所示的微服务参考架构:

diff --git a/support/change-log/change-log-on-the-way.md b/support/change-log/change-log-on-the-way.md
index 8eb57af..aecdce2 100644
--- a/support/change-log/change-log-on-the-way.md
+++ b/support/change-log/change-log-on-the-way.md
@@ -1,28 +1,11 @@
Kuboard v1.0.x 的更新说明
-
-## v1.0.4-beta.4
-
-**发布日期**
-
-2019年10月13日
-
-**新特性**
-
-**优化**
-
-* 修改提示:创建 docker 仓库的 Secret --> 填写 docker 仓库地址时,请以 http:// 或 https:// 开头
-
-**BUG 修复**
-
-* 工作负载编辑器 --> Ingress --> 注解被错误写成标签了
-
-* 打开监控界面时,应该使用 a 标签,而不是window.open 避免被浏览器屏蔽
-* PV可以不与StorageClass关联(手工创建PV的情况)
+* NFS 使用优化
+* 下载日志文件
+* 配置 nfs 时,提示需要能够在节点上 mount,并给出 mount 语句
* 导入工作负载时,如果存储类没有 annotations,不应该报错
* 表单校验:数据卷名不能带小数点
-* Kubernetes 体验的安装文档需要优化。
-* 点击空白处,不关闭对话框
+* Kubernetes 体验的安装文档需要优化
* Prometheus 监控
* 工作负载编辑器 --> 容器组 --> 容忍 -- 正在开发
* HostAliases
@@ -40,7 +23,6 @@ Kuboard v1.0.x 的更新说明
* PV 中支持 hostPath
-* 创建工作负载时,不追加前缀
* 存储卷声明去掉分配模式的字段
* 删除容器组时 - graceful period
* Pod Conditions: lastProbeTime/reason/message
diff --git a/support/change-log/v1.0.x.md b/support/change-log/v1.0.x.md
index e62d06e..2367f0a 100644
--- a/support/change-log/v1.0.x.md
+++ b/support/change-log/v1.0.x.md
@@ -9,6 +9,26 @@ description: 本文描述了Kuboard_v1.0.x的版本变更说明
Kuboard v1.0.x 的更新说明
+## v1.0.4-beta.5
+
+**发布日期**
+
+2019年10月27日
+
+**优化**
+
+* 设置页面 favicon
+* 修改提示:创建 docker 仓库的 Secret --> 填写 docker 仓库地址时,请以 http:// 或 https:// 开头
+* 点击空白处,不关闭对话框
+* 日志/终端不能访问时,引导用户到问题诊断页面
+* 监控套件提示--浏览器不能禁用弹出窗口 window.open
+* 对话框打开时,点击空白处不能关闭对话框,必须点击“关闭”或“返回”按钮才能关闭。避免误操作
+
+**BUG 修复**
+
+* 工作负载编辑器 --> Ingress --> 注解被错误写成标签了
+* 集群概览中,可以显示手工创建的不与StorageClass关联的PV
+
## v1.0.4-beta.4
**发布日期**