K8S的inress-nginx

一、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。

二、Ingress 组成

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

    三、ingress的工作原理

    ingress具体的工作原理如下:

ingress contronler通过与k8s的api进行交互,动态的去感知k8s集群中ingress服务规则的变化,然后读取它,并按照定义的ingress规则,转发到k8s集群中对应的service。

而这个ingress规则写明了哪个域名对应k8s集群中的哪个service,然后再根据ingress-controller中的nginx配置模板,生成一段对应的nginx配置。

然后再把该配置动态的写到ingress-controller的pod里,该ingress-controller的pod里面运行着一个nginx服务,控制器会把生成的nginx配置写入到nginx的配置文件中,然后reload一下,使其配置生效。以此来达到域名分配置及动态更新的效果。

四、Ingress 可以解决什么问题?

动态配置服务

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

减少不必要的暴露端口

配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式

五、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:

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

(2)Ingress :

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

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

需要解决了两个问题:

1、动态的配置服务。

2、减少不必要的暴露端口。

基于nginx的ingress controller根据不同的开发公司,又分为两种:
​ 1、k8s社区版的: Ingerss - nginx.
​ 2、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

猜你喜欢

转载自blog.51cto.com/14320361/2472808
k8s