云由临时的服务器组和向服务器分配容器的方法组成。容器是一种将应用程序打包到标准化单元中的方法,以便该应用程序能够在云中的任何服务器上平稳运行。常常出现的问题是须要将外部客户端的流量定向到云内的容器中,同时确保外部客户端不与云绑定。针对该问题,一个常见的解决方案是建立一个Ingress controller。node
Kubernetes Ingress有两个要求:nginx
Ingress controllergit
Ingressjson
这是为Kubernetes配置Ingress的端到端设置示例,以便集群的外部客户端能够Ingress controller访问集群内运行的Pod。一旦流量被引导到pod,流量将被引导至该Pod内的正确容器中。在本文中咱们将K3s部署到树莓派上构建集群。您能够参考咱们往期教程,了解如何在树莓派上搭建K3s集群:超强教程!在树莓派上构建多节点K8S集群!api
上图描述了如下组件的工做:浏览器
客户端但愿将流量发送到Pod。经过建立ClusterIP服务,将Pod部署到K3s集群并在集群内公开。客户端没法访问此服务,可是Ingress Controller能够访问该服务。Ingress controller执行Ingress定义的路由规则。Ingress controller经过NodePort服务向客户端公开。
Kubernetes并不部署Ingress controller,可是K3s会默认部署一个。上图展现了K3s部署Traefik做为Ingress controller的实现。所以,Traefik将会负责知足Ingress的请求。Ingress 请求由K3s提交,根据不一样的HTTP属性实例化传入流量的路由规则。服务器
上图中描述的Ingress在Traefik上建立了一个路由规则,这样传入的流量如何路径与“/”后面的内容相匹配,就会被重定向到80端口的nginx-svc服务。网络
如下指南将根据上一部分的例子来构建对应的Ingress配置。app
运行Traefik 仪表盘
K3s为Ingress controller建立了一个Traefik 部署,但默认状况下,仪表盘是禁用的。在启用仪表盘的状况下运行Traefik,能够实现应用Ingress建立的路由规则的概念。ide
必须编辑Traefik的ConfigMap才能启用仪表盘。
kubectl -n kube-system edit cm traefik
该命令容许你在终端中编辑ConfigMap:
# Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 data: traefik.toml: | # traefik.toml logLevel = "info" defaultEntryPoints = ["http","https"] [entryPoints] [entryPoints.http] address = ":80" compress = true [entryPoints.https] address = ":443" compress = true [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] CertFile = "/ssl/tls.crt" KeyFile = "/ssl/tls.key" [entryPoints.prometheus] address = ":9100" [ping] entryPoint = "http" [kubernetes] [kubernetes.ingressEndpoint] publishedService = "kube-system/traefik" [traefikLog] format = "json" [api] dashboard = true [metrics] [metrics.prometheus] entryPoint = "prometheus" kind: ConfigMap metadata: annotations: meta.helm.sh/release-name: traefik meta.helm.sh/release-namespace: kube-system creationTimestamp: "2020-10-02T13:59:32Z" labels: app: traefik app.kubernetes.io/managed-by: Helm chart: traefik-1.81.0 heritage: Helm release: traefik name: traefik namespace: kube-system resourceVersion: "3405531"
必须添加31行和32行才可以启用仪表盘。在添加这些行后,键入esc + : + wq,保存文件。
重启Traefik部署
kubectl -n kube-system scale deploy traefik --replicas 0 kubectl -n kube-system scale deploy traefik --replicas 1
端口转发Traefik仪表盘
kubectl -n kube-system port-forward deployment/traefik 8080
在你的浏览器中,访问http://localhost:8080,打开仪表盘。
配置Traefik路由规则
咱们的例子能够很容易地在不建立yaml文件的状况下完成;然而,yaml文件容许你保存你的工做,并轻松地启动和拆除整个配置设置。接下来的例子将使用yaml文件而不是命令行命令来构建Ingress的Kubernetes资源。
建立deployment
必须有一个最终将流量路由到的后备Pod。运行nginx便可。将如下文件另存为deployment.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: # manage pods with the label app: nginx app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
kubectl create -f deployment.yaml
建立服务
Ingress在Ingress controller,Traefik上配置路由规则。Traefik检查传入的HTTP流量,并将流量引导到已触发规则的服务,最后从服务流向Pod。如今咱们将建立这个Service,将如下文件保存为servcie.yaml:
apiVersion: v1 kind: Service metadata: name: nginx-svc spec: ports: - name: http port: 80 selector: # apply service to any pod with label app: nginx app: nginx
kubectl create -f service.yaml
建立Ingress
Ingress使用路由规则配置Traefik。这个示例将使用基于路径的路由规则。经过检查传入网址的上下文来评估基于路径的路由规则。此处,路径前缀为/。路径/捕捉全部传入的流量,因此相似/context1,/context2/anything的上下文将会触发在Traefik上的路由规则,由于全部这些上下文的前缀都是/。将如下文件保存为ingress.yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx-ingress annotations: kubernetes.io/ingress.class: traefik spec: rules: - http: paths: - path: / pathType: Prefix backend: serviceName: nginx-svc servicePort: 80
kubectl create -f ingress.yaml
路由规则能够在Traefik的仪表盘上查看:
使用NodePort暴露Ingress controller到外部流量
nginx app的Ingress规则已经被定义,可是Traefik还没有被暴露到外部流量。建立Nodeport类型的服务将会暴露Traefik到客户端。保存如下文件nodeport.yaml
apiVersion: v1 kind: Service metadata: name: traefik namespace: kube-system spec: type: NodePort ports: - name: traefik port: 80 nodePort: 30182 targetPort: 80 selector: app: traefik
kubectl create -f nodeport.yaml
做为外部客户端
集群的外部客户端如今能够向Ingress controller发出请求。Ingress controller会将流量重定向到nginx-svc服务,而nginx-svc又会将流量导向pod nignx。要做为外部客户端,咱们须要Cluster中的一台服务器的IP地址。
kubectl get nodes -o wide
将任何INTERNAL-IP和咱们的Traefik服务的NodePort 30182粘贴到浏览器中。将显示NGINX的默认页面。请注意,外部客户端必须与Cluster在同一个网络上才能工做。
Ingress在云原生环境中是一个极为重要的概念。Kubernetes提供Ingress,但将Ingress controller的实现留给开发人员。K3s默认提供Traefik做为ingress controller,若是没有ingress controller,建立Ingress将无济于事。Ingress controller自己就是一个pod,必须暴露给外部流量。在此示例中,咱们使用NodePort进行公开。在评估路由规则(该规则经过提交Ingress进行配置)后,命中的Ingress controller流量将重定向到配置的服务。
附录
本指南中的各个文件能够合并为一个文件。经过维护一个文件,很容易建立和销毁整个Ingress设置,将如下文件另存为nginx-ingres-full.yaml。
建立
kubectl create -f nginx-ingress-full.yaml
销毁
kubectl delete -f nginx-ingress-full.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: # manage pods with the label app: nginx app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-svc spec: ports: - name: http port: 80 selector: # apply service to any pod with label app: nginx app: nginx --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: nginx-ingress annotations: kubernetes.io/ingress.class: traefik spec: rules: - http: paths: - path: / pathType: Prefix backend: serviceName: nginx-svc servicePort: 80 --- apiVersion: v1 kind: Service metadata: name: traefik namespace: kube-system spec: type: NodePort ports: - name: traefik port: 80 nodePort: 30182 targetPort: 80 selector: app: traefik
原文连接:
https://levelup.gitconnected.com/a-guide-to-k3s-ingress-using-traefik-with-nodeport-6eb29add0b4b