K8S的inress-nginx

1、Ingress 及 Ingress Controller 简介

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 那样给集群打多个孔。
K8S的inress-nginx
因此,总的来讲要使用 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

2、Ingress 组成

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

    3、ingress的工做原理

    ingress具体的工做原理以下:

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

4、Ingress 能够解决什么问题?

动态配置服务

若是按照传统方式, 当新增长一个服务时, 咱们可能须要在流量入口加一个反向代理指向咱们新的k8s服务. 而若是用了Ingress, 只须要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不须要而外的操做.web

减小没必要要的暴露端口

配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要缘由是k8s的不少服务会以NodePort方式映射出去, 这样就至关于给宿主机打了不少孔, 既不安全也不优雅. 而Ingress能够避免这个问题, 除了Ingress自身服务可能须要映射出去, 其余服务都不要用NodePort方式docker

5、Ingress-nginx配置示例

1) 建立一个web服务,用deployment资源, 用httpd镜像,而后建立一个service资源与之关联。

[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

K8S的inress-nginx

[root@master ingress]# kubectl get pod -n bdqn-ns

K8S的inress-nginx

访问一下

K8S的inress-nginx

2) 建立一个web服务,用deployment 资源,用tomcat:8.5.45镜像。

[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

K8S的inress-nginx

[root@master ingress]# kubectl get svc -n bdqn-ns

K8S的inress-nginx

访问一下

K8S的inress-nginx

3) 在k8s集群前边部署一个反向代理服务器,这个服务器代理这k8s集群内部的service资源。

1. Ingress:

(1)Ingress controller: vim

将新加入的Ingress转化为反向代理服务器的配置文件,并使之生效。后端

(2)Ingress :api

Ingress:将反向代理服务器的配置抽象成一个Ingress对象,每添加一个新的服务,只须要写一个新的Ingress的yaml文件便可。

2. Nginx :反向代理服务器。

须要解决了两个问题:

一、动态的配置服务。

二、减小没必要要的暴露端口。

基于nginx的ingress controller根据不一样的开发公司,又分为两种:
​ 一、k8s社区版的: Ingerss - nginx.
​ 二、nginx公司本身开发的: nginx- ingress .

3. 在gitbub上找到所需的ingress的yaml文件

K8S的inress-nginx

K8S的inress-nginx

K8S的inress-nginx

K8S的inress-nginx

4. master下载

[root@master ingress]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/mandatory.yaml

5. 修改 mandatory.yaml 文件

[root@master ingress]# vim mandatory.yaml
      hostNetwork: true   #213

K8S的inress-nginx

---------若是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映射到宿主机 上的端口。)

(1)执行一下

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

(2)查看一下

[root@master ingress]# kubectl get pod -n ingress-nginx

6. 建立一个service的yaml文件

(1)执行一下

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

(2)查看一下

[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

K8S的inress-nginx

4)建立Ingress资源。

ingress :
ingress-nginx-controller: 动态感知ingress 资源的变化
ingress: 建立svc5ingress-nginx-contr011er 关联的规则

(1)编写ingress的yaml文件

[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

K8S的inress-nginx

[root@master yaml]# kubectl get ingresses. -n bdqn-ns

K8S的inress-nginx

[root@master yaml]# kubectl describe ingresses. -n bdqn-ns

K8S的inress-nginx

进入pod查看一下

[root@master yaml]# kubectl exec -it -n ingress-nginx nginx-ingress-controller-5954d475b6-24k92 /bin/sh
/etc/nginx $ cat nginx.conf

K8S的inress-nginx

(2)访问一下

进入本机的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)运行所在的节点IP。

K8S的inress-nginx

访问http://ingress.bdqn.com/

K8S的inress-nginx

访问http://ingress.bdqn.com/tomcat

K8S的inress-nginx

5)为ingress-nginx建立一个service(使用官网的service文件就能够)

K8S的inress-nginx

K8S的inress-nginx

K8S的inress-nginx

K8S的inress-nginx

复制上面的网址

[root@master yaml]# wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.29.0/deploy/static/provider/baremetal/service-nodeport.yaml
//下载文件到master节点

执行一下,下载的service文件

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

查看一下

[root@master yaml]# kubectl get service -n ingress-nginx

K8S的inress-nginx

访问一下

进入本机的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)运行所在的节点IP。

K8S的inress-nginx

访问http://ingress.bdqn.com:30817/

K8S的inress-nginx

访问http://ingress.bdqn.com:30817/tomcat

K8S的inress-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

K8S的inress-nginx

进入本机的 C:\Windows\System32\drivers\etc , 修改hosts文件,添加Pod(ingress-controller)运行所在的节点IP。

添加完以后访问一下http://ingress.xgp.com/

K8S的inress-nginx

相关文章
相关标签/搜索