Ingress简单的理解: 原先暴露的service,如今给定个统一的访问入口。 前端
Ingress 是 k8s 资源对象,用于对外暴露服务,该资源对象定义了不一样主机名(域名)及 URL 和对应后端 Service(k8s Service)的绑定,根据不一样的路径路由 http 和 https 流量。而 Ingress Contoller 是一个 pod 服务,封装了一个 web 前端负载均衡器,同时在其基础上实现了动态感知 Ingress 并根据 Ingress 的定义动态生成 前端 web 负载均衡器的配置文件,好比 Nginx Ingress Controller 本质上就是一个 Nginx,只不过它能根据 Ingress 资源的定义动态生成 Nginx 的配置文件,而后动态 Reload。我的以为 Ingress Controller 的重大做用是将前端负载均衡器和 Kubernetes 完美地结合了起来,一方面在云、容器平台下方便配置的管理,另外一方面实现了集群统一的流量入口,而不是像 nodePort 那样给集群打多个孔。
因此,总的来讲要使用 Ingress,得先部署 Ingress Controller 实体(至关于前端 Nginx),而后再建立 Ingress (至关于 Nginx 配置的 k8s 资源体现),Ingress Controller 部署好后会动态检测 Ingress 的建立状况生成相应配置。Ingress Controller 的实现有不少种:有基于 Nginx 的,也有基于 HAProxy的,还有基于 OpenResty 的 Kong Ingress Controller 等,更多 Controller 见:https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/,本文使用基于 Nginx 的 Ingress Controller:ingress-nginx。
node
ingress contronler经过与k8s的api进行交互,动态的去感知k8s集群中ingress服务规则的变化,而后读取它,并按照定义的ingress规则,转发到k8s集群中对应的service。nginx
而这个ingress规则写明了哪一个域名对应k8s集群中的哪一个service,而后再根据ingress-controller中的nginx配置模板,生成一段对应的nginx配置。git
而后再把该配置动态的写到ingress-controller的pod里,该ingress-controller的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入到nginx的配置文件中,而后reload一下,使其配置生效。以此来达到域名分配置及动态更新的效果。github
若是按照传统方式, 当新增长一个服务时, 咱们可能须要在流量入口加一个反向代理指向咱们新的k8s服务. 而若是用了Ingress, 只须要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不须要而外的操做.web
配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要缘由是k8s的不少服务会以NodePort方式映射出去, 这样就至关于给宿主机打了不少孔, 既不安全也不优雅. 而Ingress能够避免这个问题, 除了Ingress自身服务可能须要映射出去, 其余服务都不要用NodePort方式docker
[root@master ingress]# vim deploy_1.yaml apiVersion: v1 kind: Namespace metadata: name: bdqn-ns labels: name: bdqn-ns --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: httpd-deploy namespace: bdqn-ns spec: replicas: 2 template: metadata: labels: app: bdqn-ns spec: containers: - name: httpd image: httpd --- apiVersion: v1 kind: Service metadata: name: httpd-svc namespace: bdqn-ns spec: type: NodePort selector: app: bdqn-ns ports: - name: http-port port: 80 targetPort: 80 nodePort: 31033
[root@master ingress]# kubectl apply -f deploy_1.yaml
[root@master ingress]# kubectl get svc -n bdqn-ns
[root@master ingress]# kubectl get pod -n bdqn-ns
[root@master ingress]# vim deploy_2.yaml apiVersion: v1 kind: Namespace metadata: name: bdqn-ns labels: name: bdqn-ns --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: httpd-deploy namespace: bdqn-ns spec: replicas: 2 template: metadata: labels: app: bdqn-ns spec: apiVersion: v1 kind: Namespace metadata: name: bdqn-ns labels: name: bdqn-ns --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: tomcat-deploy namespace: bdqn-ns spec: replicas: 2 template: metadata: labels: app: bdqn-tomcat spec: containers: - name: tomcat image: tomcat:8.5.45 --- apiVersion: v1 kind: Service metadata: name: tomcat-svc namespace: bdqn-ns spec: type: NodePort selector: app: bdqn-tomcat ports: - name: tomcat-port port: 8080 targetPort: 8080 nodePort: 32033
[root@master ingress]# kubectl apply -f deploy_2.yaml
[root@master ingress]# kubectl get pod -n bdqn-ns
[root@master ingress]# kubectl get svc -n bdqn-ns
(1)Ingress controller: vim
将新加入的Ingress转化为反向代理服务器的配置文件,并使之生效。后端
(2)Ingress :api
Ingress:将反向代理服务器的配置抽象成一个Ingress对象,每添加一个新的服务,只须要写一个新的Ingress的yaml文件便可。
须要解决了两个问题:
一、动态的配置服务。
二、减小没必要要的暴露端口。
基于nginx的ingress controller根据不一样的开发公司,又分为两种:
一、k8s社区版的: Ingerss - nginx.
二、nginx公司本身开发的: nginx- ingress .
[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/mandatory.yaml
[root@master ingress]# vim mandatory.yaml hostNetwork: true #213
---------若是ingress-controller镜像下载不成功,能够直接使用下边的镜像。
docker pull registry.cn-hangzhou.aliyuncs.com/ilanni/nginx-ingress-controller:0.22.0
须要注意的是,若是使用上述镜像,须要将deployment资源指定的镜像名称进行修改。
修改的是madatory.yaml文件里的deployment资源。
在deployment资源中,若是添加了此字段,意味着Pod中运行的应用能够直接使用node节点的端口,这样node节 点主机所在网络的其余主机,就能够经过访问该端口访问此应用。(相似于docker映射到宿主机 上的端口。)
[root@master ingress]# kubectl apply -f mandatory.yaml
[root@master ingress]# kubectl get pod -n ingress-nginx
[root@master ingress]# kubectl apply -f mandatory.yaml
[root@master ingress]# vim mandatory-svc.yaml apiVersion: v1 kind: Service metadata: name: ingress-nginx namespace: ingress-nginx spec: type: NodePort ports: - name: httpd port: 80 targetPort: 80 - name: https port: 443 selector: app: ingress-nginx
执行一下
[root@master ingress]# kubectl apply -f mandatory-svc.yaml
查看一下
[root@master ingress]# kubectl get svc -n ingress-nginx
ingress :
ingress-nginx-controller: 动态感知ingress 资源的变化
ingress: 建立svc5ingress-nginx-contr011er 关联的规则
[root@master yaml]# vim ingress.yaml apiVersion: extensions/v1beta1 kind: Ingress metadata: name: bdqn-ingress namespace: bdqn-ns annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: #规则 - host: ingress.bdqn.com #域名 http: paths: - path: / backend: serviceName: httpd-svc #关联service servicePort: 80 #关联service的映射端口 - path: /tomcat backend: serviceName: tomcat-svc #关联service servicePort: 8080 #关联service的映射端口
[root@master yaml]# kubectl apply -f ingress.yaml
[root@master yaml]# kubectl get pod -n ingress-nginx -o wide
[root@master yaml]# kubectl get ingresses. -n bdqn-ns
[root@master yaml]# kubectl describe ingresses. -n bdqn-ns
[root@master yaml]# kubectl exec -it -n ingress-nginx nginx-ingress-controller-5954d475b6-24k92 /bin/sh /etc/nginx $ cat nginx.conf
复制上面的网址
[root@master yaml]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/provider/baremetal/service-nodeport.yaml //下载文件到master节点
[root@master yaml]# kubectl apply -f service-nodeport.yaml
[root@master yaml]# kubectl get service -n ingress-nginx
Service -Nodeport:由于ingress - nginx - controller运行在了集群内的其中一个节点,为了保证即便这个节点宕机,咱们对应的域名仍然可以正常访问服务,因此咱们将ingress -nginx- controller也暴露为一个service资源。
建立一个deploymen资源,基于nginx镜像,repolicas:2个.而后建立一个service资源关联这个deployment资源。最后建立一个ingress资源,将上述svc关联到ingress.bdqn.com/nginx 目录下。
[root@master yaml]# vim lianxi.yaml apiVersion: v1 kind: Namespace metadata: name: xgp-666 labels: name: xgp-666 --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: xgp namespace: xgp-666 spec: replicas: 2 template: metadata: labels: app: xgp-nginx spec: containers: - name: xgp-nginx image: nginx --- apiVersion: v1 kind: Service metadata: name: xgp-svc namespace: xgp-666 spec: type: NodePort selector: app: xgp-nginx ports: - name: xgp-port port: 80 targetPort: 80 nodePort: 30000 --- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: xgp-ingress namespace: xgp-666 annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: ingress.xgp.com http: paths: - path: / backend: serviceName: xgp-svc servicePort: 80
[root@master yaml]# kubectl apply -f lianxi.yaml
[root@master yaml]# kubectl describe ingresses. -n xgp-666