资讯详情

资讯详情

k8s ingress-nginx

1、四层负载和七层负载区别客户端访问LVSLVS将请求转发给真实服务器真实服务器将请求返回给LVSLVS再转发给客户端。客户端发起连接请求到NginxNginx不是将请求转发至真实服务器而是先跟客户端连接索要客户端的真实请求Nginx知道客户端要什么了之后再发一个新的连接到真实服务器然后真实服务器把需要的数据返回给NginxNginx拿到数据再返回给客户端。总结四层负载特性一次完整的TCP连接由客户端与真实服务器建立LVS调度器只起到转发的作用七层负载特性两次完整的TCP连接由客户端与Nginx调度器建立Nginx调度器与真实服务器建立。由于是两次TCP连接因此客户端和Nginx的连接可以使用更安全的HTTPSNginx和真实服务器可以使用HTTP即可减少资源消耗。七层负载可以识别主机名和域名可以搞微服务四层负载只能识别IP和端口。如下图教学系统还可以分为教室管理微服务和学生管理微服务等等微服务Nginx配置文件中将教室系统的服务器IP放到一个upstream学生系统的服务器IP放到一个upstream用户在访问https://NginxIP:443/room/xxx.php的时候就会被调度到room这个upstream下的IP上用户在访问https://NginxIP:443/student/xxx.php的时候就会被调度到student这个upstream下的IP上。在k8s中实际使用七层负载均衡的时候Nginx配置文件的upstream中写的不是一堆IP而是给教室管理服务的Pod创建一个ServiceService底层用的是四层负载的LVS只将Service的VIP写到upstream中即可。学生管理服务的Pod同理。2、ingress-nginx流量分析2.1、资源清单2.2、示意图不同的域名访问被分配到不同的Pod服务器上。3、ingress-nginx架构图Store协程监听Api Server的ingress对象监听到之后有两条写入路径1、重要信息创建、删除ingress直接由Store协程分享到SyncQueue协程。2、不重要的信息修改、升级ingress经过二次缓冲的方式同步到SyncQueue协程。updateChannel同步环的作用是将信息定期的同步到二次缓存空间里二次缓存空间以先进先出的特性被SyncQueue协程读取信息。SyncQueue协程之后的操作是判断需不需要Nginx重载需要重载就执行重载不需要就通过异步的方案去更新通过Lua Server。Nginx在尽可能的保障少次数的重载因为每次重载都有可能让用户请求丢失。traefik是一种新的Web服务器它可以自动监听当前配置文件如果配置文件发生变化它会自动应用无需重载。因此ingress-nginx以后势必会被其他方案替代。4、和ingress-nginx同类型的产品5、安装ingress-nginx下载软件包https://pan.baidu.com/s/1cfZ5XVftUqNebzrjHrhrKA?pwduijyMaster节点[rootk8s-master01 10]# unzip 2、ingress-nginx.zip [rootk8s-master01 10]# tree 2、ingress-nginx 2、ingress-nginx ├── 安装文档.md ├── chart │ ├── ingress-nginx-4.8.3.tgz │ └── values.yaml └── image ├── ingress-nginx-kube-webhook-certgen-v20231011-8b53cabe0.tar └── registry.k8s.io-ingress-nginx-controller-v1.9.4.tarMaster、Node01、Node02节点# 将image目录下的镜像加载到本地仓库docker load -i ingress-nginx-kube-webhook-certgen-v20231011-8b53cabe0.tar docker load -i registry.k8s.io-ingress-nginx-controller-v1.9.4.tarMaster节点[rootk8s-master01 10]# cd 2、ingress-nginx/chart/ [rootk8s-master01 chart]# tar -zxvf ingress-nginx-4.8.3.tgz [rootk8s-master01 chart]# ls ingress-nginx ingress-nginx-4.8.3.tgz values.yaml [rootk8s-master01 chart]# cd ingress-nginx/ [rootk8s-master01 ingress-nginx]# vim values.yaml # 修改values.yaml文件修改 hostNetwork 的值为 true表示容器使用HOST模式Docker容器直接共享宿主机的网络这里代表的是Pod91 hostNetwork: truednsPolicy的值改为: ClusterFirstWithHostNet集群优先主机网络70 dnsPolicy: ClusterFirstWithHostNetkind类型更改为DaemonSetDaemonSet特性保证每个Node节点都有ingress可以保证一点高可用性。如果选Deployment有可能将多个ingress都放在一个Node节点上。187 kind: DaemonSet关闭所有镜像的digest我们打标签、转存镜像有可能导致这个值变化变化了它就会从官网重新拉取镜像注释掉这个机制可以少很多麻烦。31 #digest: sha256:5b161f051d017e55d358435f295f5e9a297e66158f136321d9b04520ec6c48a3 32 #digestChroot: sha256:5976b1067cfbca8a21d0ba53d71f83543a73316a61ea7f7e436d6cf84ddf9b26 647 #digest: sha256:a7943503b45d552785aa3b5e457f169a5661fb94d82b8a3373bcd9ebaf9aac80ingressClassResource.defaulttrue把当前的ingress类当成默认的ingress类当前ingress类名是nginxingressClassResource.name就是当前ingress类名。116 default: true关于 dnsPolicyClusterFirstWithHostNet当 Pod 的hostNetwork设置为 true 时使用该 DNS 策略。这意味着 Pod 的网络命名空间与主机共享Pod 使用主机的网络栈。在此配置下Pod 将首先尝试通过主机上的 DNS 解析 DNS 请求。如果主机上没有找到则会将请求发送到 kube-dns 服务由 kube-dns 服务进行处理。这种策略适用于需要与主机网络共享的特殊情况但它不会为 Pod 提供专用的 DNS 解析功能。ClusterFirst这是 Kubernetes 中默认的 DNS 策略。当 Pod 的hostNetwork设置为 false 或未设置时使用该策略。在此策略下Pod 首先尝试通过 kube-dns 服务解析 DNS 请求。如果 kube-dns 无法解析则会向上级 DNS 服务器继续发起请求。这种策略适用于大多数情况其中 Pod 需要使用 Kubernetes 集群的 DNS 服务解析其他 Pod 或服务的主机名。关于ingress类ingress不仅可以由nginx组建起来也可以由traefik、haproxy等组建起来ingress类名叫nginx就代表是nginx组建起来的受nginx管辖如果类名不是nginx就不受nginx管辖。[rootk8s-master01 ingress-nginx]# kubectl create ns ingress [rootk8s-master01 ingress-nginx]# helm install ingress-nginx -n ingress . -f values.yaml NAME: ingress-nginx LAST DEPLOYED: Wed Oct 21 18:10:02 2026 NAMESPACE: ingress STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: The ingress-nginx controller has been installed. It may take a few minutes for the LoadBalancer IP to be available. You can watch the status by running kubectl --namespace ingress get services -o wide -w ingress-nginx-controller An example Ingress that makes use of the controller: apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example namespace: foo spec: ingressClassName: nginx rules: - host: www.example.com http: paths: - pathType: Prefix backend: service: name: exampleService port: number: 80 path: / # This section is only required if TLS is to be enabled for the Ingress tls: - hosts: - www.example.com secretName: example-tls If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided: apiVersion: v1 kind: Secret metadata: name: example-tls namespace: foo data: tls.crt: base64 encoded cert tls.key: base64 encoded key type: kubernetes.io/tls
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →