Ingress是一种Kubernetes资源,用于将外部流量路由到Kubernetes集群内的服务。与NodePort相比,它提供了更高级别的路由功能和负载平衡,可以根据HTTP请求的路径、主机名、HTTP方法等来路由流量。
因此,可以说Ingress是为了弥补NodePort在流量路由方面的不足而生的。使用NodePort,只能将流量路由到一个具体的Service,并且必须使用Service的端口号来访问该服务。但是,使用Ingress,就可以使用自定义域名、路径和其他HTTP头来定义路由规则,以便将流量路由到不同的Service。
[root@master1 ~]# kubectl api-resources | grep ingress
ingressclasses networking.k8s.io/v1 false IngressClass
ingresses ing networking.k8s.io/v1 true Ingress
此外,Ingress还可以与负载均衡器配合使用,以提供高可用性和水平扩展。这些功能使得Ingress比NodePort更适合在生产环境中使用。
Ingress 是 Kubernetes 中的一个抽象资源,它提供了一种定义应用暴露入口的方法,可以帮助管理员在 Kubernetes 集群中管理多个服务的访问入口,方便用户访问。Ingress资源对象只是一个规范化的API对象,用于定义流量路由规则和 TLS 设置等信息。它本身不会直接处理或转发流量,而是需要配合一个 Ingress 控制器来实现。不同的 Ingress Controller 可能支持的功能和配置方式不同,需要根据实际情况进行选择和配置。
Ingress 控制器是一个独立的组件,它会监听 Kubernetes API 中的 Ingress 资源变化,并根据定义的路由规则配置负载均衡器、反向代理或其他网络代理,从而实现外部流量的转发。因此,可以将 Ingress 控制器视为 Ingress 资源的实际执行者。
总之,Kubernetes 的 Ingress 资源对象需要配合 Ingress 控制器才能实现外部流量的转发和路由。Ingress 控制器是 Ingress 资源的实际执行者,负责根据定义的路由规则配置网络代理。
主流的Ingress Controller
在 Kubernetes 中,有很多不同的 Ingress 控制器可以选择,例如 Nginx、Traefik、HAProxy、Envoy 等等。不同的控制器可能会提供不同的功能、性能和可靠性,可以根据实际需求来选择合适的控制器。Kubernetes生态系统中有许多不同的Ingress控制器可供选择,其中比较主流的有:
Nginx Ingress Controller:基于Nginx的Ingress控制器,提供了广泛的功能和配置选项。
Traefik Ingress Controller:Traefik是一个流行的反向代理和负载均衡器,Traefik Ingress Controller提供了灵活的配置选项和自动发现服务的功能。
Istio Ingress Gateway:Istio是一种服务网格,它提供了基于Envoy代理的Ingress Gateway来管理入站和出站流量。
Contour Ingress Controller:基于Envoy代理的Ingress控制器,具有高度可扩展性和灵活的路由规则。
Kong Ingress Controller:Kong是一个API网关,提供了可扩展的路由和服务管理功能。
Ambassador API Gateway:Ambassador是一个Kubernetes-native API Gateway,提供了自动化的服务发现和路由管理功能。
下面将使用来部署ingress-nginx
master(ingress-nginx边缘节点)
chart version:4.8.3 (k8s:1.28、1.27、1.26、1.25)
当前版本:k8s-v1.28.0
github地址:https://github.com/kubernetes/ingress-nginx
# 添加ingress-nginx的helm源
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
# 更新所有仓库
helm repo update
# 查看ingress-nginx版本
helm search repo ingress-nginx/ingress-nginx
# 拉取ingress-nginx
helm pull ingress-nginx/ingress-nginx --version 4.8.3 --untar
helm pull ingress-nginx/ingress-nginx --version 4.9.0 --untar
方式1:DaemonSet + HostNetwork + nodeSelector
# 创建ingress-nginx命名空间
kubectl create ns ingress-nginx
# 创建自定义values文件
cat > ~/ingress-nginx/values-prod.yaml << 'EOF'
controller:
name: controller
image:
registry: dyrnq
image: controller
#tag: "v1.9.4"
tag: "v1.9.5"
digest:
pullPolicy: IfNotPresent
dnsPolicy: ClusterFirstWithHostNet
hostNetwork: true
publishService: # hostNetwork 模式下设置为false,通过节点IP地址上报ingress status数据
enabled: false
kind: DaemonSet
tolerations: # kubeadm 安装的集群默认情况下 k8s-master 是有污点,需要容忍这个污点才可以部署
- key: "node-role.kubernetes.io/master1"
#operator: "Equal"
effect: "NoSchedule"
nodeSelector: # 固定到k8s-master节点(自己master啥名字就写啥)
kubernetes.io/hostname: "master1"
service: # HostNetwork 模式不需要创建service
enabled: false
admissionWebhooks: # 强烈建议开启 admission webhook
enabled: true
patch:
enabled: true
image:
registry: dyrnq
image: kube-webhook-certgen
#tag: v20231011-8b53cabe0
tag: v20231226-1a7112e06
digest:
pullPolicy: IfNotPresent
defaultBackend:
enabled: true
name: defaultbackend
image:
registry: dyrnq
image: defaultbackend-amd64
tag: "1.5"
digest:
pullPolicy: IfNotPresent
EOF
# 安装ingress-nginx
helm upgrade --install --namespace ingress-nginx ingress-nginx -f ~/ingress-nginx/values-prod.yaml .
方式2:MetalLB + Deployment + LoadBalancer(多副本、高可用)
# 创建ingress-nginx命名空间
kubectl create ns ingress-nginx
# 创建自定义values文件
cat > ~/ingress-nginx/values-prod.yaml << 'EOF'
controller:
name: controller
image:
registry: dyrnq
image: controller
tag: "v1.9.4"
digest:
pullPolicy: IfNotPresent
kind: Deployment
replicaCount: 3 # 设置副本数为 3
affinity: # 设置软策略
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- ingress-nginx
topologyKey: kubernetes.io/hostname
weight: 100
admissionWebhooks: # 强烈建议开启 admission webhook
enabled: true
patch:
enabled: true
image:
registry: dyrnq
image: kube-webhook-certgen
tag: v20231011-8b53cabe0
digest:
pullPolicy: IfNotPresent
defaultBackend:
enabled: true
name: defaultbackend
image:
registry: dyrnq
image: defaultbackend-amd64
tag: "1.5"
digest:
pullPolicy: IfNotPresent
EOF
# 安装ingress-nginx
helm upgrade --install --namespace ingress-nginx ingress-nginx -f ./values-prod.yaml .
评论区