一、Ingress 简介 

  (1)

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

    NodePort
    LoadBalancer
    Ingress

  (2)

  Ingress :

    ingress controller
      将新加入的Ingress转化成Nginx的配置文件并使之生效;
    ingress服务
      将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可;

  (3) 

  Ingress 工作原理:

    ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,

    然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置,

    再写到nginx-ingress-control的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中,

    然后reload一下使配置生效。
    以此达到域名分配置和动态更新的问题。

  Ingress 可以解决什么问题:

   动态配置服务:
      如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务.

       而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要而外的操作.
   减少不必要的端口暴露:
       配置k8s时, 第一步是要关闭防火墙, 原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅.       

      而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式。

  (4)

  结构图:

  

  因为整个结构中,要创建不止一个service、pod,我这里用A和B加以区分说明:

    service-A:此service是让ingress-controller能够接入集群外部的流量,因为默认外部是不能访问的;将此service的端口暴露出去;

    service-B:此service就是就是正常的pod service ;

    ingress-controller:也就是图中的pod-A,运行在service-A后面,也是一个pod,此pod的namespace为ingress-nginx;

二、部署配置Ingress

  (1)获取配置文件

    https://github.com/kubernetes/ingress-nginx/tree/nginx-0.20.0/deploy    

    下载以下几个文件:
    configmap.yaml  default-backend.yaml  mandatory.yaml  namespace.yaml  rbac.yaml  tcp-services-configmap.yaml  udp-services-configmap.yaml  with-rbac.yaml

    

 

  (2) 准备镜像

    a、

    [root@master ingress-nginx]# vim mandatory.yaml  #mandatory.yaml是其他文件的集合

    编辑mandatory.yaml文件,将defaultbackend镜像地址改成阿里云的镜像地址(如下图),至于原因 你懂得...

    image: registry.cn-hangzhou.aliyuncs.com/allinpay/defaultbackend-amd64:v1.5

    

    b、

    至于nginx-ingress-controller的镜像,国内可以访问quay.io,就不用改了;

  (3) 安装

    [root@master ingress-nginx]# kubectl apply -f mandatory.yaml  #这里执行mandatory.yaml这一个文件就行了

    

    稍等片刻,只要操作不出问题,应该就OK了,如下图:

    

  (4)创建后端pod和service (pod-B、service-B)

    [root@master ~]# cd /root/manifests/ingress

    [root@master ingress]# cat deploy-demo.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: myapp
      namespace: default
    spec:
      selector:
        app: myapp
        release: canary
      ports:
      - name: http
        targetPort: 80
        port: 80
    ---  

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: myapp-deploy
      namespace: default
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: myapp
          release: canary
      template:
        metadata:
          labels:
            app: myapp
            release: canary
        spec:
          containers:
          - name: myapp
            image: ikubernetes/myapp:v2
            ports:
            - name: http
              containerPort: 80

   ------------------------------------------------------------------------------

   [root@master ingress]# kubectl apply -f deploy-demo.yaml

      [root@master ingress]# kubectl get pods

    [root@master ingress]# kubectl get svc

    

  (5)创建service-A

    [root@master ingress-nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml

    [root@master ingress-nginx]# cat service-nodeport.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: ingress-nginx
      namespace: ingress-nginx
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      type: NodePort
      ports:
        - name: http
      port: 80
      targetPort: 80
      protocol: TCP
      nodePort: 30080
      - name: https
      port: 443
      targetPort: 443
      protocol: TCP
      nodePort: 30443
      selector:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx

    ---

    

    [root@master ingress-nginx]# kubectl apply -f service-nodeport.yaml

    

    在外部浏览器中中访问:ip:30080

    

    此时报错的原因是因为没有生成ingress-controller关联到service-B的ingress规则;

    (5)

    定义ingress规则,此间规则会自动注入到ingress-controller(pod)的nginx.conf中;

    ingress-controller是直接关联到service-B的,但是中间由ingress来生成各种规则;  

    

    此时ingress-controller的nginx.conf中会自动生成一个server段的配置,也就是一个nginx的虚拟主机的字段,还包括upstream配置等;

    upstream自动代理到后端pod(pod-B),这些都是自动生成,所以就实现了自动生成配置,自动更改配置等;

    只需要改此yaml文件即可;

    [root@master ingress]# kubectl apply -f ingress-myapp.yaml

    

    

    在外部主机上配置好host文件:

    

    然后在浏览器中再访问,发现已经可以访问到后端pod了:

    

三、再来一个例子

  举一个后端pod(pod-B)为Tomcat的例子:

  草图如下:

  

   service-B和后端的Tomcat-pod上要开启8080和8009端口;

   ingress-controller上用80(这里是30080)映射到8080端口,来代理Tomcat;

   此图中的两个nginx和两个tomcat都是pod(pod-B)

  (1)创建后端pod(pod-B、service-B)

  

  

  查看一下Tomcat容器中所开的端口,发现8080和8009已经打开:

  

  查看tomcat的svc:

  

  (2)创建ingress

  

  

  (3)

  修改hosts文件:

  

  访问,发现已经有了,我们这里ingress-controller的nginx暴露的30080端口,不是80,所以要访问30080:

  

  

  

kubernetes1.13.1部署ingress-nginx-十一的更多相关文章

  1. 基于k8s集群部署prometheus监控ingress nginx

    目录 基于k8s集群部署prometheus监控ingress nginx 1.背景和环境概述 2.修改prometheus配置 3.检查是否生效 4.配置grafana图形 基于k8s集群部署pro ...

  2. [转帖]Breeze部署kubernetes1.13.2高可用集群

    Breeze部署kubernetes1.13.2高可用集群 2019年07月23日 10:51:41 willblog 阅读数 673 标签: kubernetes 更多 个人分类: kubernet ...

  3. 云原生之旅 - 8)云原生时代的网关 Ingress Nginx

    前言 当我们在Kubernetes部署的服务需要暴露给外部用户使用时,有三种选择:LoadBalancer,NodePort, Ingress. LoadBalancer类型得结合各个Cloud Pr ...

  4. Django 部署 uwsgi + nginx + supervisor

    Django 部署 uwsgi + nginx + supervisor https://hacpai.com/article/1460607620615?p=1&m=0 zonghua • ...

  5. 【转帖】kubernetes 部署ingress

    kubernetes 部署ingress https://www.cnblogs.com/dingbin/p/9754993.html 明天尝试一下 之前的文档里面一直没有提 需要改host文件 我有 ...

  6. kubernetes 部署ingress

    kubernetes Ingess 是有2部分组成,Ingress Controller 和Ingress服务组成,常用的Ingress Controller 是ingress-nginx,工作的原理 ...

  7. Ubuntu16.04安装kubernetes1.13集群

    Ubuntu16.04安装kubernetes1.13集群 最新的安装可以使用以下方式:https://www.cnrancher.com/docs/rancher/v2.x/cn/overview/ ...

  8. suse 12 二进制部署 Kubernetets 1.19.7 - 第13章 - 部署metrics-server插件

    文章目录 1.13.0.创建metrics-server证书和私钥 1.13.1.生成metrics-server证书和私钥 1.13.2.开启kube-apiserver聚合配置 1.13.3.分发 ...

  9. suse 12 编译部署Keepalived + nginx 为 kube-apiserver 提供高可用

    文章目录 编译部署nginx 下载nginx源码包 编译nginx 配置nginx.conf 配置nginx为systemctl管理 分发nginx二进制文件和配置文件 启动kube-nginx服务 ...

随机推荐

  1. python把日期转换为秒数;日期转为字符串;datetime、date

    1.秒数是相对于1970.1.1号的秒数 2.日期的模块有time.datetime 3. import datetime t = datetime.datetime(2009, 10, 21, 0, ...

  2. 【基础练习】【线性DP】codevs3027 线段覆盖2题解

    文章被盗还是非常严重,加版权信息 转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看看 这道题目是线性动归 可是思想和背包有些类似 事实上线性动 ...

  3. 斯坦福《机器学习》Lesson6感想———1、函数间隔和几何间隔

    这一课主要是从怎样推断一个机器学习分类算法里拟合的參数是最佳參数引出函数间隔和几何间隔的定义. 1.函数间隔 如果假想函数 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...

  4. HDU 2955 Robberies(01背包变形)

    Robberies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. 关于使用openfiler作为共享存储来安装rac时的问题

    关于使用openfiler作为共享存储来安装rac时的问题 第一:一定要使用openfiler-2.3-x86-disc1.iso这个版本号的openfiler,不要使用其它版本号的openfiler ...

  6. Android学习笔记(十)——使用意图链接活动

    使用意图链接活动 1.新建一个名为"UsingIntent"的项目,右击src目录下的包名,选择New-->Class选项.并将新的类文件名称命名为"SecondA ...

  7. spark 33G表

    http://192.168.2.51:4041 http://hadoop1:8088/proxy/application_1512362707596_0006/executors/ Executo ...

  8. GitExtensions 官方手册(英文)

    在线版本(最新版):https://git-extensions-documentation.readthedocs.io/en/latest/ PDF版本(版本号 2.48):http://pan. ...

  9. poj 1180 Batch Scheduling (斜率优化)

    Batch Scheduling \(solution:\) 这应该是斜率优化中最经典的一道题目,虽然之前已经写过一道 \(catstransport\) 的题解了,但还是来回顾一下吧,这道题其实较那 ...

  10. [TJOI2017] 不勤劳的图书管理员

    题目描述 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打乱顺序的书, ...