traefik
在本文中,我们将部署几个简单的网站,并学习如何使用Traefik将来自外部世界的流量引入到我们的集群中。 之后,我们还将学习如何删除Kubernetes资源。 让我们开始吧!
所需材料
要继续阅读本文,您只需要我们在上一篇文章中构建的k3s Raspberry Pi集群 。 由于您的集群将从网络上提取图像,因此该集群将需要能够访问互联网。
在这里 。部署一个简单的网站
以前,我们使用kubectl进行了直接部署。 但是,这不是部署事物的典型方法。 通常,将使用YAML配置文件,这就是我们将在本文中使用的配置文件。 我们将从顶部开始,以自上而下的方式创建配置文件。
部署配置
首先是部署配置。 配置如下所示,并在下面进行说明。 我通常以Kubernetes文档中的样本为起点,然后对其进行修改以满足我的需求。 例如,从部署文档复制示例后,下面的配置已修改。
创建一个文件mysite.yaml ,其内容如下:
apiVersion
: apps
/ v1
kind
: Deployment
metadata
:
name
: mysite
- nginx
labels
:
app
: mysite
- nginx
spec
:
replicas
:
1
selector
:
matchLabels
:
app
: mysite
- nginx
template
:
metadata
:
labels
:
app
: mysite
- nginx
spec
:
containers
:
- name
: nginx
image
: nginx
ports
:
- containerPort
:
80
其中大部分是样板。 重要的部分,我们也将部署mysite-nginx命名为应用标签mysite-nginx 。 我们已经指定要一个副本 ,这意味着将只创建一个Pod。 我们还指定了一个容器 ,我们将其命名为nginx 。 我们将图像指定为nginx 。 这意味着,在部署时,k3s将从DockerHub下载nginx映像并从中创建一个pod。 最后,我们将containerPort指定为80 ,这仅意味着pod在容器内将监听端口80 。
我在上面强调了“在容器内部”,因为这是一个重要的区别。 由于我们已经配置了容器,因此只能在容器内部访问它,并且进一步将其限制为内部网络。 这是允许多个容器在同一容器端口上侦听所必需的。 换句话说,通过这种配置,其他某些Pod也可以在其容器端口80上侦听,并且不会与此容器冲突。 为了提供对该Pod的正式访问,我们需要一个服务配置。
服务配置
在Kubernetes中, 服务是一种抽象。 它提供了一种访问一个容器或一组容器的方法。 如果定义了多个Pod副本,则一个连接到服务,并且服务路由到单个Pod,或将负载均衡路由到多个Pod。
可以在同一配置文件中指定该服务,这就是我们将在此处进行的操作。 用---
分隔配置区域。 将以下内容添加到mysite.yaml :
--
-
apiVersion
: v1
kind
: Service
metadata
:
name
: mysite
- nginx
- service
spec
:
selector
:
app
: mysite
- nginx
ports
:
- protocol
: TCP
port
:
80
在此配置中,我们将服务命名为mysite-nginx-service 。 我们提供了一个应用程序 selector
:mysite-nginx 。 这是服务选择其路由到的应用程序容器的方式。 记住,我们为容器提供了一个应用程序标签mysite-nginx 。 这就是服务将用于查找我们的容器的内容。 最后,我们指定服务协议为TCP,并且该服务在端口80上侦听。
入口配置
入口配置指定如何将流量从群集外部传递到群集内部的服务。 请记住,k3预先配置了Traefik作为入口控制器。 因此,我们将编写特定于Traefik的入口配置。 将以下内容添加到mysite.yaml中 (不要忘了用---
分开):
--
-
apiVersion
: networking
. k8s
. io
/ v1beta1
kind
: Ingress
metadata
:
name
: mysite
- nginx
- ingress
annotations
:
kubernetes
. io
/ ingress
. class
:
"traefik"
spec
:
rules
:
- http
:
paths
:
- path
:
/
backend
:
serviceName
: mysite
- nginx
- service
servicePort
:
80
在此配置中,我们将入口记录命名为mysite-nginx-ingress 。 我们告诉Kubernetes,我们希望traefik成为带有kubernetes.io/ingress.class批注的入口控制器。
在规则部分,我们基本上是说,当HTTP流量进入时,并且路径匹配/
(或低于该值的任何内容),将其路由到serviceName mysite-nginx-service指定的后端 服务 ,并将其路由到servicePort 80 。 这会将传入的HTTP流量连接到我们之前定义的服务。
部署的东西
就配置而言,确实如此。 如果现在部署,我们将获得默认的nginx页面,但这不是我们想要的。 让我们创建一些简单但可定制的部署。 创建具有以下内容的文件index.html :
<html>
<head><title>K3S
! <
/ title>
<style>
html
{
font
- size
:
62
.
5
%
;
}
body
{
font
- family
: sans
- serif
;
background
- color
: midnightblue
;
color
: white
;
display
: flex
;
flex
- direction
: column
;
justify
- content
: center
;
height
: 100vh
;
}
div
{
text
- align
: center
;
font
- size
: 8rem
;
text
- shadow
: 3px 3px 4px dimgrey
;
}
<
/ style>
<
/ head>
<body>
<div>Hello from K3S
! <
/ div>
<
/ body>
<
/ html>
我们尚未介绍Kubernetes中的存储机制,因此我们将作弊一下,仅将该文件存储在Kubernetes配置图中。 建议不要使用这种方法来部署网站,但可以实现我们的目的。 运行以下命令:
kubectl create configmap mysite - html -- from - file index . html
该命令从本地文件index.html创建一个名为mysite-html的configmap
资源。 这实际上是在Kubernetes资源中存储一个文件(或一组文件),我们可以在配置中调出该文件。 它通常用于存储配置文件(因此而得名),因此我们在这里稍加滥用。 在以后的文章中,我们将讨论Kubernetes中的适当存储解决方案。
创建配置映射后,让我们将其安装在我们的nginx容器中。 我们分两个步骤进行。 首先,我们需要指定一个volume ,调出配置映射。 然后,我们需要将卷安装到nginx容器中。 在mysite.yaml中的 容器之后,在spec标签下添加以下内容,以完成第一步 :
volumes
:
- name
: html
- volume
configMap
:
name
: mysite
- html
这告诉Kubernetes,我们要定义一个卷 ,名为HTML的体积和容积应包含一个名为HTML的体积 configMap(我们在上一步中创建)中的内容。
接下来,在nginx容器规范中,在ports下方,添加以下内容:
volumeMounts
:
- name
: html
- volume
mountPath
:
/ usr
/ share
/ nginx
/ html
这告诉Kubernetes,为nginx的容器,我们要安装在路径名为HTML的体积大小 (容器) 的/ usr /共享/ nginx的/ HTML。 为什么使用/ usr / share / nginx / html ? 那就是nginx图像从那里提供HTML的地方。 通过在该路径上装入卷,我们用卷内容替换了默认内容。
作为参考,配置文件的部署部分现在应如下所示:
apiVersion
: apps
/ v1
kind
: Deployment
metadata
:
name
: mysite
- nginx
labels
:
app
: mysite
- nginx
spec
:
replicas
:
1
selector
:
matchLabels
:
app
: mysite
- nginx
template
:
metadata
:
labels
:
app
: mysite
- nginx
spec
:
containers
:
- name
: nginx
image
: nginx
ports
:
- containerPort
:
80
volumeMounts
:
- name
: html
- volume
mountPath
:
/ usr
/ share
/ nginx
/ html
volumes
:
- name
: html
- volume
configMap
:
name
: mysite
- html
部署它!
现在我们可以部署了! 我们可以这样做:
kubectl apply - f mysite . yaml
您应该看到类似于以下内容:
deployment
. apps
/ mysite
- nginx created
service
/ mysite
- nginx
- service created
ingress
. networking
. k8s
. io
/ mysite
- nginx
- ingress created
这意味着Kubernetes为我们指定的三个配置分别创建了资源。 使用以下方法检查豆荚的状态:
kubectl get pods
如果看到ContainerCreating的状态,请花一些时间,然后再次运行kubectl get pods 。 通常,第一次会花一些时间,因为k3s必须下载nginx图像才能创建Pod。 一段时间后,您应该获得状态Running 。
试试吧!
Pod运行之后,就该尝试了。 打开浏览器, 然后在地址栏中键入kmaster 。
恭喜你! 您已经在k3s集群上部署了一个网站!
另一个
因此,现在我们有了一个运行单个网站的整个k3s集群。 但是我们可以做更多! 如果我们要在同一群集中提供另一个网站怎么办? 让我们看看如何做到这一点。
同样,我们需要部署一些东西。 碰巧我的狗有一个信息,她想让世界知道一段时间。 因此,我专门为她制作了一些HTML(可从示例zip文件中获得)。 同样,我们将使用config map技巧来托管HTML。 这次,我们将把整个目录( html目录)戳入配置映射,但是调用是相同的。
kubectl create configmap mydog - html -- from - file html
现在我们需要为此站点创建一个配置文件。 它与mysite.yaml几乎完全相同 ,因此首先将mysite.yaml复制到mydog.yaml 。 现在将mydog.yaml编辑为:
apiVersion
: apps
/ v1
kind
: Deployment
metadata
:
name
: mydog
- nginx
labels
:
app
: mydog
- nginx
spec
:
replicas
:
1
selector
:
matchLabels
:
app
: mydog
- nginx
template
:
metadata
:
labels
:
app
: mydog
- nginx
spec
:
containers
:
- name
: nginx
image
: nginx
ports
:
- containerPort
:
80
volumeMounts
:
- name
: html
- volume
mountPath
:
/ usr
/ share
/ nginx
/ html
volumes
:
- name
: html
- volume
configMap
:
name
: mydog
- html
--
-
apiVersion
: v1
kind
: Service
metadata
:
name
: mydog
- nginx
- service
spec
:
selector
:
app
: mydog
- nginx
ports
:
- protocol
: TCP
port
:
80
--
-
apiVersion
: networking
. k8s
. io
/ v1beta1
kind
: Ingress
metadata
:
name
: mydog
- nginx
- ingress
annotations
:
kubernetes
. io
/ ingress
. class
:
"traefik"
traefik
. frontend
. rule
.
type
: PathPrefixStrip
spec
:
rules
:
- http
:
paths
:
- path
:
/ mydog
backend
:
serviceName
: mydog
- nginx
- service
servicePort
:
80
我们只需进行搜索并将mysite替换为mydog即可完成大多数编辑。 其他两个编辑在“入口”部分中。 我们将路径更改为/ mydog,并添加了注释traefik.frontend.rule.type:PathPrefixStrip 。
路径/ mydog的规范指示Traefik将请求以/ mydog开头的路径的所有传入请求路由到mydog-nginx-service 。 任何其他路径将继续路由到mysite-nginx-service。
新的注释PathPrefixStrip告诉Traefik在将请求发送到mydog-nginx-service之前先剥离前缀/ mydog 。 我们这样做是因为mydog-nginx应用程序不需要前缀。 这意味着我们可以简单地通过更改入口记录中的前缀来更改服务的安装位置。
现在我们可以像以前一样进行部署:
kubectl apply - f mydog . yaml
现在,我的狗的消息应该可以从http:// kmaster / mydog /获得 。
! 消息出来了! 也许今晚我们都可以睡一觉。
因此,现在,我们有了一个k3s集群,该集群托管了两个网站,Traefik根据路径名决定将请求传递给哪个服务! 但是,我们不仅限于基于路径的路由。 我们也可以使用基于主机名的路由,我们将在以后的文章中进行探讨。
此外,我们刚刚托管的网站是标准的未加密HTML网站。 这些天的所有内容都使用SSL / TLS加密。 在我们的下一篇文章中,我们将添加对k3s集群的支持,以托管SSL / TLS HTTPS站点!
打扫干净
在开始之前,由于本文主要涉及示例站点,所以我想向您展示如何删除内容,以防万一您不希望将示例悬挂在集群上。
对于大多数配置,只需使用与部署时使用的相同配置文件运行delete命令,即可撤消配置。 因此,让我们同时清理mysite和mydog 。
kubectl delete
- f mysite
.
yaml
kubectl delete
- f mydog
.
yaml
由于我们手动创建了配置映射,因此我们也需要手动删除它们。
kubectl delete configmap mysite
- html
kubectl delete configmap mydog
- html
现在,如果我们执行kubectl get pods ,我们应该看到我们的nginx pods不再存在了。
$ kubectl get pods
No resources found in
default namespace
.
一切都清理了。
在下面的评论中告诉我您对这个项目有什么想法。
traefik