@wxy
This commit is contained in:
Xingyu Wang 2020-04-07 10:41:00 +08:00
parent 73bd2d20c3
commit a26ba55a7d

View File

@ -1,6 +1,6 @@
[#]: collector: (lujun9972) [#]: collector: (lujun9972)
[#]: translator: (wxy) [#]: translator: (wxy)
[#]: reviewer: ( ) [#]: reviewer: (wxy)
[#]: publisher: ( ) [#]: publisher: ( )
[#]: url: ( ) [#]: url: ( )
[#]: subject: (Directing Kubernetes traffic with Traefik) [#]: subject: (Directing Kubernetes traffic with Traefik)
@ -16,21 +16,21 @@
在本文中,我们将部署几个简单的网站,并学习如何使用 Traefik 将来自外部世界的流量引入到我们的集群中。之后,我们还将学习如何删除 Kubernetes 资源。让我们开始吧! 在本文中,我们将部署几个简单的网站,并学习如何使用 Traefik 将来自外部世界的流量引入到我们的集群中。之后,我们还将学习如何删除 Kubernetes 资源。让我们开始吧!
- [video](https://youtu.be/QcC-5fRhsM8) - [video](https://img.linux.net.cn/static/video/Ingressing%20with%20k3s-QcC-5fRhsM8.mp4)
### 准备 ### 准备
要继续阅读本文,你只需要我们在上一篇文章中构建的 [k3s 树莓派集群][2]。由于你的集群将从网络上拉取像,因此该集群需要能够访问互联网。 要继续阅读本文,你只需要我们在上一篇文章中构建的 [k3s 树莓派集群][2]。由于你的集群将从网络上拉取像,因此该集群需要能够访问互联网。
出于解释目的,本文将显示一些配置文件和示例 HTML 文件。所有示例文件都可以在[此处][3]下载。 出于解释目的,本文将显示一些配置文件和示例 HTML 文件。所有示例文件都可以在[此处][3]下载。
### 部署一个简单的网站 ### 部署一个简单的网站
之前,我们使用 `kubectl` 进行了直接部署。但是,这不是部署事物的典型方法。通常,会使用 YAML 配置文件,这就是我们将在本文中使用的配置文件。我们将从顶部开始,并以自顶向下的方式创建该配置文件。 之前,我们使用 `kubectl` 进行了直接部署。但是,这不是典型的部署方法。一般情况都会使用 YAML 配置文件,这也是我们要在本文中使用的配置文件。我们将从顶部开始,并以自顶向下的方式创建该配置文件。
### 部署配置 ### 部署配置
首先是部署配置。配置如下所示,并在下面进行说明。我通常以 [Kubernetes 文档][4]中的示例为起点,然后对其进行修改以适合我的需求。例如,从[部署文档][5]复制示例后,修改下面的配置 首先是部署配置。配置如下所示,并在下面进行说明。我通常以 [Kubernetes 文档][4]中的示例为起点,然后根据需要对其进行修改。例如,下面的配置是复制了[部署文档][5]中的示例后修改的
创建一个文件 `mysite.yaml`,其内容如下: 创建一个文件 `mysite.yaml`,其内容如下:
@ -58,15 +58,15 @@ spec:
- containerPort: 80 - containerPort: 80
``` ```
其中大部分是样板。重要的部分,我们会将该部署命名为 `mysite-nginx`,并加上 `mysite-nginx``app` 标签。我们已指定要一个<ruby>副本<rt>replica</rt></ruby>,这意味着将只创建一个 Pod。我们还指定了一个容器我们将其命名为 `nginx`。我们将<ruby>镜像<rt>image</rt></ruby>指定为 `nginx`。这意味着在部署时k3s 将从 DockerHub 下载 `nginx` 镜像并从中创建一个 Pod。最后我们指定了<ruby>容器端口<rt>containerPort</rt></ruby>`80`,这只意味着在容器内部 Pod 会监听 `80` 端口。 其中大部分是样板。重要的部分,我们会将该部署命名为 `mysite-nginx`,并为其加上同名的 `app` 标签。我们指定了一个<ruby>副本<rt>replica</rt></ruby>,这意味着将只创建一个 Pod。我们还指定了一个容器我们将其命名为 `nginx`。我们将<ruby>镜像<rt>image</rt></ruby>指定为 `nginx`。这意味着在部署时k3s 将从 DockerHub 下载 `nginx` 镜像并从中创建一个 Pod。最后我们指定了<ruby>容器端口<rt>containerPort</rt></ruby>`80`,这只意味着在容器内部 Pod 会监听 `80` 端口。
我在上面强调了“在容器内部”,因为这是一个重要的区别。由于我们是按容器配置的,因此只能在容器内部访问它,并且进一步将其限制为内部网络。这是允许多个容器在同一容器端口上监听所必需的。换句话说,通过这种配置,其他某些 Pod 也可以在其容器端口 80 上侦听,并且不会与此容器冲突。为了提供对该 Pod 的正式访问权限,我们需要一个<ruby>服务<rt>service</rt></ruby>配置。 我在上面强调了“在容器内部”,因为这是一个重要的区别。由于我们是按容器配置的,因此只能在容器内部访问它,并且进一步将其限制为内部网络。这对于允许多个容器在同一容器端口上监听所是必要的。换句话说,通过这种配置,其他一些 Pod 也可以在其容器端口 80 上侦听,并且不会与此容器冲突。为了提供对该 Pod 的正式访问权限,我们需要一个<ruby>服务<rt>service</rt></ruby>配置。
### 服务配置 ### 服务配置
在 Kubernetes 中,<ruby>服务<rt>service</rt></ruby>是一种抽象。它提供了一种访问一个或一组 Pod 的方法。如果定义了多个 Pod 副本,则一个连接到服务,并且由服务路由到单个 Pod通过负载均衡路由到多个 Pod。 在 Kubernetes 中,<ruby>服务<rt>service</rt></ruby>是一种抽象。它提供了一种访问 Pod 或 Pod 集合的方法。当连接到服务时,服务会路由到单个 Pod或者如果定义了多个 Pod 副本,会通过负载均衡路由到多个 Pod。
可以在同一配置文件中指定该服务,这就是我们将在此处执行的操作。用 `---` 分隔配置区域。将以下内容添加到 `mysite.yaml` 中: 可以在同一配置文件中指定该服务,这就是我们将在此处要做的。用 `---` 分隔配置区域,将以下内容添加到 `mysite.yaml` 中:
``` ```
--- ---
@ -82,11 +82,11 @@ spec:
port: 80 port: 80
``` ```
在此配置中,我们将服务命名为 `mysite-nginx-service`。我们提供了 `app: mysite-nginx`<ruby>选择器<rt>selector</rt></ruby>。这是服务选择其路由到的应用程序容器的方式。请记住,我们为容器提供了一个内容为 `mysite-nginx` `app` 标签。这就是服务用来查找我们的容器的方式。最后,我们指定服务协议为 `TCP`,在端口 `80`听。 在此配置中,我们将服务命名为 `mysite-nginx-service`。我们提供了一个<ruby>选择器<rt>selector</rt></ruby>`app: mysite-nginx`。这是服务选择其路由到的应用程序容器的方式。请记住,我们为容器提供了 `app` 标签:`mysite-nginx` 。这就是服务用来查找我们的容器的方式。最后,我们指定服务协议为 `TCP`,在端口 `80`听。
### 入口配置 ### 入口配置
<ruby>入口<rt>Ingress</rt></ruby>配置指定如何将流量从集群外部传递到集群内部的服务。请记住k3s 预先配置了 Traefik 作为入口控制器。因此,我们将编写特定于 Traefik 的入口配置。将以下内容添加到 `mysite.yaml` 中(不要忘了用 `---` 分隔): <ruby>入口<rt>Ingress</rt></ruby>配置指定如何将流量从集群外部传递到集群内部的服务。请记住k3s 预先配置了 Traefik 作为入口控制器。因此,我们将编写特定于 Traefik 的入口配置。将以下内容添加到 `mysite.yaml` 中(不要忘了用 `---` 分隔):
``` ```
--- ---
@ -106,13 +106,13 @@ spec:
servicePort: 80 servicePort: 80
``` ```
在此配置中,我们将入口记录命名为 `mysite-nginx-ingress`。我们告诉 Kubernetes我们希望 `traefik` 成为我们的入口控制器,带有 `kubernetes.io/ingress.class` 的注解。 在此配置中,我们将入口记录命名为 `mysite-nginx-ingress`。我们告诉 Kubernetes我们希望 `traefik` 成为我们的入口控制器,再加上 `kubernetes.io/ingress.class` 的注解。
<ruby>规则<rt>rules</rt></ruby>部分中,我们基本上是说,当 `http` 流量进入时,并且 `path` 匹配 `/`(或其下的任何内容),将其路由到由 `serviceName mysite-nginx-service` 指定的<ruby>后端<rt>backend</rt></ruby>服务中,并将其路由到 `servicePort 80`。这会将传入的 HTTP 流量连接到我们之前定义的服务。 <ruby>规则<rt>rules</rt></ruby>部分中,我们基本上是说,当 `http` 流量进入时,并且 `path` 匹配 `/`(或其下的任何内容),将其路由到由 `serviceName mysite-nginx-service` 指定的<ruby>后端<rt>backend</rt></ruby>服务中,并将其路由到 `servicePort 80`。这会将传入的 HTTP 流量连接到我们之前定义的服务。
### 部署的东西 ### 需要部署的东西
就配置而言,确实如此。如果现在部署,我们将获得默认的 nginx 页面,但这不是我们想要的。让我们创建一些简单但可自定义的部署方式。创建具有以下内容的文件 `index.html` 就配置而言,就是这样了。如果我们现在部署,我们将获得默认的 nginx 页面,但这不是我们想要的。让我们创建一些简单但可自定义的部署方式。创建具有以下内容的文件 `index.html`
``` ```
<html> <html>
@ -143,13 +143,13 @@ spec:
</html> </html>
``` ```
我们尚未介绍 Kubernetes 中的存储机制,因此在这里我们偷懒一下,仅将该文件存储在 Kubernetes 配置映射中。这不是建议的网站部署方式,但可以满足我们的目的。运行以下命令: 我们尚未介绍 Kubernetes 中的存储机制,因此在这里我们偷懒一下,仅将该文件存储在 Kubernetes 配置映射中。这不是我们推荐的部署网站的方式,但对于我们的目的来说是可行的。运行以下命令:
``` ```
kubectl create configmap mysite-html --from-file index.html kubectl create configmap mysite-html --from-file index.html
``` ```
该命令从本地文件 `index.html` 创建名为 `mysite-html`<ruby>配置映射<rt>configmap</rt></ruby>资源。这实际上是在 Kubernetes 资源中存储一个文件(或一组文件),我们可以在配置中调出该文件。它通常用于存储配置文件(因此而得名),因此我们在这里稍加滥用。在以后的文章中,我们将讨论 Kubernetes 中适当的存储解决方案。 该命令从本地文件 `index.html` 创建名为 `mysite-html`<ruby>配置映射<rt>configmap</rt></ruby>资源。这实际上是在 Kubernetes 资源中存储一个文件(或一组文件),我们可以在配置中调出该文件。它通常用于存储配置文件(因此而得名),我们在这里稍加滥用。在以后的文章中,我们将讨论 Kubernetes 中适当的存储解决方案。
创建配置映射后,让我们将其挂载在我们的 `nginx` 容器中。我们分两个步骤进行。首先,我们需要指定一个<ruby><rt>volume</rt></ruby>来调出配置映射。然后我们需要将该卷挂载到 `nginx` 容器中。通过在 `mysite.yaml` 中的 `container` 后面的 `spec` 标签下添加以下内容来完成第一步: 创建配置映射后,让我们将其挂载在我们的 `nginx` 容器中。我们分两个步骤进行。首先,我们需要指定一个<ruby><rt>volume</rt></ruby>来调出配置映射。然后我们需要将该卷挂载到 `nginx` 容器中。通过在 `mysite.yaml` 中的 `container` 后面的 `spec` 标签下添加以下内容来完成第一步:
@ -162,7 +162,7 @@ kubectl create configmap mysite-html --from-file index.html
这告诉 Kubernetes 我们要定义一个名为 `html-volume` 的卷,并且该卷应包含名为 `html-volume`(我们在上一步中创建的)的配置映射的内容。 这告诉 Kubernetes 我们要定义一个名为 `html-volume` 的卷,并且该卷应包含名为 `html-volume`(我们在上一步中创建的)的配置映射的内容。
接下来,在 `nginx` 容器规范中的<ruby>端口<rt>port</rt></ruby>下方,添加以下内容: 接下来,在 `nginx` 容器规范中的<ruby>端口<rt>ports</rt></ruby>下方,添加以下内容:
``` ```
        volumeMounts:         volumeMounts:
@ -170,7 +170,7 @@ kubectl create configmap mysite-html --from-file index.html
          mountPath: /usr/share/nginx/html           mountPath: /usr/share/nginx/html
``` ```
这告诉 Kubernetes对于 `nginx` 容器,我们想在容器中的 `/usr/share/nginx/html` 路径挂载名为 `html-volume` 的卷。 为什么要使用 `/usr/share/nginx/html`?那个位置就是 `nginx` 镜像提供 HTML 服务的地方。通过在该路径上挂载卷,我们用该卷内容替换了默认内容。 这告诉 Kubernetes对于 `nginx` 容器,我们想在容器中的 `/usr/share/nginx/html` 路径挂载名为 `html-volume` 的卷。 为什么要使用 `/usr/share/nginx/html`?那个位置就是 `nginx` 镜像提供 HTML 服务的地方。通过在该路径上挂载卷,我们用该卷内容替换了默认内容。
作为参考,配置文件的 `deployment` 部分现在应如下所示: 作为参考,配置文件的 `deployment` 部分现在应如下所示:
@ -231,7 +231,7 @@ kubectl get pods
### 尝试一下! ### 尝试一下!
Pod 运行之后,就该尝试了。 开浏览器,然后在地址栏中输入 `kmaster` Pod 运行之后,就该尝试了。开浏览器,然后在地址栏中输入 `kmaster`
![][6] ![][6]
@ -239,9 +239,9 @@ Pod 运行之后,就该尝试了。 开浏览器,然后在地址栏中输入
### 另一个 ### 另一个
因此,现在我们有了一个运行单个网站的整个 k3s 集群。但是我们可以做更多!如果我们要在同一集群中提供另一个网站怎么办?让我们看看如何做到这一点。 因此,现在我们有了一个运行单个网站的整个 k3s 集群。但是我们可以有更多的网站!如果我们要在同一集群中提供另一个网站怎么办?让我们看看如何做到这一点。
同样,我们需要部署一些东西。碰巧我的狗有一条信息,她想让世界知道一段时间。因此,我专门为她制作了一些 HTML可从示例 zip 文件中获得)。同样,我们将使用配置映射的技巧来托管这些 HTML。这次我们将把整个目录`html` 目录)放到配置映射中,但是调用是相同的。 同样,我们需要部署一些东西。碰巧我的狗有一条她想让全世界都知道的信息,她想了好久了。因此,我专门为她制作了一些 HTML可从示例 zip 文件中获得)。同样,我们将使用配置映射的技巧来托管这些 HTML。这次我们将把整个目录`html` 目录)放到配置映射中,但是调用是相同的。
``` ```
kubectl create configmap mydog-html --from-file html kubectl create configmap mydog-html --from-file html
@ -324,11 +324,11 @@ kubectl apply -f mydog.yaml
![][7] ![][7]
呼!消息出来了!也许今晚我们都可以睡一觉。 呼!消息发出去了!也许今晚我们都可以睡一觉。
因此,现在,我们有了一个 k3s 集群该集群托管了两个网站Traefik 根据路径名决定将请求传递给哪个服务!但是,我们不仅限于基于路径的路由。我们也可以使用基于主机名的路由,我们将在以后的文章中进行探讨。 因此,现在,我们有了一个 k3s 集群该集群托管了两个网站Traefik 根据路径名决定将请求传递给哪个服务!但是,不仅限于基于路径的路由,我们也可以使用基于主机名的路由,我们将在以后的文章中进行探讨。
另外,我们刚刚托管的网站是标准的未加密 HTML 网站,如今的所有内容都使用 SSL/TLS 加密。在我们的下一篇文章中,我们将为 k3s 集群添加支持以托管 SSL/TLS HTTPS 站点! 另外,我们刚刚托管的网站是标准的未加密 HTML 网站,如今的所有内容都使用 SSL/TLS 加密。在我们的下一篇文章中,我们将为 k3s 集群添加支持以托管 SSL/TLS HTTPS 站点!
### 清理 ### 清理
@ -366,14 +366,14 @@ via: https://opensource.com/article/20/3/kubernetes-traefik
作者:[Lee Carpenter][a] 作者:[Lee Carpenter][a]
选题:[lujun9972][b] 选题:[lujun9972][b]
译者:[wxy](https://github.com/wxy) 译者:[wxy](https://github.com/wxy)
校对:[校对者ID](https://github.com/校对者ID) 校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]: https://opensource.com/users/carpie [a]: https://opensource.com/users/carpie
[b]: https://github.com/lujun9972 [b]: https://github.com/lujun9972
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet) [1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet)
[2]: https://opensource.com/article/20/3/kubernetes-raspberry-pi [2]: https://linux.cn/article-12049-1.html
[3]: https://gitlab.com/carpie/ingressing_with_k3s/-/archive/master/ingressing_with_k3s-master.zip [3]: https://gitlab.com/carpie/ingressing_with_k3s/-/archive/master/ingressing_with_k3s-master.zip
[4]: https://kubernetes.io/docs/ [4]: https://kubernetes.io/docs/
[5]: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#creating-a-deployment [5]: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#creating-a-deployment