文章目录

  • 一、写在前面
  • 1.1 Ingress参考文档
  • 1.2 Ingress是什么?
  • 1.3 总结(重要)
  • 二、nginx-ingress部署
  • 2.1 部署说明
  • 2.2 部署注意
  • 三、使用Ingress进行代理
  • 3.1 创建一个测试的pod
  • Ingress访问方式1
  • Ingress访问方式2
  • 3.2 Ingress相关介绍
  • 3.3 关于Ingress


一、写在前面

1.1 Ingress参考文档

1.2 Ingress是什么?

1、Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
2、你必须具有 Ingress 控制器 才能满足 Ingress 的要求。 仅创建 Ingress 资源本身没有任何效果。

  • 从上面两句话看出:
    1、Ingress实现nginx类似的功能,主要是用来反向代理Service
    2、Ingress必须选择一个实现,建议使用 nginx-ingress,不然k8s默认是没有Ingress功能的

k8s ingress占用内存高 k8s ingress作用_nginx

1.3 总结(重要)

1、Ingress默认是不实现,官方推荐使用nginx-ingress进行实现,该案例也是使用nginx-ingress

2、Ingress从某种角度来看,就是用来维护nginx的nginx.conf文件

二、nginx-ingress部署

采用 yaml 进行部署

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/baremetal/deploy.yaml

采用 helm 进行部署

helm upgrade --install ingress-nginx ingress-nginx \
  --repo https://kubernetes.github.io/ingress-nginx \
  --namespace ingress-nginx --create-namespace

2.1 部署说明

Ingress实现,我们采用nginx的方式进行实现

因为我是采用IP+NodePort访问Ingress的,所以采用baremetal裸金属进行部署

查看Ingress暴露的端口

[root@mos-mdw-01 ~]# kubectl get svc -n ingress-nginx|grep ingress-nginx
ingress-nginx-controller             NodePort    10.233.6.205    <none>        80:31762/TCP,443:31763/TCP   22h
ingress-nginx-controller-admission   ClusterIP   10.233.56.46    <none>        443/TCP                      22h

可以看出,Ingress的80访问端口为:31762

同时记住 31762 给下文使用。

访问:http://10.51.13.13:30762/

k8s ingress占用内存高 k8s ingress作用_k8s ingress占用内存高_02


从上图看出,Ingress是基于nginx实现的

2.2 部署注意

  • 1、nginx-ingress版本在部署方式存在一定差异,但是对于普通使用者来说,是没有区别的
  • 2、如果有条件,还是推荐使用helm部署,因为helm部署的参数比较多,修改起来也方便
  • 3、如果采用yaml清单的方式进行部署,修改命名空间,或者修改Ingress作用访问,就需要自己去修改。例如增加 --watch-namespace=xxx 来限制 Ingress作用那些命名空间

三、使用Ingress进行代理

3.1 创建一个测试的pod

k8s默认的测试—创建工作负载
kubectl create deployment demo --image=httpd --port=80
k8s默认的测试—创建service
kubectl expose deployment demo

[root@mos-mdw-01 ~]# kubectl get pods
NAME                                      READY   STATUS    RESTARTS   AGE
demo-54ff5d84db-4ksmq                     1/1     Running   0          7m23s
nfs-client-provisioner-6cf5846d5d-2nl6x   1/1     Running   0          28d

Ingress访问方式1

这个时候,我们创建一个Ingress来进行访问
采用域名进行访问

vi demo-ingress.yaml

其中 10.51.13.13 为物理机的地址

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: demo-ingress
spec:
  rules:
    - host: 10.51.13.13.nip.io
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              service:
                name: demo
                port:
                  number: 80

kubectl apply -f demo-ingress.yaml

访问 http://10.51.13.13.nip.io:31762/

k8s ingress占用内存高 k8s ingress作用_k8s ingress占用内存高_03

Ingress访问方式2

或者采用IP+NodePort和上下文的方式进行访问

vi demo-ingress2.yaml

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: demo-ingress2
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - http:
        paths:
          - path: /testpath
            pathType: Prefix
            backend:
              service:
                name: demo
                port:
                  number: 80

kubectl apply -f demo-ingress2.yaml

访问 http://10.51.13.13:31762/testpath

k8s ingress占用内存高 k8s ingress作用_k8s ingress占用内存高_04

3.2 Ingress相关介绍

1、Ingress 规则

可选的 host。在此示例中,未指定 host,因此该规则适用于通过指定 IP 地址的所有入站 HTTP 通信。 如果提供了 host(例如 foo.bar.com),则 rules 适用于该 host。

路径列表 paths(例如,/testpath),每个路径都有一个由 serviceName 和 servicePort 定义的关联后端。 在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容。

2、路径类型

Ingress 中的每个路径都需要有对应的路径类型(Path Type)。未明确设置 pathType 的路径无法通过合法性检查。当前支持的路径类型有三种:

ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理。

Exact:精确匹配 URL 路径,且区分大小写。

Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。

3.3 关于Ingress

Ingress从某种角度来看,就是用来维护nginx的nginx.conf文件。可以实现nginx的反向代理、负载均衡等功能