【云原生】k8s之Ingress

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

内容预知

1.Ingress的相关知识 

1.1 Ingress的简介 

 1.2 Ingress 的组成

1.3 Ingress-Nginx的工作原理 

1.4 新生代Ingress-controller Traefik

 Ingress-nginx和Ingress-Traefik的简单对比

 1.5 Ingress的暴露方式

 方式一Deployment+LoadBalancer 模式的 Service

方式二DaemonSet+HostNetwork+nodeSelector

方式三Deployment+NodePort模式的Service

 2. 部署DaemonSet+HostNetwork暴露Ingress

2.1 部署nginx-Ingress-controller 

 1下载官方nginx-Ingress的yaml配置方式

 2如果采用nginx-0.25.0版本需要了解的官方变动更新

2.2 DaemonSet+HostNetwork具体的部署过程 

步骤一下载安放ingress-controller pod及相关资源

步骤二 为node02节点添加标签

 步骤三上传 nginx-ingress-controller 镜像压缩包并且进行加载

步骤四启动 nginx-ingress-controller并检查该pod的运行状况 

​编辑

 步骤五创建 ingress 规则

 (1)创建一个业务pod和svc资源

进行访问测试 

 3.Deployment+NodePort模式的Service

3.1 部署Deployment+NodePort模式的Service

步骤一下载相关的ingress和service-nodeport模板

 步骤二直接启动官方模板即可使用

3.2 进行Ingress Http代理访问的操作演示

3.3 Ingress HTTP 代理访问虚拟主机 

 1设置虚拟主机1资源

 (2)创建虚拟主机2资源

(3) 创建ingress资源

客户机进行测试访问

 3.4 Ingress  HTTPS 代理访问 

1创建ssl证书进行secret资源存储 

 2创建 deployment、Service、Ingress Yaml 资源

3.5  ingress设置pod业务nginxBasicAuth认证

1生成用户密码认证文件创建 secret 资源进行存储 

 2创建Ingress资源

3创建pod和service资源

 3.6 Ingress中设置nginx重写

1重写到的资源创建 

 2重写ingress资源的编辑

进行客户机访问测试 

 总结


1.Ingress的相关知识 

1.1 Ingress的简介 

 

service的作用体现在两个方面对集群内部它不断跟踪pod的变化更新endpoint中对应pod的对象提供了ip不断变化的pod的服务发现机制对集群外部他类似负载均衡器可以在集群内外部对pod进行访问。

在Kubernetes中Pod的IP地址和service的ClusterIP仅可以在集群网络内部使用对于集群外的应用是不可见的。为了使外部的应用能够访问集群内的服务Kubernetes目前提供了以下几种方案
●NodePort将service暴露在节点网络上NodePort背后就是Kube-ProxyKube-Proxy是沟通service网络、Pod网络和节点网络的桥梁。
测试环境使用还行当有几十上百的服务在集群中运行时NodePort的端口管理就是个灾难。因为每个端口只能是一种服务默认端口范围只能是 30000-32767。

●LoadBalancer通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置 Service 的场景。 受限于云平台且通常在云平台部署LoadBalancer还需要额外的费用。
在service提交后Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务并且把被代理的Pod的IP地址配置给负载均衡服务做后端。

●externalIPsservice允许为其分配外部IP如果外部IP路由到集群中一个或多个Node上Service会被暴露给这些externalIPs。通过外部IP进入到集群的流量将会被路由到Service的Endpoint上。 

●Ingress只需一个或者少量的公网IP和LB即可同时将多个HTTP服务暴露到外网七层反向代理。
可以简单理解为service的service它其实就是一组基于域名和URL路径把用户的请求转发到一个或多个service的规则。

 

 1.2 Ingress 的组成

 ●ingress
ingress是一个API对象通过yaml文件来配置ingress对象的作用是定义请求如何转发到service的规则可以理解为配置模板。
ingress通过http或https暴露集群内部service给service提供外部URL、负载均衡、SSL/TLS能力以及基于域名的反向代理。ingress要依靠 ingress-controller 来具体实现以上功能。

●ingress-controller
ingress-controller是具体实现反向代理及负载均衡的程序对ingress定义的规则进行解析根据配置的规则来实现请求转发。
ingress-controller并不是k8s自带的组件实际上ingress-controller只是一个统称用户可以选择不同的ingress-controller实现目前由k8s维护的ingress-controller只有google云的GCE与ingress-nginx两个其他还有很多第三方维护的ingress-controller具体可以参考官方文档。但是不管哪一种ingress-controller实现的机制都大同小异只是在具体配置上有差异。
一般来说ingress-controller的形式都是一个pod里面跑着daemon程序和反向代理程序。daemon负责不断监控集群的变化根据 ingress对象生成配置并应用新配置到反向代理比如ingress-nginx就是动态生成nginx配置动态更新upstream并在需要的时候reload程序应用新配置。为了方便后面的例子都以k8s官方维护的ingress-nginx为例。

 

 Ingress-Nginx github 地址https://github.com/kubernetes/ingress-nginx
Ingress-Nginx 官方网站https://kubernetes.github.io/ingress-nginx/

 

1.3 Ingress-Nginx的工作原理 

 

 1ingress-controller通过和 kubernetes APIServer 交互动态的去感知集群中ingress规则            变化。
2然后读取它按照自定义的规则规则就是写明了哪个域名对应哪个service生成一段                  nginx配置。
3再写到nginx-ingress-controller的pod里这个ingress-controller的pod里运行着一个                Nginx服务控制器会把生成的 nginx配置写入 /etc/nginx.conf文件中。
4然后reload一下使配置生效。以此达到域名区分配置和动态更新的作用。

 

 

1.4 新生代Ingress-controller Traefik

Traefik是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理、负载均衡工具。 它支持多种后台 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 来自动化、动态的应用它的配置文件设置。 

 Ingress-nginx和Ingress-Traefik的简单对比

ingress-nginx

使用nginx作为前端负载均衡通过ingress controller不断的和kubernetes api交互实时获取后端servicepod等的变化然后动态更新nginx配置并刷新使配置生效达到服务发现的目的。 

 Ingress-traefik:

traefik本身设计的就能够实时跟kubernetes api交互感知后端servicepod等的变化自动更新配置并重载。相对来说traefik更快速方便同时支持更多的特性使反向代理负载均衡更直接更便捷。GO语言编写的原生支持K8S等云原生应用兼容性更好但并发能力是 ingress-nginx 的6成

 

 

 1.5 Ingress的暴露方式

 

 方式一Deployment+LoadBalancer 模式的 Service

 


如果要把ingress部署在公有云那用这种方式比较合适。用Deployment部署ingress-controller创建一个 type为 LoadBalancer 的 service 关联这组 pod。大部分公有云都会为 LoadBalancer 的 service 自动创建一个负载均衡器通常还绑定了公网地址。 只要把域名解析指向该地址就实现了集群服务的对外暴露

eg以阿里云为例 

 

方式二DaemonSet+HostNetwork+nodeSelector

 
用DaemonSet结合nodeselector来部署ingress-controller到特定的node上然后使用HostNetwork直接把该pod与宿主机node的网络打通直接使用宿主机的80/433端口就能访问服务。这时ingress-controller所在的node机器就很类似传统架构的边缘节点比如机房入口的nginx服务器。该方式整个请求链路最简单性能相对NodePort模式更好。缺点是由于直接利用宿主机节点的网络和端口一个node只能部署一个ingress-controller pod。 比较适合大并发的生产环境使用。

 

 

方式三Deployment+NodePort模式的Service

 
同样用deployment模式部署ingress-controller并创建对应的service但是type为NodePort。这样ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口一般会在前面再搭建一套负载均衡器来转发请求。该方式一般用于宿主机是相对固定的环境ip地址不变的场景。
NodePort方式暴露ingress虽然简单方便但是NodePort多了一层NAT在请求量级很大时可能对性能会有一定影响。

 

 2. 部署DaemonSet+HostNetwork暴露Ingress

 

2.1 部署nginx-Ingress-controller 

 

 1下载官方nginx-Ingress的yaml配置方式

 

#mandatory.yaml文件中包含了很多资源的创建包括namespace、ConfigMap、roleServiceAccount等等所有部署ingress-controller需要的资源。

官方下载地址
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.25.0/deploy/static/mandatory.yaml

上面可能无法下载可用国内的 gitee
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.25.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

 

 2如果采用nginx-0.25.0版本需要了解的官方变动更新

 

vim mandatory.yaml
......
apiVersion: rbac.authorization.k8s.io/v1beta1
#RBAC相关资源从1.17版本开始改用rbac.authorization.k8s.io/v1rbac.authorization.k8s.io/v1beta1在1.22版本即将弃用
kind: ClusterRole
metadata:
  name: nginx-ingress-clusterrole
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
rules:
  - apiGroups:
      - ""
    resources:
      - configmaps
      - endpoints
      - nodes
      - pods
      - secrets
    verbs:
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - nodes
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - services
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - "extensions"
      - "networking.k8s.io"    # 0.25版本增加 networking.k8s.io Ingress 资源的 api 
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - ""
    resources:
      - events
    verbs:
      - create
      - patch
  - apiGroups:
      - "extensions"
      - "networking.k8s.io"   # 0.25版本增加 networking.k8s.io/v1 Ingress 资源的 api 
    resources:
      - ingresses/status
    verbs:
      - update

2.2 DaemonSet+HostNetwork具体的部署过程 

 

步骤一下载安放ingress-controller pod及相关资源

 

mkdir /opt/ingress
cd /opt/ingress

#这里为了方便我们直接采用nginx-0.30.0的版本.如果是nginx-0.25.0可以按照上面的方式进行修改
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

 

 

步骤二 为node02节点添加标签

 

这一步的做法是因为 DaemonSet控制器配置时会为每个node节点部署一个pod节点这里我只想做一个ingress-controller

#指定 nginx-ingress-controller 运行在 node02 节点
kubectl label node node02 ingress=true
kubectl get nodes --show-labels

#修改 Deployment 为 DaemonSet 指定节点运行并开启 hostNetwork 网络。通过标签选择器指定pod在node02上

vim mandatory.yaml
...
apiVersion: apps/v1
# 修改 kind
# kind: Deployment
kind: DaemonSet
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
# 删除Replicas
# replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      # 使用主机网络
      hostNetwork: true
      # 选择节点运行
      nodeSelector:
        ingress: "true"
      serviceAccountName: nginx-ingress-serviceaccount
......

 

 

 

 步骤三上传 nginx-ingress-controller 镜像压缩包并且进行加载

 

#在所有 node 节点上传 nginx-ingress-controller 镜像压缩包 ingree.contro.tar.gz 到 /opt/ingress 目录并解压和加载镜像

#在master节点上上传镜像压缩包
cd /opt/ingress
tar zxvf ingree.contro.tar.gz

#通过scp将镜像包传送到其他节点
scp ingree.contro.tar root@192.168.73.106:/root
scp ingree.contro.tar root@192.168.73.107:/root

#所有节点加载镜像包
docker load -i ingree.contro.tar

 

 

步骤四启动 nginx-ingress-controller并检查该pod的运行状况 

 

kubectl apply -f mandatory.yaml

//nginx-ingress-controller 已经运行 node02 节点
kubectl get pod -n ingress-nginx -o wide


kubectl get cm,daemonset -n ingress-nginx -o wide


//到 node02 节点查看
netstat -lntp | grep nginx
  

由于配置了 hostnetworknginx 已经在 node 主机本地监听 80/443/8181 端口。其中 8181 是 nginx-controller 默认配置的一个 default backendIngress 资源没有匹配的 rule 对象时流量就会被导向这个 default backend。
这样只要访问 node 主机有公网 IP就可以直接映射域名来对外网暴露服务了。如果要 nginx 高可用的话可以在多个 node
上部署并在前面再搭建一套 LVS+keepalived 做负载均衡。

 

 

 步骤五创建 ingress 规则

 (1)创建一个业务pod和svc资源

 

vim service-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app-svc
spec:
  type: ClusterIP
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
    app: nginx


kubectl apply -f service-nginx.yaml

(2)创建Ingress资源 

 

//创建 ingress
#方法一extensions/v1beta1 Ingress 在1.22版本即将弃用
vim ingress-app.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-app-ingress
spec:
  rules:
  - host: www.test.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-app-svc
          servicePort: 80

#方法二
vim ingress-app.yaml	  
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-app-ingress
spec:
  rules:
  - host: www.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-app-svc
            port:
              number: 80




kubectl apply -f ingress-app.yaml

 

 

进行访问测试 

#选择一台客户机直接添加node02的节点的IP与pod的域名进行映射
vim /etc/hosts
192.168.73.107 www.test.com

curl www.test.com

 

 

#进入到ingress控制器的pod中
kubectl exec -it nginx-ingress-controller-mvgn9 -n ingress-nginx /bin/bash
less /ect/nginx/nginx.conf

//可以看到从 start server www.kgc.com 到 end server www.kgc.com 之间包含了此域名用于反向代理的配置

 

 

 3.Deployment+NodePort模式的Service

3.1 部署Deployment+NodePort模式的Service

  如果做了上一个操作就将所有的yaml文件通过delete进行清除。继续下面的操作 

 

步骤一下载相关的ingress和service-nodeport模板

mkdir /opt/ingress/test
cd /opt/ingress/test
#官方下载地址
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

#国内 gitee 资源地址
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

#在所有 node 节点上传镜像包 ingress-controller-0.30.0.tar 到 /opt/ingress-nodeport 目录并加载镜像
docker load -i ingress-controller-0.30.0.tar

 步骤二直接启动官方模板即可使用

 

kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml



#//如果K8S Pod 调度失败在 kubectl describe pod资源时显示
Warning  FailedScheduling  18s (x2 over 18s)  default-scheduler  0/2 nodes are available: 2 node(s) didn't match node selector

解决方案
1. 给需要调度的node加上对应标签
# 相对上面这个Yaml文件的例子
kubectl label nodes node_name kubernetes.io/os=linux

2. 删除Yaml文件中的nodeSelector如果对节点没有要求的话直接删除节点选择器即可

 

 

kubectl get svc,pod -n ingress-nginx

 

 

3.2 进行Ingress Http代理访问的操作演示

 

#创建 deployment、Service、Ingress Yaml 资源
vim ingress-nginx.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-test
spec:
  rules:
  - host: www.test.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: nginx-svc
            port:
              number: 80
	
-------------------------------------------------------------------------------------------
#host 主机名可以是精确匹配或者使用通配符来匹配但通配符仅覆盖一个 DNS 标签例如 *.foo.com 不匹配 baz.bar.foo.com。

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

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

●Prefix基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写。如果路径的最后一个元素是请求路径中最后一个元素的子字符串则不会匹配 例如/foo/bar 匹配 /foo/bar/baz, 但不匹配 /foo/barbaz。

具体可详见https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#the-ingress-resource
-------------------------------------------------------------------------------------------


kubectl apply -f ingress-nginx.yaml

 

 

 

 客户机进行访问测试 

 

 

 

3.3 Ingress HTTP 代理访问虚拟主机 

 我们知道nginx和apache能够设置三种虚拟主机分别为基于IP基于域名基于端口。同样ingress-nginx这里也可以设置出这三种虚拟主机。下面将以最常用的基于域名的虚拟主机为例子进行操作演示

 

 1设置虚拟主机1资源

vim deployment1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment1
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx1
  template:
    metadata:
      labels:
        name: nginx1
    spec:
      containers:
        - name: nginx1
          image: nginx:1.14
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx1
	
	
kubectl apply -f deployment1.yaml

 

 (2)创建虚拟主机2资源

vim deployment2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment2
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx2
  template:
    metadata:
      labels:
        name: nginx2
    spec:
      containers:
        - name: nginx2
          image: nginx:1.14
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx2


kubectl apply -f deployment2.yaml

 

(3) 创建ingress资源

 

vim ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
spec:
  rules:
    - host: www.test.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service: 
              name: svc-1
              port:
                number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress2
spec:
  rules:
    - host: www.abc.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service: 
              name: svc-2
              port:
                number: 80


kubectl apply -f ingress-nginx.yaml

 

 

 

客户机进行测试访问

 

vim /etc/hosts
#这里任意填写一个node节点的IP即可
192.168.73.107 www.test.com www.abc.com   

 

 

 3.4 Ingress  HTTPS 代理访问 

 

1创建ssl证书进行secret资源存储 

 

#yum安装openssl
yum install -y openssl

#创建ssl证书
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"

#创建 secret 资源进行存储
kubectl create secret tls tls-secret --key=tls.key --cert=tls.crt

 

 

 2创建 deployment、Service、Ingress Yaml 资源

vim ingress-https.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-https
spec:
  tls:
    - hosts:
      - www.asd.com
      secretName: tls-secret
  rules:
    - host: www.asd.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service: 
              name: nginx-svc
              port:
                number: 80


kubectl apply -f ingress-https.yaml

 

进行客户机测试

 

vim /etc/hosts
192.168.73.107 www.asd.com

 

 

3.5  ingress设置pod业务nginxBasicAuth认证

 

1生成用户密码认证文件创建 secret 资源进行存储 

 

#生成用户密码认证文件创建 secret 资源进行存储
yum -y install httpd-tools
htpasswd -c auth zhangsan			#认证文件名必须为 auth
kubectl create secret generic basic-auth --from-file=auth

 

 

 2创建Ingress资源

 

vim ingress-auth.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-auth
  annotations:
    #设置认证类型basic
    nginx.ingress.kubernetes.io/auth-type: basic
	#设置secret资源名称basic-auth
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
	#设置认证窗口提示信息
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - zhangsan'
spec:
  rules:
  - host: www.asd.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: nginx-svc
            port:
              number: 80

3创建pod和service资源

 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx

 

 

 进行客户机访问测试


 

 3.6 Ingress中设置nginx重写

 

kubectl explain Ingress.metadata.annotations 

 

 #metadata.annotations 配置说明

  • nginx.ingress.kubernetes.io/rewrite-target: <字符串> #必须重定向流量的目标URI
  • nginx.ingress.kubernetes.io/ssl-redirect: <布尔值> #指示位置部分是否仅可访问SSL(当Ingress包含证书时默认为true)
  • nginx.ingress.kubernetes.io/force-ssl-redirect: <布尔值> #即使Ingress未启用TLS也强制重定向到HTTPS
  • nginx.ingress.kubernetes.io/app-root: <字符串> #定义Controller必须重定向的应用程序根如果它在'/'上下文中
  • nginx.ingress.kubernetes.io/use-regex: <布尔值> #指示Ingress上定义的路径是否使用正则表达式

 

 

进行demo演示

我们添加一个http的pod和svc资源ingresswww.asd.com。然后进行重写ingress的编写

1重写到的资源创建 

 

vim ingress-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
spec:
  replicas: 1
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    name: nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-test
spec:
  rules:
  - host: www.asd.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port:
              number: 80


kubectl apply -f  ingress-nginx.yaml

 

 2重写ingress资源的编辑

vim write-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-rewrite
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: http://www.asd.com:31019
spec:
  rules:
  - host: www.write.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
		  #由于www.rewrite.com只是用于跳转不需要真实站点存在因此svc资源名称可随意定义
          service: 
            name: nginx-svc
            port:
              number: 80


kubectl apply -f write-ingress.yaml

 

进行客户机访问测试 

 

#在客户机中添加映射
echo "192.168.73.107 www.write.com">>/etc/hosts

 

 

 

 总结

 

ingress的使用
DaemonSet + host网络模式 部署ingress-controller
客户端(防火墙前端负载均衡器) -> Node节点的80或443端口ingress-controllerhost网络模式下节点主机与Pod共享网络命名空间 -> 业务Pod的Service -> 业务Pod

Deployment + Service(NodePort) 部署
客户端(防火墙前端负载均衡器) -> ingress-controller的ServiceNodeIP:NodePort -> ingress-controller以Pod形式运行 -> 业务Pod的Service -> 业务Pod

ingress的配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: 资源名称
spec:
  rules:
  - host: 域名可以精确匹配或通配符匹配比如 *.kgc.com 可以匹配www.kgc.com或mail.kgc.com等但不能匹配ky22.www.kgc.com
    http:
      paths:
      - path: 域名后的URL路径比如 / 代表网页根路径或者 /test
        pathType: Prefix|ExactExact用于精确匹配URL路径Prefix用于前缀匹配且只能匹配完整的字符串/test/abc能匹配/test/abc/123但不能匹配/test/abc123
        backend:
          service:
            name: 指定SVC的名称
            port:
              number: 指定SVC的端口

基于 域名 的代理转发
spec:
  rules:
  - host: 域名1
    http:
    ....
	
  - host: 域名2
    http:
    ....
	
基于 URL路径 的代理转发
spec:
  rules:
  - host:
    http:
      paths:
      - path: URL路径1
	    ....
		
      - path: URL路径2
	    ....
		
https 代理转发
先签发 TLS 证书 和 私钥文件
创建 tls 类型的 Secret 资源把证书和私钥信息保存到 Secret 资源中
创建 ingress 资源调用 tls 类型的 Secret 资源
spec:
  tls:
  - hosts:
    - 指定使用https的域名
    secretName: 指定tls_Secret资源名称
  rules:
    ....
	
	
basic-auth 访问认证
创建 Opaque 类型的 Secret 资源把basic认证文件内容保存到 Secret 资源中
创建 ingress 资源
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: 指定保存basic认证文件内容的Secret资源
    nginx.ingress.kubernetes.io/auth-realm: '指定提示信息'


rewrite 重写
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: 指定要跳转的目标域名或URL路径
	                                            http|https://<域名>:<ingress-controller的svc端口>
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s