• 云原生Kubernetes:对外服务之 Ingress


    目录

    一、理论

    1.Ingress

    2.部署 nginx-ingress-controller(第一种方式)

    3.部署 nginx-ingress-controller(第二种方式)

    二、实验

    1.部署 nginx-ingress-controller(第一种方式)

    2.部署 nginx-ingress-controller(第二种方式)

    三、问题

    1.启动 nginx-ingress-controller报错

    2.容器探针失败

    3.生成pod报错

    4.获取ingress失败

    5.Ingress和Ingress Controller关系

    四、总结


    一、理论

    1.Ingress

    (1)  概念

    service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制;对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问。

    在Kubernetes中,Pod的IP地址和service的ClusterIP仅可以在集群网络内部使用,对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务,Kubernetes目前提供了以下几种方案:
     

    1. ●NodePort:将service暴露在节点网络上,NodePort背后就是Kube-Proxy,Kube-Proxy是沟通service网络、Pod网络和节点网络的桥梁。
    2. 测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理就是个灾难。因为每个端口只能是一种服务,默认端口范围只能是 30000-32767。
    3. ●LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置 Service 的场景。 受限于云平台,且通常在云平台部署LoadBalancer还需要额外的费用。
    4. 在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。
    5. ●externalIPs:service允许为其分配外部IP,如果外部IP路由到集群中一个或多个Node上,Service会被暴露给这些externalIPs。通过外部IP进入到集群的流量,将会被路由到Service的Endpoint上。
    6. ●Ingress:只需一个或者少量的公网IP和LB,即可同时将多个HTTP服务暴露到外网,七层反向代理。
    7. 可以简单理解为service的service,它其实就是一组基于域名和URL路径,把用户的请求转发到一个或多个service的规则。

    (2)组成

    1. ●ingress:
    2. ingress是一个API对象,通过yaml文件来配置,ingress对象的作用是定义请求如何转发到service的规则,可以理解为配置模板。
    3. ingress通过http或https暴露集群内部service,给service提供外部URL、负载均衡、SSL/TLS能力以及基于域名的反向代理。ingress要依靠 ingress-controller 来具体实现以上功能。
    4. ●ingress-controller:
    5. ingress-controller是具体实现反向代理及负载均衡的程序,对ingress定义的规则进行解析,根据配置的规则来实现请求转发。
    6. ingress-controller并不是k8s自带的组件,实际上ingress-controller只是一个统称,用户可以选择不同的ingress-controller实现,目前,由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个,其他还有很多第三方维护的ingress-controller,具体可以参考官方文档。但是不管哪一种ingress-controller,实现的机制都大同小异,只是在具体配置上有差异。

    一般来说,ingress-controller的形式都是一个pod,里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化,根据 ingress对象生成配置并应用新配置到反向代理,比如ingress-nginx就是动态生成nginx配置,动态更新upstream,并在需要的时候reload程序应用新配置。为了方便,后面的例子都以k8s官方维护的ingress-nginx为例。

    (3)控制器分类

    1. 1)Kubernetes Ingress Controller
    2. http://github.com/kubernetes/ingress-nginx
    3. 实现:Go/Lua(nginx 是用 C 写的)
    4. 许可证:Apache 2.0
    5. Kubernetes 的“官方”控制器(之所以称为官方,是想把它区别于 NGINX 公司的控制器)。这是社区开发的控制器,它基于 nginx Web 服务器,并补充了一组用于实现额外功能的 Lua 插件。
    6. 由于 NGINX 十分流行,再加上把它用作控制器时所需的修改较少,它对于 K8s 普通工程师来说,可能是最简单和最直接的选择。
    7. 2)NGINX Ingress Controller
    8. http://github.com/nginxinc/kubernetes-ingress
    9. 实现:Go
    10. 许可证:Apache 2.0
    11. 这是 NGINX 公司开发的官方产品,它也有一个基于 NGINX Plus 的商业版。NGINX 的控制器具有很高的稳定性、持续的向后兼容性,且没有任何第三方模块。
    12. 由于消除了 Lua 代码,和官方控制器相比,它保证了较高的速度,但也因此受到较大限制。相较之下,它的付费版本有更广泛的附加功能,如实时指标、JWT 验证、主动健康检查等。
    13. NGINX Ingress 重要的优势是对 TCP/UDP 流量的全面支持,最主要缺点是缺乏流量分配功能。
    14. 3)Kong Ingress
    15. http://github.com/Kong/kubernetes-ingress-controller
    16. 实现:Go
    17. 许可证:Apache 2.0
    18. Kong Ingress 由 Kong Inc 开发,有两个版本:商业版和免费版。它基于 NGINX 构建,并增加了扩展其功能的 Lua 模块。
    19. 最初,Kong Ingress 主要用作 API 网关,用于 API 请求的处理和路由。现在,它已经成为成熟的 Ingress 控制器,主要优点是拥有大量易于安装和配置的附加模块、插件(包括第三方插件)。它开启了控制器具备大量附加功能的先河,其内置函数也提供了许多可能性。Kong Ingress 配置是用 CRD 执行的。
    20. Kong Ingress 的一个重要特性是它只能在一个环境中运行(而不支持跨命名空间)。这是一个颇有争议的话题:有些人认为这是一个缺点,因为必须为每个环境生成实例;而另一些人认为这是一个特殊特性,因为它是更高级别的隔离,控制器故障的影响仅限于其所在的环境。
    21. 4)Traefik
    22. http://github.com/containous/traefik
    23. 实现:Go
    24. 许可证:MIT
    25. 最初,这个代理是为微服务请求及其动态环境的路由而创建的,因此具有许多有用的功能:连续更新配置(不重新启动)、支持多种负载均衡算法、Web UI、指标导出、对各种服务的支持协议、REST API、Canary 版本等。
    26. 支持开箱即用的 Let’s Encrypt 是它的另一个不错的功能,但它的主要缺点也很明显,就是为了控制器的高可用性,你必须安装并连接其 Key-value store。
    27. 在 2019 年 9 月发布的 Traefik v2.0 中,虽然它增加许多不错的新功能,如带有 SNI 的 TCP/SSL、金丝雀部署、流量镜像/shadowing 和经过改进的 Web UI,但一些功能(如 WAF 支持)还在策划讨论中。
    28. 与新版本同期推出的还有一个名叫 Maesh 的服务网格,它建在 Traefik 之上。
    29. 5)HAProxy Ingress
    30. http://github.com/jcmoraisjr/haproxy-ingress
    31. 实现:Go(HAProxy 是用 C 写的)
    32. 许可证:Apache 2.0
    33. HAProxy 是众所周知的代理服务器和负载均衡器。作为 Kubernetes 集群的一部分,它提供了“软”配置更新(无流量损失)、基于 DNS 的服务发现和通过 API 进行动态配置。 HAProxy 还支持完全自定义配置文件模板(通过替换 ConfigMap)以及在其中使用 Spring Boot 函数。
    34. 通常,工程师会把重点放在已消耗资源的高速、优化和效率上。而 HAProxy 的优点之一正是支持大量负载均衡算法。值得一提的是,在今年 6 月发布的 v2.0 中,HAProxy 增加了许多新功能,其即将推出的 v2.1 有望带来更多新功能(包括 OpenTracing 支持)。
    35. 6)Voyager
    36. http://github.com/appscode/voyager
    37. 实现:Go
    38. 许可证:Apache 2.0
    39. Voyager 基于 HAProxy,并作为一个通用的解决方案提供给大量供应商。它最具代表性的功能包括 L7 和 L4 上的流量负载均衡,其中,TCP L4 流量负载均衡称得上是该解决方案最关键的功能之一。
    40. 在今年早些时候,尽管 Voyager 在 v9.0.0 中推出了对 HTTP/2 和 gRPC 协议的全面支持,但总的来看,对证书管理(Let’s Encrypt 证书)的支持仍是 Voyager 集成的最突出的新功能。
    41. 7)Contour
    42. http://github.com/heptio/contour
    43. 实现:Go
    44. 许可证:Apache 2.0
    45. Contour 和 Envoy 由同一个作者开发,它基于 Envoy。它最特别的功能是可以通过 CRD(IngressRoute)管理 Ingress 资源,对于多团队需要同时使用一个集群的组织来说,这有助于保护相邻环境中的流量,使它们免受 Ingress 资源更改的影响。
    46. 它还提供了一组扩展的负载均衡算法(镜像、自动重复、限制请求率等),以及详细的流量和故障监控。对某些工程师而言,它不支持粘滞会话可能是一个严重缺陷。
    47. 8)Istio Ingress
    48. http://istio.io/docs/tasks/traffic-management/ingress
    49. 实现:Go
    50. 许可证:Apache 2.0
    51. Istio 是 IBM、Google 和 Lyft 的联合开发项目,它是一个全面的服务网格解决方案——不仅可以管理所有传入的外部流量(作为 Ingress 控制器),还可以控制集群内部的所有流量。
    52. Istio 将 Envoy 用作每种服务的辅助代理。从本质上讲,它是一个可以执行几乎所有操作的大型处理器,其中心思想是最大程度的控制、可扩展性、安全性和透明性。
    53. 通过 Istio Ingress,你可以对流量路由、服务之间的访问授权、均衡、监控、金丝雀发布等进行优化。
    54. 9)Ambassador
    55. http://github.com/datawire/ambassador
    56. 实现:Python
    57. 许可证:Apache 2.0
    58. Ambassador 也是一个基于 Envoy 的解决方案,它有免费版和商业版两个版本。
    59. Ambassador 被称为“Kubernetes 原生 API 微服务网关”,它与 K8s 原语紧密集成,拥有你所期望的从 Ingress controller 获得的功能包,它还可以与各种服务网格解决方案,如 Linkerd、Istio 等一起使用。
    60. 顺便提一下,Ambassador 博客日前发布了一份基准测试结果,比较了 Envoy、HAProxy 和 NGINX 的基础性能。
    61. 10)Gloo
    62. http://github.com/solo-io/gloo
    63. 实现:Go
    64. 许可证:Apache 2.0
    65. Gloo 是在 Envoy 之上构建的新软件(于 2018 年 3 月发布),由于它的作者坚持认为“网关应该从功能而不是服务中构建 API”,它也被称为“功能网关”。其“功能级路由”的意思是它可以为后端实现是微服务、无服务器功能和遗留应用的混合应用路由流量。
    66. 由于拥有可插拔的体系结构,Gloo 提供了工程师期望的大部分功能,但是其中一些功能仅在其商业版本(Gloo Enterprise)中可用。
    67. 11)Skipper
    68. http://github.com/zalando/skipper
    69. 实现:Go
    70. 许可证:Apache 2.0
    71. Skipper 是 HTTP 路由器和反向代理,因此不支持各种协议。从技术上讲,它使用 Endpoints API(而不是 Kubernetes Services)将流量路由到 Pod。它的优点在于其丰富的过滤器集所提供的高级 HTTP 路由功能,工程师可以借此创建、更新和删除所有 HTTP 数据。
    72. Skipper 的路由规则可以在不停机的情况下更新。正如它的作者所述,Skipper 可以很好地与其他解决方案一起使用,比如 AWS ELB。

    (4)工作原理

    1. 1)ingress-controller通过和 kubernetes APIServer 交互,动态的去感知集群中ingress规则变化,
    2. 2)然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,
    3. 3)再写到nginx-ingress-controller的pod里,这个ingress-controller的pod里运行着一个Nginx服务,控制器会把生成的 nginx配置写入 /etc/nginx.conf文件中,
    4. 4)然后reload一下使配置生效。以此达到域名区分配置和动态更新的作用。

    (5)暴露服务的方式

    1. 方式一:Deployment+LoadBalancer 模式的 Service
    2. 如果要把ingress部署在公有云,那用这种方式比较合适。用Deployment部署ingress-controller,创建一个 type为 LoadBalancer 的 service 关联这组 pod。大部分公有云,都会为 LoadBalancer 的 service 自动创建一个负载均衡器,通常还绑定了公网地址。 只要把域名解析指向该地址,就实现了集群服务的对外暴露
    3. 方式二:DaemonSet+HostNetwork+nodeSelector
    4. 用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。这时,ingress-controller所在的node机器就很类似传统架构的边缘节点,比如机房入口的nginx服务器。该方式整个请求链路最简单,性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod。 比较适合大并发的生产环境使用。
    5. 方式三:Deployment+NodePort模式的Service
    6. 同样用deployment模式部署ingress-controller,并创建对应的service,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
    7. NodePort方式暴露ingress虽然简单方便,但是NodePort多了一层NAT,在请求量级很大时可能对性能会有一定影响。

    (6)ingressClassName

    ingressClassName 指定 IngressClass,用来指定选择的 Ingress Controller

    host 主机名可以是精确匹配,或者使用通配符来匹配,但通配符仅覆盖一个 DNS 标签(例如 *.foo.com 不匹配 baz.bar.foo.com)。pathType 支持的路径类型有三种:

    1. ●Exact:精确匹配 URL 路径,且区分大小写。
    2. ●Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写。如果路径的最后一个元素是请求路径中最后一个元素的子字符串,则不会匹配 (例如:/foo/bar 匹配 /foo/bar/baz, 但不匹配 /foo/barbaz)。
    3. ●ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理。

    (7)排错思路

    2.部署 nginx-ingress-controller(第一种方式)

    (1)部署ingress-controller pod及相关资源

    1. mkdir /opt/ingress
    2. cd /opt/ingress
    3. 官方下载地址:
    4. wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.0/deploy/static/mandatory.yaml
    5. 上面可能无法下载,可用国内的 gitee
    6. wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.25.0/deploy/static/mandatory.yaml
    7. wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
    8. #mandatory.yaml文件中包含了很多资源的创建,包括namespace、ConfigMap、role,ServiceAccount等等所有部署ingress-controller需要的资源。

    (2)修改 ClusterRole 资源配置

    1. vim mandatory.yaml
    2. ......
    3. apiVersion: rbac.authorization.k8s.io/v1beta1
    4. #RBAC相关资源从1.17版本开始改用rbac.authorization.k8s.io/v1,rbac.authorization.k8s.io/v1beta1在1.22版本即将弃用
    5. kind: ClusterRole
    6. metadata:
    7. name: nginx-ingress-clusterrole
    8. labels:
    9. app.kubernetes.io/name: ingress-nginx
    10. app.kubernetes.io/part-of: ingress-nginx
    11. rules:
    12. - apiGroups:
    13. - ""
    14. resources:
    15. - configmaps
    16. - endpoints
    17. - nodes
    18. - pods
    19. - secrets
    20. verbs:
    21. - list
    22. - watch
    23. - apiGroups:
    24. - ""
    25. resources:
    26. - nodes
    27. verbs:
    28. - get
    29. - apiGroups:
    30. - ""
    31. resources:
    32. - services
    33. verbs:
    34. - get
    35. - list
    36. - watch
    37. - apiGroups:
    38. - "extensions"
    39. - "networking.k8s.io"# (0.25版本)增加 networking.k8s.io Ingress 资源的 api
    40. resources:
    41. - ingresses
    42. verbs:
    43. - get
    44. - list
    45. - watch
    46. - apiGroups:
    47. - ""
    48. resources:
    49. - events
    50. verbs:
    51. - create
    52. - patch
    53. - apiGroups:
    54. - "extensions"
    55. - "networking.k8s.io"# (0.25版本)增加 networking.k8s.io/v1 Ingress 资源的 api
    56. resources:
    57. - ingresses/status
    58. verbs:
    59. - update

    (3)指定 nginx-ingress-controller 运行在 node02 节点

    采用方式:DaemonSet+HostNetwork+nodeSelector

    1. kubectl label node node02 ingress=true
    2. kubectl get nodes --show-labels

    (4)修改 Deployment 为 DaemonSet ,指定节点运行,并开启 hostNetwork 网络

    1. vim mandatory.yaml
    2. ...
    3. apiVersion: apps/v1
    4. # 修改 kind# kind: Deployment
    5. kind: DaemonSet
    6. metadata:
    7. name: nginx-ingress-controller
    8. namespace: ingress-nginx
    9. labels:
    10. app.kubernetes.io/name: ingress-nginx
    11. app.kubernetes.io/part-of: ingress-nginx
    12. spec:
    13. # 删除Replicas# replicas: 1
    14. selector:
    15. matchLabels:
    16. app.kubernetes.io/name: ingress-nginx
    17. app.kubernetes.io/part-of: ingress-nginx
    18. template:
    19. metadata:
    20. labels:
    21. app.kubernetes.io/name: ingress-nginx
    22. app.kubernetes.io/part-of: ingress-nginx
    23. annotations:
    24. prometheus.io/port: "10254"
    25. prometheus.io/scrape: "true"
    26. spec:
    27. # 使用主机网络
    28. hostNetwork: true# 选择节点运行
    29. nodeSelector:
    30. ingress: "true"
    31. serviceAccountName: nginx-ingress-serviceaccount
    32. ......

    (5)在所有 node 节点上传 nginx-ingress-controller 镜像压缩包 ingree.contro.tar.gz 到/opt/ingress 目录,并解压和加载镜像

    1. cd /opt/ingress
    2. tar zxvf ingree.contro.tar.gz
    3. docker load -i ingree.contro.tar

    (6)启动 nginx-ingress-controller

    1. kubectl apply -f mandatory.yaml
    2. #nginx-ingress-controller 已经运行 node02 节点
    3. kubectl get pod -n ingress-nginx -o wide
    4. kubectl get cm,daemonset -n ingress-nginx -o wide

    到 node02 节点查看

    netstat -lntp | grep nginx

    由于配置了 hostnetwork,nginx 已经在 node 主机本地监听 80/443/8181 端口。其中 8181 是 nginx-controller 默认配置的一个 default backend(Ingress 资源没有匹配的 rule 对象时,流量就会被导向这个 default backend)。这样,只要访问 node 主机有公网 IP,就可以直接映射域名来对外网暴露服务了。如果要 nginx 高可用的话,可以在多个 node上部署,并在前面再搭建一套 LVS+keepalived 做负载均衡。
     

    (7)创建 ingress 规则

    创建一个 deploy 和 svc

    1. vim service-nginx.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-app
    6. spec:
    7. replicas: 2
    8. selector:
    9. matchLabels:
    10. app: nginx
    11. template:
    12. metadata:
    13. labels:
    14. app: nginx
    15. spec:
    16. containers:
    17. - name: nginx
    18. image: nginx
    19. imagePullPolicy: IfNotPresent
    20. ports:
    21. - containerPort: 80
    22. ---
    23. apiVersion: v1
    24. kind: Service
    25. metadata:
    26. name: nginx-app-svc
    27. spec:
    28. type: ClusterIP
    29. ports:
    30. - protocol: TCP
    31. port: 80
    32. targetPort: 80
    33. selector:
    34. app: nginx

    创建 ingress

    用的是方法二

    1. #方法一:(extensions/v1beta1 Ingress 在1.22版本即将弃用)
    2. vim ingress-app.yaml
    3. apiVersion: extensions/v1beta1
    4. kind: Ingress
    5. metadata:
    6. name: nginx-app-ingress
    7. spec:
    8. rules:
    9. - host: www.david.com
    10. http:
    11. paths:
    12. - path: /
    13. backend:
    14. serviceName: nginx-app-svc
    15. servicePort: 80
    16. #方法二:(1.14-1.18版本)
    17. ​vim ingress-app.yaml
    18. apiVersion: networking.k8s.io/v1beta1
    19. kind: Ingress
    20. metadata:
    21. name: nginx-app-ingress
    22. # namespace: ingress-nginx
    23. spec:
    24. rules:
    25. - host: www.david.com
    26. http:
    27. paths:
    28. - path: /
    29. backend:
    30. serviceName: nginx-app-svc
    31. servicePort: 80
    32. #方法三:(1.19版本以上)
    33. vim ingress-app.yaml
    34. apiVersion: networking.k8s.io/v1
    35. kind: Ingress
    36. metadata:
    37. name: nginx-app-ingress
    38. spec:
    39. rules:
    40. - host: www.david.com
    41. http:
    42. paths:
    43. - path: /
    44. pathType: Prefix
    45. backend:
    46. service:
    47. name: nginx-app-svc
    48. port:
    49. number: 80

    生成pod并查看信息

    1. kubectl apply -f service-nginx.yaml
    2. kubectl apply -f ingress-app.yaml
    3. kubectl get pods
    4. kubectl get ingress

    (8)测试访问

    地 host 添加域名解析

    1. vim /etc/hosts
    2. 192.168.204.171 master
    3. 192.168.204.173 node01
    4. 192.168.204.175 node02
    5. 192.168.204.176 hub.david.com
    6. 192.168.204.177 stor01
    7. 192.168.204.175 www.david.com #新增

    回到master测试网页

    curl www.david.com

    (9) 查看 nginx-ingress-controller

    1. kubectl get pod -n ingress-nginx -o wide
    2. kubectl exec -it nginx-ingress-controller-wrs7f -n ingress-nginx /bin/bash
    1. kubectl get pod -n ingress-nginx -o wide
    2. kubectl exec -it nginx-ingress-controller-p7tdq -n ingress-nginx /bin/bash

    可以看到从 start server www.david.com 到 end server www.david.com 之间包含了此域名用于反向代理的配置

    1. more /etc/nginx/nginx.conf
    2. ……
    3. ## start server www.david.com
    4. server {
    5. server_name www.david.com ;
    6. listen 80 ;
    7. listen 443 ssl http2 ;
    8. set $proxy_upstream_name "-";
    9. ssl_certificate_by_lua_block {
    10. certificate.call()
    11. }
    12. location / {
    13. set $namespace "ingress-nginx";
    14. set $ingress_name "nginx-app-ingress";
    15. set $service_name "nginx-app-svc";
    16. set $service_port "80";
    17. set $location_path "/";
    18. rewrite_by_lua_block {
    19. lua_ingress.rewrite({
    20. force_ssl_redirect = false,
    21. ssl_redirect = true,
    22. force_no_ssl_redirect = false,
    23. use_port_in_redirects = false,
    24. })
    25. balancer.rewrite()
    26. plugins.run()
    27. }
    28. # be careful with `access_by_lua_block` and `satisfy any` directives as satisfy any
    29. # will always succeed when there's `access_by_lua_block` that does not have any lua code doing `ngx.exit(ngx.DECLINED)`
    30. # other authentication method such as basic auth or external auth useless - all requests will be allowed.
    31. #access_by_lua_block {
    32. #}
    33. header_filter_by_lua_block {
    34. lua_ingress.header()
    35. plugins.run()
    36. }
    37. body_filter_by_lua_block {
    38. }
    39. log_by_lua_block {
    40. balancer.log()
    41. monitor.call()
    42. plugins.run()
    43. }
    44. port_in_redirect off;
    45. set $balancer_ewma_score -1;
    46. set $proxy_upstream_name "ingress-nginx-nginx-app-svc-80";
    47. set $proxy_host $proxy_upstream_name;
    48. set $pass_access_scheme $scheme;
    49. set $pass_server_port $server_port;
    50. set $best_http_host $http_host;
    51. set $pass_port $pass_server_port;
    52. set $proxy_alternative_upstream_name "";
    53. client_max_body_size 1m;
    54. proxy_set_header Host $best_http_host;
    55. # Pass the extracted client certificate to the backend
    56. # Allow websocket connections
    57. proxy_set_header Upgrade $http_upgrade;
    58. proxy_set_header Connection $connection_upgrade;
    59. proxy_set_header X-Request-ID $req_id;
    60. proxy_set_header X-Real-IP $remote_addr;
    61. proxy_set_header X-Forwarded-For $remote_addr;
    62. proxy_set_header X-Forwarded-Host $best_http_host;
    63. proxy_set_header X-Forwarded-Port $pass_port;
    64. proxy_set_header X-Forwarded-Proto $pass_access_scheme;
    65. proxy_set_header X-Scheme $pass_access_scheme;
    66. # Pass the original X-Forwarded-For
    67. proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;
    68. # mitigate HTTPoxy Vulnerability
    69. # https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
    70. proxy_set_header Proxy "";
    71. # Custom headers to proxied server
    72. proxy_connect_timeout 5s;
    73. proxy_send_timeout 60s;
    74. proxy_read_timeout 60s;
    75. proxy_buffering off;
    76. proxy_buffer_size 4k;
    77. proxy_buffers 4 4k;
    78. proxy_max_temp_file_size 1024m;
    79. proxy_request_buffering on;
    80. proxy_http_version 1.1;
    81. proxy_cookie_domain off;
    82. proxy_cookie_path off;
    83. # In case of errors try the next upstream server before returning an error
    84. proxy_next_upstream error timeout;
    85. proxy_next_upstream_timeout 0;
    86. proxy_next_upstream_tries 3;
    87. proxy_pass http://upstream_balancer;
    88. proxy_redirect off;
    89. }
    90. }
    91. ## end server www.david.com
    92. ……

    3.部署 nginx-ingress-controller(第二种方式)

    采用方式:Deployment+NodePort模式的Service

    (1)下载 nginx-ingress-controller 和 ingress-nginx 暴露端口配置文件

    1. mkdir /opt/ingress-nodeport
    2. cd /opt/ingress-nodeport
    3. 官方下载地址:
    4. wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
    5. wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
    6. 国内 gitee 资源地址:
    7. wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
    8. wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

    (2)在所有 node 节点上传镜像包 ingress-controller-0.30.0.tar 到 /opt/ingress-nodeport 目录,并加载镜像

    1. mkdir -p /opt/ingress-nodeport
    2. cd /opt/ingress-nodeport
    3. tar zxvf ingree.contro-0.30.0.tar.gz
    4. docker load -i ingree.contro-0.30.0.tar

    (3)启动 nginx-ingress-controller

    1. kubectl apply -f mandatory.yaml
    2. kubectl apply -f service-nodeport.yaml

    (4)Ingress HTTP 代理访问

    创建 deployment、Service、Ingress Yaml 资源

    k8s v1.14-1.18版本

    1. vim ingress-nginx.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-myapp
    6. spec:
    7. replicas: 2
    8. selector:
    9. matchLabels:
    10. name: nginx
    11. template:
    12. metadata:
    13. labels:
    14. name: nginx
    15. spec:
    16. containers:
    17. - name: nginx
    18. image: nginx
    19. imagePullPolicy: IfNotPresent
    20. ports:
    21. - containerPort: 80
    22. ---
    23. apiVersion: v1
    24. kind: Service
    25. metadata:
    26. name: nginx-svc
    27. spec:
    28. ports:
    29. - port: 80
    30. targetPort: 80
    31. protocol: TCP
    32. selector:
    33. name: nginx
    34. ---
    35. apiVersion: networking.k8s.io/v1beta1
    36. kind: Ingress
    37. metadata:
    38. name: nginx-test
    39. spec:
    40. rules:
    41. - host: www.long.com
    42. http:
    43. paths:
    44. - path: /
    45. backend:
    46. serviceName: nginx-svc
    47. servicePort: 80

    k8s v1.19版本以上:

    1. vim ingress-nginx.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-myapp
    6. spec:
    7. replicas: 2
    8. selector:
    9. matchLabels:
    10. name: nginx
    11. template:
    12. metadata:
    13. labels:
    14. name: nginx
    15. spec:
    16. containers:
    17. - name: nginx
    18. image: nginx
    19. imagePullPolicy: IfNotPresent
    20. ports:
    21. - containerPort: 80
    22. ---
    23. apiVersion: v1
    24. kind: Service
    25. metadata:
    26. name: nginx-svc
    27. spec:
    28. ports:
    29. - port: 80
    30. targetPort: 80
    31. protocol: TCP
    32. selector:
    33. name: nginx
    34. ---
    35. apiVersion: networking.k8s.io/v1
    36. kind: Ingress
    37. metadata:
    38. name: nginx-test
    39. spec:
    40. rules:
    41. - host: www.long.com
    42. http:
    43. paths:
    44. - path: /
    45. pathType: Prefix
    46. backend:
    47. service:
    48. name: nginx-svc
    49. port:
    50. number: 80
    kubectl get pods,svc -o wide
    1. #进入容器1
    2. [root@master ingress-nodeport]# kubectl exec -it pod/nginx-myapp-65d7b99f6b-jpv5p bash
    3. root@nginx-myapp-65d7b99f6b-jpv5p:/# cd /usr/share/nginx/html/
    4. root@nginx-myapp-65d7b99f6b-jpv5p:/usr/share/nginx/html# echo 'this is mao' >> index.html
    5. root@nginx-myapp-65d7b99f6b-jpv5p:/usr/share/nginx/html# cat index.html
    6. <head>
    7. Welcome to nginx!
    8. Welcome to nginx!

    9. If you see this page, the nginx web server is successfully installed and

    10. working. Further configuration is required.

    11. For online documentation and support please refer to

    12. Commercial support is available at
    13. Thank you for using nginx.

    14. this is mao
    15. root@nginx-myapp-65d7b99f6b-jpv5p:/usr/share/nginx/html# exit
    16. exit
    1. #进入容器2
    2. [root@master ingress-nodeport]# kubectl exec -it pod/nginx-myapp-65d7b99f6b-pwv2h bash
    3. root@nginx-myapp-65d7b99f6b-pwv2h:/# cd /usr/share/nginx/html/
    4. root@nginx-myapp-65d7b99f6b-pwv2h:/usr/share/nginx/html# echo 'this is long' >> index.html
    5. root@nginx-myapp-65d7b99f6b-pwv2h:/usr/share/nginx/html# cat index.html
    6. <head>
    7. Welcome to nginx!
    8. Welcome to nginx!

    9. If you see this page, the nginx web server is successfully installed and

    10. working. Further configuration is required.

    11. For online documentation and support please refer to

    12. Commercial support is available at
    13. Thank you for using nginx.

    14. this is long
    15. root@nginx-myapp-65d7b99f6b-pwv2h:/usr/share/nginx/html# exit
    16. exit
    17. [root@master ingress-nodeport]#

    (5)测试访问

    1. curl 10.1.73.104
    2. kubectl get svc -n ingress-nginx
    1. vim /etc/hosts
    2. 192.168.204.171 master
    3. 192.168.204.173 node01
    4. 192.168.204.175 node02
    5. 192.168.204.176 hub.david.com
    6. 192.168.204.177 stor01
    7. #添加域名解析
    8. 192.168.204.173 www.long.com
    9. 192.168.204.175 www.long.com
    10. #外部访问
    11. curl http://www.long.com:30778

    (6)  Ingress HTTP 代理访问虚拟主机

    1. mkdir /opt/ingress-nodeport/vhost
    2. cd /opt/ingress-nodeport/vhost
    3. #创建虚拟主机1资源
    4. vim deployment1.yaml
    5. apiVersion: apps/v1
    6. kind: Deployment
    7. metadata:
    8. name: deployment1
    9. spec:
    10. replicas: 2
    11. selector:
    12. matchLabels:
    13. name: nginx1
    14. template:
    15. metadata:
    16. labels:
    17. name: nginx1
    18. spec:
    19. containers:
    20. - name: nginx1
    21. image: soscscs/myapp:v1
    22. imagePullPolicy: IfNotPresent
    23. ports:
    24. - containerPort: 80
    25. ---
    26. apiVersion: v1
    27. kind: Service
    28. metadata:
    29. name: svc-1
    30. spec:
    31. ports:
    32. - port: 80
    33. targetPort: 80
    34. protocol: TCP
    35. selector:
    36. name: nginx1
    37. kubectl apply -f deployment1.yaml
    1. #创建虚拟主机2资源
    2. vim deployment2.yaml
    3. apiVersion: apps/v1
    4. kind: Deployment
    5. metadata:
    6. name: deployment2
    7. spec:
    8. replicas: 2
    9. selector:
    10. matchLabels:
    11. name: nginx2
    12. template:
    13. metadata:
    14. labels:
    15. name: nginx2
    16. spec:
    17. containers:
    18. - name: nginx2
    19. image: soscscs/myapp:v2
    20. imagePullPolicy: IfNotPresent
    21. ports:
    22. - containerPort: 80
    23. ---
    24. apiVersion: v1
    25. kind: Service
    26. metadata:
    27. name: svc-2
    28. spec:
    29. ports:
    30. - port: 80
    31. targetPort: 80
    32. protocol: TCP
    33. selector:
    34. name: nginx2
    35. kubectl apply -f deployment2.yaml

    k8s v1.14-1.18版本:

    1. #创建ingress资源
    2. vim ingress-nginx.yaml
    3. apiVersion: networking.k8s.io/v1beta1
    4. kind: Ingress
    5. metadata:
    6. name: ingress1
    7. spec:
    8. rules:
    9. - host: www1.mao.com
    10. http:
    11. paths:
    12. - path: /
    13. backend:
    14. serviceName: svc-1
    15. servicePort: 80
    16. ---
    17. apiVersion: networking.k8s.io/v1beta1
    18. kind: Ingress
    19. metadata:
    20. name: ingress2
    21. spec:
    22. rules:
    23. - host: www2.mao.com
    24. http:
    25. paths:
    26. - path: /
    27. backend:
    28. serviceName: svc-2
    29. servicePort: 80
    30. kubectl apply -f ingress-nginx.yaml

    k8s v1.19版本以上:

    1. #创建ingress资源
    2. vim ingress-nginx.yaml
    3. apiVersion: networking.k8s.io/v1
    4. kind: Ingress
    5. metadata:
    6. name: ingress1
    7. spec:
    8. rules:
    9. - host: www1.mao.com
    10. http:
    11. paths:
    12. - path: /
    13. pathType: Prefix
    14. backend:
    15. service:
    16. name: svc-1
    17. port:
    18. number: 80
    19. ---
    20. apiVersion: networking.k8s.io/v1
    21. kind: Ingress
    22. metadata:
    23. name: ingress2
    24. spec:
    25. rules:
    26. - host: www2.mao.com
    27. http:
    28. paths:
    29. - path: /
    30. pathType: Prefix
    31. backend:
    32. service:
    33. name: svc-2
    34. port:
    35. number: 80
    36. kubectl apply -f ingress-nginx.yaml

    (7)  测试访问

    1. kubectl get svc -n ingress-nginx
    2. #做主机映射
    3. vim /etc/hosts
    4. curl www1.david.com:31751
    5. curl www2.david.com:31751

    (8)  Ingress HTTPS 代理访问

    1. mkdir /opt/ingress-nodeport/https
    2. cd /opt/ingress-nodeport/https

     创建ssl证书

    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"

    创建 secret 资源进行存储

    1. kubectl create secret tls tls-secret --key tls.key --cert tls.crt
    2. kubectl get secret
    3. kubectl describe secret tls-secret

    创建 deployment、Service、Ingress Yaml 资源

    k8s v1.14-1.18版本

    1. vim ingress-https.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-app
    6. spec:
    7. replicas: 2
    8. selector:
    9. matchLabels:
    10. name: nginx
    11. template:
    12. metadata:
    13. labels:
    14. name: nginx
    15. spec:
    16. containers:
    17. - name: nginx
    18. image: nginx
    19. imagePullPolicy: IfNotPresent
    20. ports:
    21. - containerPort: 80
    22. ---
    23. apiVersion: v1
    24. kind: Service
    25. metadata:
    26. name: nginx-svc
    27. spec:
    28. ports:
    29. - port: 80
    30. targetPort: 80
    31. protocol: TCP
    32. selector:
    33. name: nginx
    34. ---
    35. apiVersion: networking.k8s.io/v1beta1
    36. kind: Ingress
    37. metadata:
    38. name: nginx-https
    39. spec:
    40. tls:
    41. - hosts:
    42. - www3.long.com
    43. secretName: tls-secret
    44. rules:
    45. - host: www3.long.com
    46. http:
    47. paths:
    48. - path: /
    49. backend:
    50. serviceName: nginx-svc
    51. servicePort:80
    52. kubectl apply -f ingress-https.yaml

    k8s v1.19版本以上:

    1. vim ingress-https.yaml
    2. apiVersion: apps/v1
    3. kind: Deployment
    4. metadata:
    5. name: nginx-app
    6. spec:
    7. replicas: 2
    8. selector:
    9. matchLabels:
    10. name: nginx
    11. template:
    12. metadata:
    13. labels:
    14. name: nginx
    15. spec:
    16. containers:
    17. - name: nginx
    18. image: nginx
    19. imagePullPolicy: IfNotPresent
    20. ports:
    21. - containerPort: 80
    22. ---
    23. apiVersion: v1
    24. kind: Service
    25. metadata:
    26. name: nginx-svc
    27. spec:
    28. ports:
    29. - port: 80
    30. targetPort: 80
    31. protocol: TCP
    32. selector:
    33. name: nginx
    34. ---
    35. apiVersion: networking.k8s.io/v1
    36. kind: Ingress
    37. metadata:
    38. name: nginx-https
    39. spec:
    40. tls:
    41. - hosts:
    42. - www3.long.com
    43. secretName: tls-secret
    44. rules:
    45. - host: www3.long.com
    46. http:
    47. paths:
    48. - path: /
    49. pathType: Prefix
    50. backend:
    51. service:
    52. name: nginx-svc
    53. port:
    54. number: 80
    55. kubectl apply -f ingress-https.yaml

    master添加域名

    1. vim /etc/hosts
    2. 192.168.204.171 master
    3. 192.168.204.173 node01
    4. 192.168.204.175 node02
    5. 192.168.204.176 hub.david.com
    6. 192.168.204.177 stor01
    7. 192.168.204.173 www.long.com
    8. 192.168.204.175 www.long.com
    9. 192.168.204.173 www1.mao.com
    10. 192.168.204.175 www2.mao.com
    11. #新增下面域名
    12. 192.168.204.173 www3.long.com
    13. 192.168.204.175 www3.long.com

    浏览器测试:

    https://www3.long.com:32640/

    (9) Nginx 进行 BasicAuth

    1. mkdir /opt/ingress-nodeport/basic-auth
    2. cd /opt/ingress-nodeport/basic-auth

    生成用户密码认证文件,创建 secret 资源进行存储

    1. yum -y install httpd
    2. htpasswd -c auth mao #认证文件名必须为 auth
    3. kubectl create secret generic basic-auth --from-file=auth
    4. kubectl get secrets
    5. kubectl describe secrets basic-auth

    创建 ingress 资源

    k8s v1.14-1.18版本

    1. vim ingress-auth.yaml
    2. apiVersion: networking.k8s.io/v1beta1
    3. kind: Ingress
    4. metadata:
    5. name: ingress-auth
    6. annotations:
    7. #设置认证类型basic
    8. nginx.ingress.kubernetes.io/auth-type: basic
    9. #设置secret资源名称basic-auth
    10. nginx.ingress.kubernetes.io/auth-secret: basic-auth
    11. #设置认证窗口提示信息
    12. nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - mao'
    13. spec:
    14. rules:
    15. - host: auth.mao.com
    16. http:
    17. paths:
    18. - path: /
    19. backend:
    20. serviceName: nginx-svc
    21. servicePort: 80
    22. //具体详细设置方法可参考官网https://kubernetes.github.io/ingress-nginx/examples/auth/basic/

    k8s v1.19版本以上:

    1. vim ingress-auth.yaml
    2. apiVersion: networking.k8s.io/v1
    3. kind: Ingress
    4. metadata:
    5. name: ingress-auth
    6. annotations:
    7. #设置认证类型basic
    8. nginx.ingress.kubernetes.io/auth-type: basic
    9. #设置secret资源名称basic-auth
    10. nginx.ingress.kubernetes.io/auth-secret: basic-auth
    11. #设置认证窗口提示信息
    12. nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - mao'
    13. spec:
    14. rules:
    15. - host: auth.mao.com
    16. http:
    17. paths:
    18. - path: /
    19. pathType: Prefix
    20. backend:
    21. service:
    22. name: nginx-svc
    23. port:
    24. number: 80
    25. //具体详细设置方法可参考官网https://kubernetes.github.io/ingress-nginx/examples/auth/basic/

    访问测试

    1. kubectl apply -f ingress-auth.yaml
    2. kubectl get svc -n ingress-nginx
    3. echo'192.168.204.173 auth.mao.com' >> /etc/hosts
    4. echo'192.168.204.175 auth.mao.com' >> /etc/hosts
    5. 浏览器访问:http://auth.mao.com:30778
    6. 输入账户mao和密码

    (10) Nginx 进行重写

    metadata.annotations 配置说明

    1. nginx.ingress.kubernetes.io/rewrite-target: <字符串> #必须重定向流量的目标URI
    2. nginx.ingress.kubernetes.io/ssl-redirect: <布尔值> #指示位置部分是否仅可访问SSL(当Ingress包含证书时,默认为true)
    3. nginx.ingress.kubernetes.io/force-ssl-redirect: <布尔值> #即使Ingress未启用TLS,也强制重定向到HTTPS
    4. nginx.ingress.kubernetes.io/app-root: <字符串> #定义Controller必须重定向的应用程序根,如果它在'/'上下文中
    5. nginx.ingress.kubernetes.io/use-regex: <布尔值> #指示Ingress上定义的路径是否使用正则表达式

    编写ingress-rewrite.yaml

    k8s v1.14-1.18版本

    1. vim ingress-rewrite.yaml
    2. apiVersion: networking.k8s.io/v1beta1
    3. kind: Ingress
    4. metadata:
    5. name: nginx-rewrite
    6. annotations:
    7. nginx.ingress.kubernetes.io/rewrite-target: http://www1.mao.com:30778
    8. spec:
    9. rules:
    10. - host: re.mao.com
    11. http:
    12. paths:
    13. - path: /
    14. backend:
    15. #由于re.mao.com只是用于跳转不需要真实站点存在,因此svc资源名称可随意定义
    16. serviceName: nginx-svc
    17. servicePort: 80

    k8s v1.19版本以上:

    1. vim ingress-rewrite.yaml
    2. apiVersion: networking.k8s.io/v1
    3. kind: Ingress
    4. metadata:
    5. name: nginx-rewrite
    6. annotations:
    7. nginx.ingress.kubernetes.io/rewrite-target: http://www1.mao.com:30778
    8. spec:
    9. rules:
    10. - host: re.mao.com
    11. http:
    12. paths:
    13. - path: /
    14. pathType: Prefix
    15. backend:
    16. #由于re.mao.com只是用于跳转不需要真实站点存在,因此svc资源名称可随意定义
    17. service:
    18. name: nginx-svc
    19. port:
    20. number: 80

    访问测试

    1. kubectl apply -f ingress-rewrite.yaml
    2. echo'192.168.204.173 re.mao.com' >> /etc/hosts
    3. echo'192.168.204.175 re.mao.com' >> /etc/hosts
    4. 浏览器访问:http://re.mao.com:30778

    二、实验

    1.部署 nginx-ingress-controller(第一种方式)

    (1)部署ingress-controller pod及相关资源

    (2)修改 ClusterRole 资源配置

    (3)指定 nginx-ingress-controller 运行在 node02 节点

    采用方式二:DaemonSet+HostNetwork+nodeSelector

    (4)修改 Deployment 为 DaemonSet ,指定节点运行,并开启 hostNetwork 网络

    再次修改配置文件

    修改 kind为DaemonSet

    注释 replicas: 1

    使用主机网络hostNetwork: true

    选择节点运行ingress: "true"

    (5)在所有 node 节点上传 nginx-ingress-controller 镜像压缩包 ingree.contro.tar.gz 到/opt/ingress 目录,并解压和加载镜像

    (6)启动 nginx-ingress-controller

    nginx-ingress-controller 已经运行 node02 节点

    到 node02 节点查看

    由于配置了 hostnetwork,nginx 已经在 node 主机本地监听 80/443/8181 端口。其中 8181 是 nginx-controller 默认配置的一个 default backend(Ingress 资源没有匹配的 rule 对象时,流量就会被导向这个 default backend)。这样,只要访问 node 主机有公网 IP,就可以直接映射域名来对外网暴露服务了。如果要 nginx 高可用的话,可以在多个 node上部署,并在前面再搭建一套 LVS+keepalived 做负载均衡。
     

    (7)创建 ingress 规则

    创建一个 deploy 和 svc

    创建 ingress

    用的是方法二

    k8s v1.14-1.18版本

    k8s v1.19版本以上:

    生成pod并查看信息

    (8)测试访问

    给node2节点的host 添加域名解析

    回到master测试网页

    (9) 查看 nginx-ingress-controller

    可以看到从 start server www.david.com 到 end server www.david.com 之间包含了此域名用于反向代理的配置

    2.部署 nginx-ingress-controller(第二种方式)

    采用方式三:Deployment+NodePort模式的Service

    (1)下载 nginx-ingress-controller 和 ingress-nginx 暴露端口配置文件

    (2)在所有 node 节点上传镜像包 ingress-controller-0.30.0.tar 到 /opt/ingress-nodeport 目录,并加载镜像

    node01

    node02

    (3)启动 nginx-ingress-controller

    service-nodeport.yaml

    (4)Ingress HTTP 代理访问

    创建 deployment、Service、Ingress Yaml 资源

    k8s v1.14-1.18版本

    k8s v1.19版本以上:

    生成资源

    进入容器1

    进入容器2

    (5)测试访问

    添加域名地址

    测试网页,会轮巡显示

    (6)  Ingress HTTP 代理访问虚拟主机

    创建虚拟主机1资源

    创建虚拟主机2资源

    创建ingress资源

    k8s v1.14-1.18版本

    k8s v1.19版本以上:

    生成资源

    (7)  测试访问

    做主机映射

    测试网页

    (8)  Ingress HTTPS 代理访问

     创建ssl证书

    创建 secret 资源进行存储

    创建 deployment、Service、Ingress Yaml 资源

    k8s v1.14-1.18版本:

    k8s v1.19版本以上:

    生成资源

    浏览器测试

    (9) Nginx 进行 BasicAuth

    生成用户密码认证文件,创建 secret 资源进行存储

    创建 ingress 资源

    k8s v1.14-1.18版本:

    k8s v1.19版本以上:

    访问测试

    添加域名

     

    输入账号密码

    访问

    (10) Nginx 进行重写

    编写ingress-rewrite.yaml

    k8s v1.14-1.18版本:

    k8s v1.19版本以上:

    新增域名

    访问测试

    显示已重定向

    三、问题

    1.启动 nginx-ingress-controller报错

      (1)  报错

    (2)原因分析

    配置文件错误

    (3)解决方法

    修改配置文件

    修改前:

    修改后:

    成功:

    2.容器探针失败

    (1)报错

    (2)原因分析

    配置文件错误

    (3)解决方法

    修改配置文件

    修改前:

    修改后:

    成功:

    3.生成pod报错

    (1)报错

    (2)原因分析

    查看 kubernetes 官方文档:https://kubernetes.io/blog/2019/07/18/api-deprecations-in-1-16/、https://kubernetes.io/blog/2021/07/26/update-with-ingress-nginx/ 和 ingress-nginx 官方文档: https://kubernetes.github.io/ingress-nginx/,其中有下面这两段话

    kubernetes官网:

    1. The v1.22 release will stop serving the following deprecated API versions in favor of newer and more stable API versions:
    2. Ingress in the extensions/v1beta1 API version will no longer be served
    3. Migrate to use the networking.k8s.io/v1beta1 API version, available since v1.14. Existing persisted data can be retrieved/updated via the new version.

    自从 Kubernetes v1.14 版本开始 Ingress 资源才被加入到 networking.k8s.io/v1beta1 这个v1beta1 版本中来,至于什么时候开始这个 networking.k8s.io/v1beta1 这个beta版本变成了稳定版本,可以看这里,也就是说到了 kubernetes v1.19 版本,Ingress 资源才被加入到 networking.k8s.io/v1 这个版本中来。
     Ingress 在 k8s 各个版本中所处的 apiVersion 做一个归纳:

    (3)解决方法

    修改前:

    修改后:

    把yaml 文件中的 networking.k8s.io/v1 修改为 networking.k8s.io/v1beta1 ,又发生了如下的错误:

    也就是说在这个 networking.k8s.io/v1beta1 这个 apiVersion 版本下, 我们ingress 的yaml 里,有些 field 字段是不存在的,比如: service等

    成功:

    4.获取ingress失败

    (1)报错

    (2)原因分析

    创建ingess指定了namespace

    (3)解决方法

    修改配置文件,删除namespace

    修改前:

    修改后:

    成功:

    5.Centos7 终端报Message from syslogd 信息

    (1)报错

    在使用k8s集群的过程中,有些doceker容器注册网卡之后,没有及时释放。导致频繁报出日志告警。而此时远程终端打字都比较困难,老是被打断

    Centos7 终端报Message from syslogd :kernel:unregister_netdevice

    (2)原因分析

    此为服务器告警现象。

    其实这个并不会影响什么,但是要单个去处理又很麻烦。所以,先决定停止这类告警,然后后续再考虑如何下一步处理问题。

    (3)解决方法

    首先关闭syslog

    1. [root@node1 ~]# service rsyslog stop
    2. Redirecting to /bin/systemctl stop rsyslog.service

    这类告警信息都是由linux系统中的syslog服务提供的。

    关闭rsylog服务之后,终端打字就不会受到影响了,如果还要看日志信息,可以使用journalctl -f来进行查看

    journalctl -f

    查看syslog的配置文件

    打开配置文件/etc/rsyslog.conf

    vim /etc/rsyslog.conf

    这里有一个所有人都获取到紧急的消息,其实不需要先,注释这个语句

    注释了这句所有人发送紧急通知之后,重启启动进程服务,并查看服务状态

    6.Ingress和Ingress Controller关系

    (1)Ingress

    Ingress 就是定义路由规则:从集群外部-->集群内部的HTTP和HTTPS的路由规则。

    (2)Ingress Controller

    一方面:ingress controller正如其名一样是控制管理(control)ingress资源的一个应用,当在集群中(任意namespce下)部署了一个ingress,ingress controller会捕获到该ingress资源,然后根据一定规则配置到对应的内部组件上。其常用的内部组件是nginx。

    另一方面,从nginx角度看,ingress controller也是一种反向代理,外部请求,通过ingress controller,获取集群中的ingress资源(通过kind:ingress配置),根据其url规则,转发到不同的service上(类比nginx和nginx.conf配置文件)。

    四、总结

    ingress是k8s集群的请求入口,可以理解为对多个service的再次抽象;

    通常说的ingress一般包括ingress资源对象及ingress-controller两部分组成;

    ingress-controller有多种实现,社区原生的是ingress-nginx,根据具体需求选择;

    ingress自身的暴露有多种方式,需要根据基础环境及业务类型选择合适的方式。
     

    ingress controller可以为外网用户访问K8S集群内部pod提供代理服务。

    1. 1)提供全局访问代理
    2. 2)访问流程:用户–>ingress controller–>service–>pod

    ingress-controller作用

    1. ingress-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到 ingress-controller, 而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名、哪些URL要转发到哪些service等等。
    2.  Ingress Controller 的重大作用是将前端负载均衡器和 Kubernetes 完美地结合了起来,一方面在云、容器平台下方便配置的管理,另一方面实现了集群统一的流量入口,而不是像 nodePort 那样给集群打多个孔。

     ingress部署

    要使用 Ingress,得先部署 Ingress Controller 实体(相当于前端 Nginx),然后再创建 Ingress (相当于 Nginx 配置的 k8s 资源体现),Ingress Controller 部署好后会动态检测 Ingress 的创建情况生成相应配置。

  • 相关阅读:
    Apache DolphinScheduler 3.0.0 升级到 3.1.8 教程
    C++字符串大小写转换
    从头开始——重新布置渗透测试环境的过程记录(From Windows To Mac)
    图片怎么转文字?这些方法值得收藏
    本科生学深度学习-Attention机制
    el-form添加自定义校验规则校验el-input只能输入数字
    mysql用事务实现更新数据
    C#内存管理
    6.1 KMP算法搜索机器码
    jvs-rules(规则引擎)和jvs智能bi(自助式数据分析)9.22更新内容
  • 原文地址:https://blog.csdn.net/cronaldo91/article/details/133339081