[云原生] K8s之ingress

这篇具有很好参考价值的文章主要介绍了[云原生] K8s之ingress。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.Ingress的相关知识 

1.1 Ingress的简介 

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

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

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

●externalIPs:service允许为其分配外部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 地址:GitHub - kubernetes/ingress-nginx: Ingress-NGINX Controller for Kubernetes
Ingress-Nginx 官方网站:Welcome - Ingress-Nginx Controller

1.3 Ingress-Nginx的工作原理 

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

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

1.4 新生代Ingress-controller (Traefik)

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

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

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

ingress-nginx

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

 Ingress-traefik:

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

 1.5 Ingress的暴露方式

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

eg:以阿里云为例 

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

方式二:DaemonSet+HostNetwork+nodeSelector

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

 implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

方式三:Deployment+NodePort模式的Service

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

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 2. 部署DaemonSet+HostNetwork暴露Ingress

2.1 部署nginx-Ingress-controller 

 (1)下载官方nginx-Ingress的yaml配置方式
#mandatory.yaml文件中包含了很多资源的创建,包括namespace、ConfigMap、role,ServiceAccount等等所有部署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)修改配置文件

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

应该是 hostNetwork: true 

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

2.2 DaemonSet+HostNetwork具体的部署过程 

指定 nginx-ingress-controller 运行在 node02 节点

步骤一:启动 nginx-ingress-controller
kubectl apply -f deploy.yaml
kubectl get pod -n ingress-nginx -owide
到 node02 节点查看
netstat -lntp | grep nginx

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

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

步骤二: 创建 ingress 规则
//创建一个 deploy 和 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
          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


//创建 ingress
kubectl get ingressclasses
NAME    CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       22m

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

-------------------------------------------------------------------------------------------
ingressClassName 指定 IngressClass,用来指定选择的 Ingress Controller

host 主机名可以是精确匹配,或者使用通配符来匹配,但通配符仅覆盖一个 DNS 标签(例如 *.foo.com 不匹配 baz.bar.foo.com)。

pathType 支持的路径类型有三种:
●Exact:精确匹配 URL 路径,且区分大小写。

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

●ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理。
具体可详见:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#the-ingress-resource

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

kubectl apply -f service-nginx.yaml
kubectl apply -f ingress-app.yaml

kubectl get pods
kubectl get ingress

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

步骤四:测试访问
//本地 host 添加域名解析
vim /etc/hosts

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 步骤五:查看 nginx-ingress-controller
kubectl get pod -n ingress-nginx -o wide
kubectl exec -it nginx-ingress-controller-99h72 -n ingress-nginx /bin/bash
 # more /etc/nginx/nginx.conf
//可以看到从 start server www.kgc.com 到 end server www.kgc.com 之间包含了此域名用于反向代理的配置

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 3.Deployment+NodePort模式的Service

3.1 部署Deployment+NodePort模式的Service

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

步骤一:下载相关的ingress和service-nodeport模板
1、下载 nginx-ingress-controller 配置文件
mkdir /opt/ingress-nodeport
cd /opt/ingress-nodeport

官方下载地址:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml

上面可能无法下载,可用国内的 gitee
wget https://gitee.com/mirrors/ingress-nginx/raw/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml

修改镜像地址为:
image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.3.0@sha256:d1707ca76d3b044ab8a28277a2466a02100ee9f58a86af1535a3edf9323ea1b5

image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1@sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660

2、修改配置文件
apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.3.0
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  #externalTrafficPolicy: Local      #注释此行,值为Cluster表示流量可以转发到其他节点上的Pod;Local表示:流量只发给本机的Pod
  ports:
  ......
  type: NodePort     #Service类型设置为 NodePort 或 LoadBalancer

 步骤二:直接启动官方模板即可使用
3、启动 nginx-ingress-controller
kubectl apply -f deploy.yaml

kubectl get pod,svc -n ingress-nginx

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

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
          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:
  ingressClassName: "nginx"
  rules:
  - host: www.benet.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: nginx-svc
            port:
              number: 80
	


kubectl apply -f ingress-nginx.yaml

kubectl get svc,pods -o wide

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

kubectl exec -it pod/nginx-app-65d7b99f6b-l4g65 bash
 # cd /usr/share/nginx/html/
 # echo 'this is web1' >> index.html 

kubectl exec -it pod/nginx-app-65d7b99f6b-zcqgp bash
 # cd /usr/share/nginx/html/
 # echo 'this is web2' >> index.html

#测试访问
curl 10.96.212.214

kubectl get svc -n ingress-nginx
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx   NodePort   10.96.67.119   <none>        80:32383/TCP,443:32133/TCP   59m

#本地 host 添加域名解析
vim /etc/hosts
192.168.80.10 master
192.168.80.11 node01
192.168.80.12 node02
192.168.80.12 www.kgc.com www.benet.com

#外部访问
curl http://www.benet.com:32383

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

3.3 Ingress HTTP 代理访问虚拟主机 

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

 (1)设置虚拟主机1资源
mkdir /opt/ingress-nodeport/vhost
cd /opt/ingress-nodeport/vhost
vim deployment1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment1
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx1
  template:
    metadata:
      labels:
        name: nginx1
    spec:
      containers:
        - name: nginx1
          image: soscscs/myapp:v1
          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

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 (2)创建虚拟主机2资源
vim deployment2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment2
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx2
  template:
    metadata:
      labels:
        name: nginx2
    spec:
      containers:
        - name: nginx2
          image: soscscs/myapp:v2
          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

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

(3) 创建ingress资源
vim ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
spec:
  ingressClassName: "nginx"
  rules:
    - host: www1.kgc.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:
  ingressClassName: "nginx"
  rules:
    - host: www2.kgc.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service: 
              name: svc-2
              port:
                number: 80


kubectl apply -f ingress-nginx.yaml

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

客户机进行测试访问
vim /etc/hosts
kubectl get svc -n ingress-nginx
curl www1.kgc.com:39993
curl www2.kgc.com:39993

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 3.4 Ingress  HTTPS 代理访问 

mkdir /opt/ingress-nodeport/https
cd /opt/ingress-nodeport/https
(1)创建ssl证书,进行secret资源存储 
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"

kubectl create secret tls tls-secret --key tls.key --cert tls.crt

kubectl get secret

kubectl describe secret tls-secret

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 (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
          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:
  ingressClassName: "nginx"
  tls:
    - hosts:
      - www3.kgc.com
      secretName: tls-secret
  rules:
    - host: www3.kgc.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service: 
              name: nginx-svc
              port:
                number: 80


kubectl apply -f ingress-https.yaml

kubectl get svc -n ingress-nginx
implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s (3)访问测试

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 

3.5  ingress设置pod业务nginxBasicAuth认证

mkdir /opt/ingress-nodeport/basic-auth
cd /opt/ingress-nodeport/basic-auth
(1)生成用户密码认证文件,创建 secret 资源进行存储 
yum -y install httpd
htpasswd -c auth zhangsan			#认证文件名必须为 auth
kubectl create secret generic basic-auth --from-file=auth

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 (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:
  ingressClassName: "nginx"
  rules:
  - host: auth.kgc.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: nginx-svc
            port:
              number: 80


kubectl apply -f ingress-auth.yaml

//具体详细设置方法可参考官网https://kubernetes.github.io/ingress-nginx/examples/auth/basic/  

 进行客户机访问测试:

kubectl get svc -n ingress-nginx

echo '192.168.136.100 auth.kgc.com' >> /etc/hosts

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 3.6 Ingress中设置nginx重写

kubectl explain Ingress.metadata.annotations 

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s

 #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资源,ingress(www.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
进行客户机访问测试 
vim ingress-rewrite.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-rewrite
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: http://www1.kgc.com:32383
spec:
  ingressClassName: "nginx"
  rules:
  - host: re.kgc.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
		  #由于re.kgc.com只是用于跳转不需要真实站点存在,因此svc资源名称可随意定义
          service: 
            name: nginx-svc
            port:
              number: 80


kubectl apply -f ingress-rewrite.yaml

implementationspecific lb,k8s,云原生,kubernetes,容器,运维,k8s文章来源地址https://www.toymoban.com/news/detail-848037.html

3.7 金丝雀发布 

基于canary实现金丝雀发布
在新版本应用的ingress资源配置中的metadata.annotations字段添加相关配置
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"               #开启金丝雀发布
    nginx.ingress.kubernetes.io/canary-weight: "50"          #指定流量调度权重,默认总值为100
spec:
  rules:
  - host: 与旧版本应用相同的域名
    http:
	  paths:
	  - path: 与旧版本应用相同的域名URL路径
        backend:
          service:
            name: 新版本应用的Service资源名称
            port:
              number: 新版本应用的Service资源的port端口

 总结

K8S集群外部的客户端访问K8S集群内部的方案?
基于Service实现:NodePort  LoadBalancer  externalIPs   只能支持四层反向代理,如果K8S集群规模较大运行的业务较多时NodePort端口/externalIPs管理成本会很高

基于Ingress实现:支持七层反向代理,可自定义规则根据用户请求的域名或URL路径转发给指定Service进行代理访问


Ingress的组成:
ingress控制器(ingress controller):根据在ingress资源对象配置的规则转发用户请求的组件,以Pod形式运行的

ingress资源对象:设置转发规则,告诉ingress控制器应该根据什么域名或URL路径转发请求给相应的Service资源的endpoints端点(podIP:容器Port)


Ingress的使用:
DaemonSet + host网络模式 部署的ingress控制器
数据流向:客户端 -> 通过node节点的80/433端口进入ingress控制器 -> 根据ingress对象的转发规则 -> 业务Pod的Service -> 通过标签选择器 -> 业务Pod

Deployment + NodePort/LoadBalancer类型的Service 部署的ingress控制器
数据流向:客户端 -> 通过nodeIP:NodePort -> ingress控制器的Service -> ingress控制器 -> 根据ingress对象的转发规则 -> 业务Pod的Service -> 通过标签选择器 -> 业务Pod


创建Ingress资源
kubectl create ingress <ingress资源名称> -n <命名空间> --class=<ingressclass名称> --rule=<域名>/<URL路径>=<service资源名称>:<service的port端口>

Ingress资源配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress资源名称
  namespace: 命名空间
spec:
  ingressClassName: ingressclass名称
  rules:
  - host: 域名
    http:
      paths:
      - path: URL路径
        pathType: Prefix(前缀匹配)|Exact(精准匹配)
        backend:
          service:
            name: Service资源名称
            port:
              number: Service资源的port端口    
  
  #基于不同域名的代理转发
  - host: 域名2
    http:
	  paths:
	  - path: URL路径1
        pathType:
        backend: 
	      ....
	  #基于不同URL路径的代理转发
	  - path: URL路径2
        pathType:
        backend: 
          ....

  #基于https代理转发
  tls:    #与roles字段在同一层级
  - hosts:
    - 指定使用https访问的域名
	....
	secretName: 指定tls类型的secret资源名称

#基于basic-auth实现访问认证
1)使用htpasswd创建用户数据文件,文件名为auth
2)基于auth文件创建secret资源 kubectl create secret generic <secret资源名称> --from-file=auth
3)创建ingress资源,在metadata.annotations字段添加相关配置
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: secret资源名称
    nginx.ingress.kubernetes.io/auth-realm: '认证窗口提示信息'

#基于rewrite实现重写访问路径
在metadata.annotations字段添加相关配置
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: https://www.bbb.com:30443
spec:
  rules:
  - host: www.aaa.com

将任何访问 http://www.aaa.com:30080/XXXX 的请求,都重写成 https://www.bbb.com:30443

metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: https://www.XXX.com:30443/$2
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  rules:
  - host: www.aaa.com
    http:
	  paths:
	  - path: /(.*)
    backend:
	  ....
	  
将任何访问 http://www.aaa.com:30080/XXXX 的请求,都重写成 https://www.bbb.com:30443/XXXX

基于canary实现金丝雀发布
在新版本应用的ingress资源配置中的metadata.annotations字段添加相关配置
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"               #开启金丝雀发布
    nginx.ingress.kubernetes.io/canary-weight: "50"          #指定流量调度权重,默认总值为100
spec:
  rules:
  - host: 与旧版本应用相同的域名
    http:
	  paths:
	  - path: 与旧版本应用相同的域名URL路径
        backend:
          service:
            name: 新版本应用的Service资源名称
            port:
              number: 新版本应用的Service资源的port端口

到了这里,关于[云原生] K8s之ingress的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 云原生Kubernetes:K8S存储卷

    云原生Kubernetes:K8S存储卷

    目录 一、理论 1.存储卷 2.emptyDir 存储卷 3.hostPath卷 4.NFS共享存储 5.PVC 和 PV 6.静态创建PV 7.动态创建PV 二、实验  1.emptyDir 存储卷 2.hostPath卷 3.NFS共享存储 4.静态创建PV 5.动态创建PV 三、问题 1.生成pod一直pending 2.shoumount -e未显示共享目录 3.静态创建pv 报错 4.使用 Deployment 来创建

    2024年02月07日
    浏览(21)
  • 云原生_kubernetes(k8s)介绍

    云原生_kubernetes(k8s)介绍

    目录 一、应用部署方式演变 二、k8s介绍 三、k8s的组件 四、k8s中的概念 五、k8s资源管理方式 1、命令式对象管理 2、命令式对象配置 3、声明式对象配置 在部署应用程序的方式上,主要经历了三个时代: 1 、物理机部署: 互联网早期,会直接将应用程序部署在物理机上 优点

    2023年04月13日
    浏览(57)
  • 云原生Kubernetes:K8S常用服务端口

    目录 一、理论 1.K8S常用服务端口号 (1)K8S集群 表1 K8S集群端口 协议 端口号 K8S集群 TCP 22 使用主机驱动通过SSH进行节点配置 TCP 53 集群DNS服务 UDP 53 集群DNS服务 TCP 2376 主机驱动与Docker守护进程通信的TLS端口 TCP 2379 etcd客户端请求 TCP 2380 etcd节点通信 UDP 8472 Canal/Flannel VXLAN ove

    2024年02月10日
    浏览(25)
  • 【云原生-K8s-1】kubeadm搭建k8s集群(一主两从)完整教程及kubernetes简介

    【云原生-K8s-1】kubeadm搭建k8s集群(一主两从)完整教程及kubernetes简介

    🍁 博主简介   🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊 交流社区: 运维交流社区 欢迎大家的加入!   Kubernetes(简称:k8s) 是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,用于管理云平台中多

    2024年02月07日
    浏览(16)
  • 云原生Kubernetes:K8S配置资源管理

    云原生Kubernetes:K8S配置资源管理

    目录 一、理论 1.Secret 2.Secret创建 3.Secret使用 4.Configmap 5.Configmap创建 6.Configmap使用 二、实验 1.Secret创建 2.Secret使用 3.Configmap创建 4.Configmap使用 三、问题 1.变量引用生成资源报错 2.查看pod日志失败 3.创建configmap报错 4.YAML创建configmap报错 5. 生成资源报错 6.文件挂载pod报错Error 四

    2024年02月07日
    浏览(18)
  • 【云原生K8s】初识Kubernetes的理论基础

    【云原生K8s】初识Kubernetes的理论基础

      K8S由google的Borg系统(博格系统,google内部使用的大规模容器编排工具)作为原型,后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。 云原生基金会(CNCF)于2015年12月成立,隶属于Linux基金会。CNCF孵化的第一个项目就是Kubernetes, 随着容器的广泛使用,Kubernetes已经成为容

    2024年02月14日
    浏览(15)
  • 【云原生、k8s】管理Kubernetes应用搭建与部署

    官方提供Kubernetes部署3种方式 (一)minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用。不能用于生产环境。 官方文档:https://kubernetes.io/docs/setup/minikube/ (二)二进制包 从官方下载发行版的二进制包,手动部署每个组件,

    2024年01月21日
    浏览(62)
  • 【 云原生 kubernetes 】- 使用Filebeat采集k8s日志

    【 云原生 kubernetes 】- 使用Filebeat采集k8s日志

    ⚡️: 日志采集器Logstash其功能虽然强大,但是它依赖java、在数据量大的时候,Logstash进程会消耗过多的系统资源,这将严重影响业务系统的性能,而filebeat就是一个完美的替代者,它基于Go语言没有任何依赖,配置文件简单,格式明了, ​ 用于转发和集中日志数据的轻量级托

    2024年02月12日
    浏览(14)
  • 云原生Kubernetes:K8S集群各组件服务重启

    目录 一、理论 1.各组件服务重启命令 (1)Master节点+Node节点共同服务 (2)Master节点独有服务 (3)Node节点独有服务

    2024年02月03日
    浏览(18)
  • 【云原生 | Kubernetes 系列】K8s 实战 管理 Secret 详解

    【云原生 | Kubernetes 系列】K8s 实战 管理 Secret 详解

    Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在 Pod 规约中或者镜像中。 用户可以创建 Secret,同时系统也创建了一些 Secret。 一个 Secret 可以包含 Pod 访问数据库所需的用户凭证。 例如,由用户名和密码组成的数据库连接字符串。 你可

    2024年02月02日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包