diff --git a/.vuepress/config.js b/.vuepress/config.js index d4e529c..351244a 100644 --- a/.vuepress/config.js +++ b/.vuepress/config.js @@ -7,7 +7,8 @@ module.exports = { ['meta', {name: 'keywords', content: 'Kubernetes, Docker, Dashboard, Kuboard, Spring Cloud, micro service, DevOps, 微服务, 持续构建集成, 容器, Kubernetes 教程, K8S 教程, 微服务实践, Kubernetes 安装'}] ], markdown: { - toc: { includeLevel: [2, 3] } + toc: { includeLevel: [2, 3] }, + lineNumbers: true }, dest: 'docs', plugins: { @@ -160,6 +161,14 @@ module.exports = { 'k8s-basics/update' ] }, + { + title: 'Kubernetes 进阶', + collapsable: false, + children: [ + 'k8s-intermediate/ingress', + 'k8s-intermediate/recommendation' + ] + }, ], '/guide/': [ diff --git a/.vuepress/public/kuboard.rp b/.vuepress/public/kuboard.rp index f5d66f3..48dafa9 100644 Binary files a/.vuepress/public/kuboard.rp and b/.vuepress/public/kuboard.rp differ diff --git a/learning/k8s-basics/expose.md b/learning/k8s-basics/expose.md index fc4fee7..1f550fa 100644 --- a/learning/k8s-basics/expose.md +++ b/learning/k8s-basics/expose.md @@ -47,7 +47,8 @@ Service是一个抽象层,它通过 LabelSelector 选择了一组 Pod(容器 Service A 将请求转发到 IP 为 10.10.10.1 的Pod上, Service B 将请求转发到 IP 为 10.10.10.2、10.10.10.3、10.10.10.4 的Pod上。 -![img](./expose.assets/module_04_services.svg) + + Service 将外部请求路由到一组 Pod 中,它提供了一个抽象层,使得 Kubernetes 可以在不影响服务调用者的情况下,动态调度容器组(在容器组失效后重新创建容器组,增加或者减少同一个 Deployment 对应容器组的数量等)。 @@ -148,7 +149,7 @@ kubectl apply -f nginx-service.yaml kubectl get services -o wide ``` -可查看到名称为nginx-service的服务。 +可查看到名称为 nginx-service 的服务。 **访问服务** diff --git a/learning/k8s-basics/ingress.md b/learning/k8s-basics/ingress.md deleted file mode 100644 index 7bf00b7..0000000 --- a/learning/k8s-basics/ingress.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -description: 本文介绍 Kubernetes Ingress 的概念,包括Ingress 基本概念、如何配置 Ingress Controller、如何使用 kubectl/Kuboard 操作 Ingress 信息 ---- - -# 通过互联网访问您的应用 - -参考文档: -* Kubernetes 官网 [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) -* Kubernetes 官网 [Ingress Controllers](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) -* Kubernetes Nginx Ingress Controller [Bare-metal considerations](https://kubernetes.github.io/ingress-nginx/deploy/baremetal/) -* nginxinc/kubernets-ingress [kubernetes-ingress](https://github.com/nginxinc/kubernetes-ingress) - -## Ingress - -Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。Ingress 具备如下特性:集群外部可访问的 URL、负载均衡、SSL Termination、按域名路由(name-based virtual hosting)。 diff --git a/learning/k8s-intermediate/ingress.assets/image-20190827183054487.png b/learning/k8s-intermediate/ingress.assets/image-20190827183054487.png new file mode 100644 index 0000000..16a99c8 Binary files /dev/null and b/learning/k8s-intermediate/ingress.assets/image-20190827183054487.png differ diff --git a/learning/k8s-intermediate/ingress.assets/image-20190827221314997.png b/learning/k8s-intermediate/ingress.assets/image-20190827221314997.png new file mode 100644 index 0000000..c6c3ea2 Binary files /dev/null and b/learning/k8s-intermediate/ingress.assets/image-20190827221314997.png differ diff --git a/learning/k8s-intermediate/ingress.md b/learning/k8s-intermediate/ingress.md new file mode 100644 index 0000000..d428b77 --- /dev/null +++ b/learning/k8s-intermediate/ingress.md @@ -0,0 +1,226 @@ +--- +description: 本文介绍 Kubernetes Ingress 的概念,包括Ingress 基本概念、如何配置 Ingress Controller、如何使用 kubectl/Kuboard 操作 Ingress 信息 +--- + +# 通过互联网访问您的应用 + +参考文档: +* Kubernetes 官网 [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) +* Kubernetes 官网 [Ingress Controllers](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/) +* Kubernetes Nginx Ingress Controller [Bare-metal considerations](https://kubernetes.github.io/ingress-nginx/deploy/baremetal/) +* nginxinc/kubernets-ingress [kubernetes-ingress](https://github.com/nginxinc/kubernetes-ingress) + +## Ingress + +Ingress 是 Kubernetes 的一种 API 对象,将集群内部的 Service 通过 HTTP/HTTPS 方式暴露到集群外部,并通过规则定义 HTTP/HTTPS 的路由。Ingress 具备如下特性:集群外部可访问的 URL、负载均衡、SSL Termination、按域名路由(name-based virtual hosting)。 + +Ingress Controller (通常需要负载均衡器配合)负责实现 Ingress API 对象所声明的能力。如下图所示: + +* Ingress Controller 监听所有 worker 节点上的 80/443 端口 +* Ingress Controller 将所有对域名为 a.kuboard.cn 的 HTTP/HTTPS 请求路由到 Service B 的 9080 端口 +* Service B 将请求进一步转发到其标签所选择的 Pod 容器组(通过 targetPort 指定容器组上的端口号) + +在下图的 Ingress B 及 Service B 被正确配置的情况下,您将获得如下效果: +* 将 a.kuboard.cn 解析到任意一个 worker 节点的外网 IP 地址(也可以是内网 IP 地址,但此时您的客户端机器也必须在内网) +* 从客户端机器执行命令 `curl http://a.kuboard.cn` 您将获得如下容器组当中一个的返回结果: 10.10.10.2、10.10.10.4、10.10.10.3 + + + + + +## Ingress Controller + +如上所述,您必须在 Kubernetes 集群中安装了 Ingress Controller,您配置的 Ingress 才能生效。 + +::: tip 划重点 + +Ingress 只是 Kubernetes 中的一种配置信息;Ingress Controller 才是监听 80/443 端口,并根据 Ingress 上配置的路由信息执行 HTTP 路由转发的组件。 + +::: + +Ingress Controller 有多种实现可供选择,请参考 Kubernetes 官方文档 [Additional controllers](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/#additional-controllers),比较常用的有 [Traefic](https://github.com/containous/traefik) 、 [Nginx Ingress Controller for Kubernetes](https://www.nginx.com/products/nginx/kubernetes-ingress-controller) 等。 + +如果您参考 https://kuboard.cn 网站上提供的文档安装了 Kubernetes,您应该已经完成了 [Nginx Ingress Controller for Kubernetes](https://www.nginx.com/products/nginx/kubernetes-ingress-controller) 在您 Kubernetes 集群中的安装。该 Ingress Controller 以 DaemonSet 的类型部署到 Kubernetes,且监听了 hostPort 80/443,YAML 片段如下所示: + +> 如果您打算使用其他 Ingress Controller,您可以 [卸载 Nginx Ingress Controller](/install/install-k8s.html#安装-ingress-controller);如果您尚未安装任何 Ingress Controller,请参考 [安装 Nginx Ingress Controller](/install/install-k8s.html#安装-ingress-controller),以便可以完成本教程的后续内容。 + + +``` yaml {2,23,26} +apiVersion: extensions/v1beta1 +kind: DaemonSet +metadata: + name: nginx-ingress + namespace: nginx-ingress + # ... +spec: + selector: + matchLabels: + app: nginx-ingress + template: + metadata: + labels: + app: nginx-ingress + spec: + serviceAccountName: nginx-ingress + containers: + - image: nginx/nginx-ingress:1.5.3 + name: nginx-ingress + ports: + - name: http + containerPort: 80 + hostPort: 80 + - name: https + containerPort: 443 + hostPort: 443 +``` + + +::: tip + +* Ingress Controller 并非只能监听 80/443 端口,您可以根据自己网络拓扑的需要,选择合适的端口 +* 根据您安装 Ingress Controller 的方式不同,您的 Ingress Controller 并不一定监听了所有 worker 节点的 80/443 端口(本教程不涉及此主题) +* 您也可以在 Kubernetes 集群中安装多种 Ingress Controller,请参考 [Using multiple Ingress controllers](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/#using-multiple-ingress-controllers) + +::: + +## 融入到网络拓扑中 + +如前所述,Kubernetes Ingress 只能监听到节点的 80/443 端口,且 Ingress 可以完成 L7 路由的功能。由于 Kubernetes Ingress 配置更便捷,推荐使用 Kubernetes Ingress 替代常规的互联网应用架构中的 Nginx 反向代理。那么,如何使部署在内网的 Kubernetes 集群上的 Ingress Controller 的 80/443 端口可以在外网访问到呢? + +本教程推荐如下两种做法,结合您自己对安全性、可靠性等因素的考量,您可以演化出适合自己的拓扑结构。 + +### 暴露单worker节点 + +如下图所示,暴露单个 worker 节点的步骤如下: + +* 为您 Kubernetes 集群中的某一个 worker 节点配置外网 IP 地址 Z.Z.Z.Z +* 将您在 Ingress 中使用到的域名(假设是`a.demo.kuboard.cn`)解析到该外网 IP 地址 Z.Z.Z.Z +* 设置合理的安全组规则(开放该外网 IP 地址 80/443 端口的入方向访问) + +> 文档 [安装 Kubernetes 单Master节点](/install/install-k8s.html) 中使用的就是这种拓扑结构。这种方式下,Ingress Controller 存在单点故障的可能性。 + +![单IngressController节点](../../install/install-k8s.assets/image-20190826000521999.png) + +### 使用外部负载均衡器 + +如下图所示,使用外部负载均衡器的步骤如下: + +* 创建一个集群外部的负载均衡器,该负载均衡器拥有一个外网 IP 地址 Z.Z.Z.Z,并监听 80/443 端口的 TCP 协议 +* 将负载均衡器在 80/443 端口上监听到的 TCP 请求转发到 Kubernetes 集群中所有(或某些)worker 节点的 80/443 端口,可开启按源IP地址的会话保持 +* 将您在 Ingress 中使用到的域名(假设是`a.demo.kuboard.cn`)解析到该负载均衡器的外网 IP 地址 Z.Z.Z.Z + +> 文档 [安装 Kubernetes 高可用](/install/install-kubernetes.html) 中使用的就是这种拓扑结构。 + +![LoadBalancer](../../install/install-kubernetes.assets/image-20190826000403193.png) + +## 实战:通过 Ingress 使您的应用程序在互联网可用 + +::: warning 前提 +* 假设您已经完成了 [公布应用程序](/learning/k8s-basics/expose.html) 中的实战部分 +* 假设您已经将 Ingress 融入到您的网络拓扑中,并且将 `*.demo.kuboard.cn` (请使用您自己的域名)解析到对应的外网 IP 地址 +::: + +:::: tabs type:border-card + +::: tab 使用kubectl lazy + +**创建文件 nginx-ingress.yaml** +``` sh +vim nginx-ingress.yaml +``` + +**文件内容如下** + + + + + + +**执行命令** + +``` sh +kubectl apply -f nginx-ingress.yaml +``` + +**检查执行结果** + +``` sh +kubectl get ingress -o wide +``` + +可查看到名称为 my-ingress-for-nginx 的 Ingress。 + +**从互联网访问** + +``` sh +# 请使用您自己的域名 +curl a.demo.kuboard.cn +``` +::: + +::: tab 使用Kuboard lazy + +* 在 default 名称空间 点击 ***展现层 --> Nginx部署*** + +* 点击 ***编辑*** 按钮 + +* 填写表单如下: + * 开启 **互联网入口 Ingress** + * 填写一条记录: + + | 协议 | 服务端口 | 节点端口 | + | ----------------- | ----------------- | -------- | + | 域名 | a.demo.kuboard.cn | 32601 | + | 路由配置/映射URL | / | | + | 路由配置/服务端口 | 80 | | + + **如下图所示:** + + ![image-20190827221314997](./ingress.assets/image-20190827221314997.png) + +* 点击 **保存** + +* 点击 **应用** + +* **从互联网访问** + + 在浏览器打开 `http://a.demo.kuboard.cn` (请使用您自己的域名) + +::: + +:::: diff --git a/learning/k8s-intermediate/recommendation.assets/88302026c83b209ccc6261c63281a963.jpg b/learning/k8s-intermediate/recommendation.assets/88302026c83b209ccc6261c63281a963.jpg new file mode 100644 index 0000000..e063842 Binary files /dev/null and b/learning/k8s-intermediate/recommendation.assets/88302026c83b209ccc6261c63281a963.jpg differ diff --git a/learning/k8s-intermediate/recommendation.md b/learning/k8s-intermediate/recommendation.md new file mode 100644 index 0000000..c1aaca6 --- /dev/null +++ b/learning/k8s-intermediate/recommendation.md @@ -0,0 +1,31 @@ +# Kubernetes 课程推荐 + +作者认为,基础比较好的同学,在学完 **Kubernetes 入门** 部分的内容后,就可以根据 Kubernetes 的官网文档和 docker 的官网文档,结合实际项目将 Kubernetes 应用得很好。同时,作者也在逐步完善 **Kubernetes 进阶** 的学习内容,例如 [通过互联网访问您的应用](./ingress.html),但是鉴于时间和进度的原因,短期内仍然不能很好的满足 Kubernetes 爱好者迫切的学习意愿。 + +在这种情况下,作者向大家推荐一份视频课程。该课程价格为 99 元,新注册用户享有 30 元现金优惠,也就是只需要 69 元 即可购买该套课程。 + +点击此处购买 深入剖析Kubernetes ,或扫描图片中的二维码。 + + + + diff --git a/overview/README.md b/overview/README.md index ac2febe..ec0832c 100644 --- a/overview/README.md +++ b/overview/README.md @@ -18,7 +18,7 @@ A cool Kubernetes dashboard. justify-content: space-between;">

- 1 天落地 Kubernetes + 快速落地 Kubernetes

  • 快速安装 @@ -124,11 +124,12 @@ Kuboard 为 Kubernetes 初学者设计了如下学习路径: * **Kubernetes 进阶** * [从微服务视角理解 Kubernetes](/articles/201908/kuboard-view-of-k8s.html) + * [通过互联网访问您的应用](/learning/k8s-intermediate/ingress.html) * 进阶路线一 * 在实际项目中锻炼,完成各种与微服务、容器化、Kubernetes更多高级功能的学习、理解和应用 * **适合人群:** 身边有人带路,并且技术功底比较强的人,能够自行翻阅大量 docker / kubernetes 的官网英文资料。这些人在完成上面的 Kubernetes 入门教程之后,基本上可以在项目中开始实战了。 * 进阶路线二 - * 购买一套口碑比较好的视频课程,例如 深入剖析Kubernetes ,由 Kubernetes 社区资深成员与项目维护者 张磊 创作,价钱也仅相当于三杯咖啡的样子。 + * 购买一套口碑比较好的视频课程,例如 深入剖析Kubernetes ,由 Kubernetes 社区资深成员与项目维护者 张磊 创作,价钱也仅相当于两杯咖啡的样子。 * **适合人群:** 技术功底相对薄弱,想要多学习一些理论,在理解 docker /kubernetes 等官网英文资料存在一定困难的人群