编辑
2023-06-14
K8S
00
请注意,本文编写于 588 天前,最后修改于 588 天前,其中某些信息可能已经过时。

目录

1.简介
2. Ingress 和 Service 区别
2.1Ingress Controller
3.使用 Traefik Ingress CRD 方式
3.1 kubernetes-crd-definition-v1.yml
3.2 kubernetes-crd-rbac.yml
3.3 02-services.yml
3.4 03-deployments.yml
3.5解决访问不到的网络问题
3.6

1.简介

https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/

Ingress 是一种 Kubernetes 资源类型,它允许在 Kubernetes 集群中暴露 HTTP 和 HTTPS 服务。通过 Ingress,您可以将流量路由到不同的服务和端点,而无需使用不同的负载均衡器。Ingress 通常使用 Ingress Controller 实现,它是一个运行在 Kubernetes 集群中的负载均衡器,它根据Ingress 规则配置路由规则并将流量转发到相应的服务。

在 Kubernetes 中,一个 Ingress 资源定义了一组规则,这些规则用于指定外部流量如何到达集群中的服务。Ingress 资源定义包括域名、服务、路径和其他信息,通过这些信息,Ingress Controller 就能够将请求路由到正确的服务。同时,Ingress 还提供了 TLS 选项,可以使用 SSL/TLS 来加密传输数据。

总之,Ingress 是一种强大的 Kubernetes 资源类型,可以帮助您在 Kubernetes 集群中轻松地管理 HTTP 和 HTTPS 服务,并提供灵活的路由和负载均衡选项。

Ingress 简单示例:

image.png

2. Ingress 和 Service 区别

Ingress 和 Service都是 Kubernetes 中用于将流量路由到应用程序的机制,但它们在路由层面上有所不同:

  • Service 是 Kubernetes 中抽象的应用程序服务,它公开了一个单一的IP地址和端口,可以用于在 Kubernetes 集群内部的 Pod 之间进行流量路由。
  • Ingress 是一个 Kubernetes 资源对象,它提供了对集群外部流量路由的规则。Ingress 通过一个公共IP地址和端口将流量路由到一个或多个Service。

2.1Ingress Controller

Ingress Controller 是 Kubernetes 中的一种资源,它负责将外部请求转发到集群内部的 Service 中,并提供负载均衡、SSL 终止等功能。Ingress Controller 通常会运行在 Kubernetes 集群中,作为一组 Deployment 和 Service 的形式部署。

常见的 Ingress Controller 包括:

  1. Nginx Ingress Controller 是由 Kubernetes 社区维护的另一个 Ingress Controller,它也是使用 Nginx 作为反向代理实现的,可以支持 HTTP 和 HTTPS 等协议,支持负载均衡、路由、HTTPS证书管理等功能。
  2. Ingress Nginx Controller 是官方维护的一个 Ingress Controller,它是使用 Nginx 作为反向代理实现的,可以支持 HTTP 和 HTTPS 等协议,支持负载均衡、路由、HTTPS证书管理等功能。
  3. Traefik Ingress Controller:基于 Go 语言开发的 Ingress Controller,支持多种路由匹配方式和多种后端服务发现方式。
    • Traefik Ingress Controller: 标准实现 支持 官方 Ingress 路由规则 注意: 这种方式使用繁琐!
    • Traefik Route CRD(customer resuource definition)自定义资源 注意: 使用这种方式简单,自定义资源方式定义路由规则。
  4. Istio Ingress Controller:基于 Istio Service Mesh 实现的 Ingress Controller,提供了更丰富的负载均衡、流量控制和安全功能。
  5. Kong Ingress Controller:使用 Kong 作为反向代理实现 Ingress 功能,支持 API 管理和 Gateway 功能。

3.使用 Traefik Ingress CRD 方式

3.1 kubernetes-crd-definition-v1.yml

下载链接:http://songxuan.vip:5212/s/BaSv

image.png

3.2 kubernetes-crd-rbac.yml

image.png

3.3 02-services.yml

yml
apiVersion: v1 kind: Service metadata: name: traefik spec: ports: - protocol: TCP name: web port: 8000 - protocol: TCP name: admin port: 8080 - protocol: TCP name: websecure port: 4443 selector: app: traefik --- apiVersion: v1 kind: Service metadata: name: whoami spec: ports: - protocol: TCP name: web port: 80 selector: app: whoami

3.4 03-deployments.yml

yml
apiVersion: v1 kind: ServiceAccount metadata: namespace: default name: traefik-ingress-controller --- kind: Deployment apiVersion: apps/v1 metadata: namespace: default name: traefik labels: app: traefik spec: replicas: 1 selector: matchLabels: app: traefik template: metadata: labels: app: traefik spec: nodeName: songxuan003 #亲和性运行到指定的 节点 hostNetwork: true #设置成虚拟机的网络,也就是本机服务器ip serviceAccountName: traefik-ingress-controller containers: - name: traefik image: traefik:v2.10 args: - --api.insecure - --accesslog - --entrypoints.web.Address=:8000 - --entrypoints.websecure.Address=:4443 - --providers.kubernetescrd - --certificatesresolvers.myresolver.acme.tlschallenge - --certificatesresolvers.myresolver.acme.email=foo@you.com - --certificatesresolvers.myresolver.acme.storage=acme.json # Please note that this is the staging Let's Encrypt server. # Once you get things working, you should remove that whole line altogether. - --certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory ports: - name: web containerPort: 8000 - name: websecure containerPort: 4443 - name: admin containerPort: 8080 --- kind: Deployment apiVersion: apps/v1 metadata: namespace: default name: whoami labels: app: whoami spec: replicas: 2 selector: matchLabels: app: whoami template: metadata: labels: app: whoami spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: name #节点的反亲和性 operator: NotIn values: - songxuan003 #不会分配到name=songxuan003这个节点 containers: - name: whoami image: traefik/whoami ports: - name: web containerPort: 80

image.png

yml
apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: simpleingressroute namespace: default spec: entryPoints: - web routes: - match: Host(`your.example.com`) && PathPrefix(`/notls`) kind: Rule services: - name: whoami port: 80 --- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: ingressroutetls namespace: default spec: entryPoints: - websecure routes: - match: Host(`your.example.com`) && PathPrefix(`/tls`) kind: Rule services: - name: whoami port: 80 tls: certResolver: myresolver

3.5解决访问不到的网络问题

执行命令把mode为空的填上ipvs

sh
kubectl edit cm kube-proxy -n kube-system

image.png

sh
cat > /etc/sysconfig/modules/ipvs.modules << EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack modprobe -- br_netfilter EOF
sh
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
sh
kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'

3.6

sh
vi /etc/hosts

加入域名进主机解析 image.png

成功访问进行转发

image.png

本文作者:松轩(^U^)

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

Document