Kubernetes Ingress概念及部署

Kubernetes Ingress概念及部署

1概述

    对于kubernetes中Service的概念,我们知道service的表现形式为IP:Port,通过kube-proxy来实现,分别有clusterIP,NodePort,LoadBalance

。ClusterIP网络仅限集群内通信,NodePort可以实现暴露服务访问入口,但service的端口会作用在每个Node节点,对于端口的管理和占用带来复杂和低
效。而LoadBalance通常需要第三方云提供商支持,从而带来约束性。同时,我们知道对于基于HTTP的服务来说,不同的URL地址经常需要对应到不同的后
端服务或者虚拟主机,这些机制通过kubernetes的Service是无法实现的,今天我们对于Ingress的理解和部署。

1.1什么是ingress

    通常,Service和pod仅有集群内互相路由的IP。到流量到达边缘节点的时候将被丢弃或者转发。在概念上,这可能看起来像:
                    internet
                    |
              ------------
              [ Services ]

    Ingress主要实现集群内所有服务的入口,通过一系列规则集合来允许外部的访问。
                     internet
                    |
               [ Ingress ]
               --|-----|--
               [ Services ]

    Ingress可以配置为提供服务外部访问的URL,负载均衡,SSL,提供基于名称的虚拟主机等。而ingress的具体实现是由ingress Controller实现

的,在定义Ingress之前,,需要先部署Ingress Controller,以实现为所有后端Service提供一个统一的入口。Ingress Controller需要实现基于不同HTTP URL 向后端转发的负载分发规则,通常应根据应用系统的需求进行自定义实现。在kubernetes中,Ingress Controller将以Pod的形式运行,监控Apiserver的/ingress接口后端的backend service,如果service发生变化,则Ingress Controll应自动更新其转发规则。

2.部署Ingress Controller

下面我们将部署一个Nginx 实现的Ingress Controller,需要实现的基本逻辑如下:

  1. 监听apiserver,获取全部ingress的定义
  2. 基于ingress的定义,生成Nginx所需的配置文件(/etc/nginx/nginx.conf)
  3. 执行nginx -s reload命令,重新加载nginx.conf配置文件的内容.

下载所需镜像:
19931028/nginx-ingress-controller:0.8.3 (ingress controller 的镜像)
19931028/defaultbackend:1.0 (default-http-backend的servcie的镜像)
19931028/echoserver:1.0 (用于测试ingress的service镜像)

首先定义个默认service backend 用于为ingress controller 响应404不存在的请求。

                        $ cat defualt-http-backend.yaml
                                apiVersion: v1
                                kind: Service
                                metadata:
                                  labels:
                                    app: default-http-backend
                                  name: default-http-backend
                                spec:
                                  ports:
                                  - port: 80
                                    targetPort: 8080
                                  selector:
                                    app: default-http-backend
                                ---
                                apiVersion: v1
                                kind: ReplicationController
                                metadata:
                                  name: default-http-backend
                                spec:
                                  replicas: 1
                                  selector:
                                    app: default-http-backend
                                  template:
                                    metadata:
                                      labels:
                                        app: default-http-backend
                                    spec:
                                      terminationGracePeriodSeconds: 60
                                      containers:
                                      - name: default-http-backend
                                        # Any image is permissable as long as:
                                        # 1. It serves a 404 page at /
                                        # 2. It serves 200 on a /healthz endpoint
                                        image: 19931028/defaultbackend:1.0
                                        livenessProbe:
                                          httpGet:
                                            path: /healthz
                                            port: 8080
                                            scheme: HTTP
                                          initialDelaySeconds: 30
                                          timeoutSeconds: 5
                                        ports:
                                        - containerPort: 8080
                                        resources:
                                          limits:
                                            cpu: 10m
                                            memory: 20Mi
                                          requests:
                                            cpu: 10m
                                            memory: 20Mi
                    $ kubectl create -f default-http-backend.yaml
                     ##测试相应的rc以及service是否成功创建:测试能否正常访问,通过的pod的ip/healthz或者serive的ip/访问测试。
                     >curl -s 10.254.92.159
                           default backend - 404

                - 配置ingress-controller
                        >  cat nginx-ingress-controller.yaml
                                apiVersion: v1
                                kind: ReplicationController
                                metadata:
                                  name: nginx-ingress
                                  labels:
                                    app: nginx-ingress
                                spec:
                                  replicas: 1
                                  selector:
                                    app: nginx-ingress
                                  template:
                                    metadata:
                                      labels:
                                        app: nginx-ingress
                                    spec:
                                      containers:
                                      - image: 19931028/nginx-ingress-controller:0.8.3
                                        name: nginx-ingress-controller
                                        ports:
                                        - containerPort: 80
                                          hostPort: 80
                                        args:
                                        - /nginx-ingress-controller
                                        - --default-backend-service=default/default-http-backend
                                        env:
                                          - name: KUBERNETES_MASTER
                                            value: http://internal-kubernetes-lb-1281778143.cn-north-1.elb.amazonaws.com.cn:8080
                                          - name: POD_NAMESPACE
                                            value: default
         ##创建ingress-controller rc
              $ kubectl create -f ingress-nginx-controller.yaml

        - 配置进行测试ingress Controller功能
                ##创建一个正常的服务
                $ cat test.yaml
                        apiVersion: v1
                        kind: ReplicationController
                        metadata:
                          name: echoheaders
                        spec:
                          replicas: 1
                          template:
                            metadata:
                              labels:
                                app: echoheaders
                            spec:
                              containers:
                              - name: echoheaders
                                image: 19931028/echoserver:1.0
                                ports:
                                - containerPort: 8080
                        ---
                        apiVersion: v1
                        kind: Service
                        metadata:
                          name: echoheaders-default
                          labels:
                            app: echoheaders
                        spec:
                          #type: NodePort
                          ports:
                          - port: 80
                           # nodePort: 30302
                            targetPort: 8080
                            protocol: TCP
                            name: http
                          selector:
                            app: echoheaders
            ##创建
             $kubectl create -f test.yaml
    - 配置ingress规则,通过ingress 资源对其进行配置
            > cat test-ingress.yaml
                    apiVersion: extensions/v1beta1
                    kind: Ingress
                    metadata:
                      name: echomap
                    spec:
                      rules:
                      - host: k8s.baidu.com
                        http:
                          paths:
                          - path: /foo
                            backend:
                              serviceName: echoheaders-default
                              servicePort: 80

            ##以上配置内容:
                    1-4: 和普通的pod,service字段一样
                    5-7: 定义一个虚拟主机的规则.对应于nginx server{server_name k8s.baidu.com}
                    8-10: 配置一个/foo路径,对应于nginx location /foo{};
                    11-13: 添加一个service名。对应于nginx location /foo{proxy_pass http://echoheaders-default}

            ##最后测试
            > curl -v http://nodeip:80/foo -H 'host: k8s.baidu.com'(NoeIP为ingress Controller所运行的Node)
            ##其他配置说明请查阅:https://github.com/kubernetes/ingress/tree/master/controllers/nginx

Question

    1.在部署ingress Controller遇到以下小问题:
            ingress内部程序默认是通过localhost:8080连接master的apiserver.如果在非单机节点部署ingress Controller时应该通过环境变量指定
            解决:在ingress-nginx-controller.yaml 中添加
                    env:
                    - name: KUBERNETES_MASTER
        value: http://183.131.19.231:8080
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 安装k8s Master高可用集群 主机 角色 组件 172.18.6.101 K8S Master Kubele...
    jony456123阅读 7,996评论 0 9
  • kubernetes应用部署 http://blog.sina.com.cn/s/blog_6e05157f01...
    jony456123阅读 1,236评论 0 0
  • 1.Pod Pod是k8s的最基本的操作单元,包含一个或多个紧密相关的容器,类似于豌豆荚的概念。一个Pod可以被一...
    jony456123阅读 7,326评论 0 5
  • 版权声明:原创作品,谢绝转载!否则将追究法律责任。 前言 最近中国和印度的局势也是愈演愈烈。作为一个爱国青年我有些...
    李伟铭MIng阅读 2,000评论 0 5