先来个一句话总结:Ingress由Ingress规则、分钟IngressController、搞懂IngressClass这3部分组成。分钟Ingress资源只是搞懂一系列路由转发配置,必须使用IngressController才能让路由规则生效,分钟而IngressClass是搞懂IngressController的具体实现。使用原则:先部署IngressController → 再部署Ingress资源。分钟
没有Ingress之前,可以通过Service的分钟nodePort对外暴露服务,将容器端口与Service的nodePort端口做映射,这样访问集群中任意一台Node的IP:nodePort就能访问到集群内部。Service 的这种暴露服务的形式是工作在TCP/IP层。或者将Pod的端口与HostPort做映射。
但是这样做弊端较多,比如暴露了太多的Node端口、无法做域名转发等。
所以引入了Ingress的概念,Ingress是一个七层路由转发器,类似于Nginx。使用Ingress进行路由转发时,ingressController会基于ingress规则将客户端请求直接转发到Service对应的Pod上,这样会跳过 kube-proxy 设置的路由转发规则,可以提高网络转发效率。
Ingress资源是一种虚拟的资源和规则定义,需要配合ingressController才能生效。所以要让Ingress资源工作,集群必须有一个正在运行的ingressController。
Ingress由Ingress规则、IngressController、IngressClass这3部分组成。Ingress规则只是一系列的配置,必须使用IngressController才能使其生效,而IngressClass是IngressController的具体实现。关系如下图:
ingressController的实现有多种,比如有Ingress-Nginx、Traefik、Kong Ingress等,所以需要在Yaml编排文件中指定ingressClass。
一旦Ingress资源成功部署创建,IngressController就会监控到其配置的路由策略,并更新到Nginx的配置文件中生效。
综上,IngressController 的功能如下:
Ingress的工作流程,如下图:
本文实践使用的是ingress-nginx,其实方式你可以自行实践。
官网地址:https://kubernetes.github.io/ingress-nginx/deploy/#quick-start
可以通过helm或kubectl安装,本文使用的是kubectl方式安装,yaml的文件内容较多,你可以自行下载查阅。执行以下命令安装:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
IngressController部署完毕后,就是开始编排Yaml了。
Yaml中定义了一个容器镜像是Nginx的Pod,然后通过Service与Pod关联,再通过Ingress规则访问对应的Pod。
apiVersion: v1kind: Podmetadata: name: web-app namespace: demo labels: app: web-appspec: containers: - name: web-app image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: web-service namespace: demo labels: app: web-servicespec: selector: app: web-app # ClusterIP | LoadBalancer | NodePort,使用Ingress就没必要设置成NortPort type: ClusterIP clusterIP: None ports: - name: web-service-port protocol: TCP port: 80 targetPort: 80---# 创建Ingress策略apiVersion: networking.k8s.io/v1kind: Ingressmetadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: / name: web-ingress namespace: demospec: # 指定ingressClass ingressClassName: nginx rules: - host: web-ingress.mangod.top http: paths: - path: / pathType: Prefix backend: service: name: web-service port: number: 80
Yaml编排完毕后,使用kubectl apply命令部署,部署完毕后,在本地/etc/hosts里配置域名和某个K8S-Node节点的映射关系(当然,生产环境的访问链路比这个长,后面有机会再介绍,文中为了快速测试,直接在本地配置DNS),类似这样点的映射关系:
10.20.1.23 web-ingress.mangod.top
然后,浏览器访问http://web-ingress.mangod.top/,界面如下,说明ingress使用成功。
此时我们使用如下命令,进入到ingressController对应的pod,继续验证,可以看到熟悉的nginx.conf,之前配置的ingress规则在配置里都可以看到,如下:
kubectl get pods -n ingress-nginxkubectl exec ingress-nginx-controller-nginx-d864d97df-22ljk -it -n ingress-nginx /bin/bash
至此实践过程结束。
一句话总结:Ingress由Ingress规则、IngressController、IngressClass这3部分组成。Ingress资源只是一系列路由转发配置,必须使用IngressController才能让路由规则生效,而IngressClass是IngressController的具体实现。使用原则:先部署IngressController → 再部署Ingress资源。
责任编辑:华轩 来源: 不焦躁的程序员 Ingress云原生Kubernetes(责任编辑:综合)
北京汽车(01958.HK)年度净利跌59.4% 每股收益为人民币0.24元
Serverless与AI驱动,阿里云数据库核心能力全面升级!
共享办公企业WeWork将申请破产 孙正义:这笔投资是“愚蠢的”
贝达药业(300558.SZ)公布消息:凯铭投资解押239万股及质押的511万股延期购回