【k8s学习】NGINX Ingress Controller安装以及项目演示

2,191 阅读4分钟

【前置文章】

【环境】

  • 环境:MacOS
  • Minikube version: v1.25.2 (minikube start --vm-driver=hyperkit,使用的是hyperkit驱动)

1. 介绍

参考:docs.nginx.com/nginx-ingre…

1. Ingress组件 vs Service组件

通常情况下,k8s中的服务需要暴露给集群外部,可以通过以下几种方式:

  • a. 通过Ingress组件,(官网文档),一般正式环境会选用这种方式。
  • b. 通过Service组件,有几种方式,具体可以参考我之前的文章:www.jianshu.com/p/36978c9d8…
    • NodePort Service
    • LoadBalancer Service
    • ClusterIP Service使用externalIPs对外暴露服务

1.2 Ingress vs Ingress Controller

我们都知道,除了安装Ingress组件之外,我们还需要一个Ingress的实现(Implementation),这个实现就是Ingress Controller,Ingress Controller也是运行在Pod中的,即我们可以创建一个Pod,叫Ingress Controller Pod。

Ingress Controller是干什么的?它是用来解析上述Ingress yaml中的rules规则的,即需要怎样的跳转。(如一级域名,二级域名等等,诸如此类的跳转规则的实现)。

1.3 Ingress Controller版本

关于Ingress Controller,目前就很多种:

  • 社区版本,即Ingress NGINX Controller,是Kubernetes下的基于NGINX开发的一个Ingress controller。
  • NGINX版本,即 NGINX Ingress Controller,是NGINX团队开发的,目前分两个版本:
    • 开源版本【本文用的就是这个开源版本】
    • NGINX Plus版本,即商业版,功能更为丰富。

1.4 NGINX Ingress Controller工作图解

这块官网介绍的挺好的,详见:docs.nginx.com/nginx-ingre…

图来源官网: image.png

1.5 NGINX Ingress Controller 资源

2. 通过helm chart 安装 NGINX Ingress Controller

参考:docs.nginx.com/nginx-ingre…

2.1 Helm Repository

helm repo add nginx-stable helm.nginx.com/stable

image.png

helm repo update

2.2 安装Helm chart

helm install my-release nginx-stable/nginx-ingress --set enableSnippets=true

image.png

安装成功: image.png

可以看到安装了:

  • pod:my-release-nginx-ingress
  • service:my-release-nginx-ingress,类型为LoadBalancer,即可以从集群外部访问,我们看到EXTERNAL-IP为<pending>,参考了别的文章,应该是因为装在Minikube中的原因,可以执行命令:minikube tunnel,执行完命令,External-IP 很快就会出现:

image.png

2.3 除了pod和service,还安装了其它资源:

介绍:docs.nginx.com/nginx-ingre…

ConfigMap和secret: image.png

Resource Type=IngressClass:
可以看到Helm chart还为我们装了Ingress Class,如果没有IngressClass资源,那么Ingress Controller将失效。

image.png

3. 安装两个项目用于测试

3.1 安装两个项目

在第2章我们安装了NGINX Ingress Controller,下面我们尝试集成两个app来进行测试。

  • app1=nginx1 context-path=/nginx1,有个api=/version,返回 "hello Nginx_1.0"。
  • app2=nginx2 context-path=/nginx2,有个api=/version,返回 "hello Nginx_2.0"。

编写基本的deployment.xml和service.xml(这里略)。

可以看到app1安装: image.png

可以看到app2安装: image.png

总结下pod和service的安装情况: 未命名文件 (1).png

3.2 编写Ingress

创建ingress.yaml:

  • 在这里我们需要指定ingressClassName = nginx
    1.18及以后版本需要通过ingressClassName指定使用的controller,或者在ingressClass中设置默认controller,否则ingress不生效。
    这里的值为nginx,可以参考
  • 这里定义了host=testnginx.com.abc
  • 定义了两个path规则:
    • url以/nginx1/开头的 --> 转发到nginx1-service上。
    • url以/nginx2/开头的 --> 转发到nginx2-service上。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
spec:
  ingressClassName: nginx
  rules:
    - host: testnginx.com.abc
      http:
        paths:
          - path: /nginx1/
            pathType: Prefix
            backend:
              service:
                name: nginx1-service
                port:
                  number: 8080
          - path: /nginx2/
            pathType: Prefix
            backend:
              service:
                name: nginx2-service
                port:
                  number: 8080

安装:

kubectl apply -f ingress.yaml

image.png

3.3 修改hosts

我这里是MacOS的方式,如果是windows,去百度查下。

sudo vim /etc/hosts

在内容中追加:

10.109.65.41    testnginx.com.abc

这里的ip是上述第2章: my-release-nginx-ingress service的external ip。

3.4 测试:

转发成功: image.png

4. 查看nginx-ingress pod配置

4.1 进入pod

kubectl exec -it {nginx-ingress-pod} bash

4.2 查看核心配置nginx.conf

进入容器后,在/etc/nginx下有nginx.conf文件: image.png

可以看到文件include了其它的config: image.png

进入/etc/nginx/conf.d 目录后,查看default-test-ingress.conf,可以看到nginx1和nginx2的相关配置: image.png

可以看到更为详细的配置,这个跟我们平常的nginx配置几乎一样了: image.png

5. 通过 nginx.org/location-snippets 增加Header

需求,上述的nginx1和nginx2,我们希望在NGINX中加上一些header,比如如果是传统的nginx,我们可以在nginx.conf中配置:

location / {         
    proxy_set_header X-Real-IP $remote_addr;         
}

那么怎么在NGINX Ingress Controller中配置呢?

参考:docs.nginx.com/nginx-ingre…

5.1 首先要开启Snippets功能

我们在第2章通过 helm 安装pod = my-release-nginx-ingress的时候,默认情况下,snippets是false。

【怎么知道是false呢?有两种方法:】

  • a. 通过helm show values可以看下需要安装的values文件,导出到本地:

helm show values nginx-stable/nginx-ingress > ./nginx-ingress-helm-value.yaml

controller:
    enableSnippets: false

  • c. 我们在第2章已经安装了pod my-release-nginx-ingress-xxxx,我们可以通过kubectl describe {pod name}来查看配置:

    image.png

【如何开启?】
我们在第2章通过 helm 安装,可以指定增加values:

helm install my-release nginx-stable/nginx-ingress --set controller.enableSnippets=true

ps. 重新安装后,记得改下hosts里的ip,可能会不一样了。

【检查配置:】

kubectl describe pod my-release-nginx-ingress-6697bbfb89-4w6w4

可以看到已经改为true了: image.png

5.2 在我们的nginx1和nginx2中增加测试API

加上API:

@GetMapping("request/x-real-ip")
public String realIP(HttpServletRequest request) {
    return request.getHeader("X-Real-IP");
}

5.3 在ingress.yaml中增加header配置

【重要】传统的nginx.conf的内容,可以通过annotations的方式加上,详细如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.org/location-snippets: |
      proxy_set_header X-Real-IP $remote_addr;
spec:
  ingressClassName: nginx
  rules:
      // 

重新安装:

kubectl apply -f ingress.yaml

5.4 测试

可以看到header被成功加上了: image.png


参考: