【kubernetes】k8s集群中的ingress(对外服务)规则详解

目录

一、Ingress 简介   

1.1service的作用  

1.2外部访问方案 (四种)🌹🌹🌹

部署externalIPs

1.3Ingress 是什么

二、Ingress 组成🌹🌹🌹

三、Ingress 工作原理🐱🐱🐱

四、ingress 暴露服务的方式🐱🐱🐱

4.1方式一:Deployment+LoadBalancer 模式的 Service

4.2方式二:DaemonSet+HostNetwork+nodeSelector

4.3方式三:Deployment+NodePort模式的Service

五、部署 nginx-ingress-controller

5.1部署ingress-controller pod及相关资源

5.2修改 ClusterRole 资源配置

🤔​​​​🤔🤔采用DaemonSet+HostNetwork+nodeSelector暴露服务

5.3修改 Deployment 为 DaemonSet ,指定节点运行,并开启 hostNetwork 网络

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

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

5.6启动 nginx-ingress-controller

5.7创建 ingress 规则

创建 ingress

5.8测试访问

5.9查看 nginx-ingress-controller

5.10数据流向

🤔🤔🤔采用Deployment+NodePort模式的Service暴露服务

1.下载 nginx-ingress-controller 和 ingress-nginx 暴露端口配置文件

​2.在所有 node 节点上传镜像包 ingress-controller-0.30.0.tar 到 /opt/ingress-nodeport 目录,并加载镜像

3.启动 nginx-ingress-controller

七、Ingress HTTP 代理访问

7.1创建 deployment、Service、Ingress Yaml 资源

7.2进入容器编辑页面内容

7.3测试访问

7.4数据流向

八、Ingress HTTP 代理访问虚拟主机

8.1创建虚拟主机1资源

8.2创建虚拟主机2资源

8.3创建ingress资源

8.4测试访问

九、Ingress  HTTPS 代理访问 

9.1创建ssl证书

9.2创建 secret 资源进行存储

9.2.1创建Secret资源:

9.2.2获取Secret资源信息:

9.2.3查看Secret资源:

9.3创建 deployment、Service、Ingress Yaml 资源

9.4访问测试

十、Nginx 进行 BasicAuth

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

10.2创建Secret资源

10.3创建Ingress资源

10.4浏览器检测

十一、Nginx重写

11.1 metadata.annotations 配置说明

11.2创建重写Ingress资源

11.3浏览器访问

十二、温故而知新

12.1Ingress数据流向

12.2K8S集群外部的客户端访问K8S集群内部的方案?

12.3基于主机名的虚拟主机

12.4Ingress的组成

12.5创建Ingress资源 

12.6Ingress资源配置 

12.7基于不同域名或者不同URL路径做转发

12.8基于https代理转发 

12.9Rewrite重定向

基于rewrite实现重写访问路径 

12.10基于basic-auth实现访问认证


一、Ingress 简介   

1.1service的作用  

service的作用体现在两个方面:

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

在Kubernetes中,Pod的IP地址和service的ClusterIP仅可以在集群网络内部使用,对于集群外的应用是不可见的。

1.2外部访问方案 (四种)🌹🌹🌹

为了使外部的应用能够访问集群内的服务,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的规则。
部署externalIPs
kubectl create deployment zzz-demo01 --image=soscscs/myapp:v1 --port=80

kubectl expose deployment zzz-demo01  --type=NodePort --port=80 --target-port=80

kubectl get pod,svc -owide

kubectl edit svc zzz-demo01

浏览器也可以访问哦

测试,添加了ip地址,就可以访问了哦

1.3Ingress 是什么

官方文档:Ingress | Kubernetes

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。

Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。

Ingress 提供从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源所定义的规则来控制。

下面是 Ingress 的一个简单示例,可将所有流量都发送到同一 Service:

通过配置,Ingress 可为 Service 提供外部可访问的 URL、对其流量作负载均衡、 终止 SSL/TLS,以及基于名称的虚拟托管等能力。 Ingress 控制器 负责完成 Ingress 的工作,具体实现上通常会使用某个负载均衡器, 不过也可以配置边缘路由器或其他前端来帮助处理流量。

Ingress 不会随意公开端口或协议。 将 HTTP 和 HTTPS 以外的服务开放到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的 Service

二、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-controller才是负责具体转发的组件,通过各种方式将它暴露在集群入口,外部对集群的请求流量会先到 ingress-controller, 而ingress对象是用来告诉ingress-controller该如何转发请求,比如哪些域名、哪些URL要转发到哪些service等等。

官方文档

Ingress-Nginx github 地址:https://github.com/kubernetes/ingress-nginx

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

三、Ingress 工作原理🐱🐱🐱

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

Ingress-Nginx 工作原理
1、ingress-controller通过和apiserver交互,动态感知集群中ingress规则的变化,并读取配置
2、ingress规则中配置了基于域名或者url路径对应的service,ingress-controller读取后自动生成nginx配置信息
3、ingress-controller会将自动生成的nginx配置信息写入pod中,这个ingress-controller实际是运行一个nginx,控制器将配置信息更新到/etc/nginx.conf文件中
4、然后reload重载一下让配置生效。
这就是能够实现ingress通过ingress-controller实现对k8s集群内部的pod访问的原理
后续客户端访问指定域名和指定url路径的时候,请求会转发到nginx-controller控制器的service 然后转发到ingress控制器的pod,pod会将根据ingress的规则转发给相应的service,然后再根据标签选择器转发给业务pod

四、ingress 暴露服务的方式🐱🐱🐱

4.1方式一:Deployment+LoadBalancer 模式的 Service

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

4.2方式二:DaemonSet+HostNetwork+nodeSelector

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

4.3方式三:Deployment+NodePort模式的Service

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

五、部署 nginx-ingress-controller

Nginx Ingress Controller通过API Server获取Ingress资源的变化,动态地生成Load Balancer(例如Nginx)所需的配置文件(例如nginx.conf),然后重新加载Load Balancer(例如执行nginx -s reload重新加载Nginx)来生成新的路由转发规则。

Nginx Ingress Controller可通过配置LoadBalancer类型的Service来创建SLB,因此可以从外部通过SLB访问到Kubernetes集群的内部服务。根据Nginx Ingress配置的不同规则来访问不同的服务

官方文档:

Installation Guide - Ingress-Nginx Controller (kubernetes.github.io)

5.1部署ingress-controller pod及相关资源

创建目录

mkdir /opt/ingress
cd /opt/ingress

下载配置文件

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

#可能会下载不下来

由于官方下载地址可能无法下载,可以使用国内的Gitee镜像来下载所需的YAML配置文件。这里有两个版本的配置文件,一个是nginx-0.25.0,另一个是nginx-0.30.0。可以选择一个版本进行下载

​#上面可能无法下载,可用国内的 gitee

#对于nginx-0.25.0版本:
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.25.0/deploy/static/mandatory.yaml

#对于nginx-0.30.0版本:
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml

确保下载的是最新版本的配置文件,因为新版本可能包含了安全更新和功能改进。如果不确定哪个版本更适合你,可以查看官方文档或者社区讨论来决定。

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

5.2修改 ClusterRole 资源配置

clusterRole用于定义集群中资源的权限

vim mandatory.yaml
......
apiVersion: rbac.authorization.k8s.io/v1beta1
#RBAC相关资源从1.17版本开始改用rbac.authorization.k8s.io/v1,rbac.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

这份 YAML 文件是对 Kubernetes 中的 ClusterRole 资源进行配置的,ClusterRole 用于定义对集群中资源的权限。下面是对该文件中各部分的详细解析:

  • apiVersion:指定 Kubernetes API 的版本,此处使用的是 rbac.authorization.k8s.io/v1beta1 版本,但注释中提到从 1.17 版本开始应改用 rbac.authorization.k8s.io/v1,而 v1beta1 版本将在 1.22 版本后弃用。
  • kind:指定资源的类型,这里是 ClusterRole,表示集群级别的角色。
  • metadata:指定资源的元数据,包括名称和标签等信息。
  • rules:定义了针对不同资源的访问规则。在这里,包含了多个规则,每个规则指定了对一类资源的访问权限。
  • 第一个规则指定了对 ConfigMaps、Endpoints、Nodes、Pods 和 Secrets 等资源的 list 和 watch 权限。

  • 第二个规则指定了对 Nodes 资源的 get 权限。

  • 第三个规则指定了对 Services 资源的 get、list 和 watch 权限。

  • 第四个规则指定了对 Ingress 资源的 get、list 和 watch 权限,其中包括了对 "extensions" 和 "networking.k8s.io" API 组的 Ingress 资源的权限。

  • 第五个规则指定了对 Events 资源的 create 和 patch 权限。

  • 最后一个规则指定了对 Ingress 资源状态的 update 权限,同样包括了 "extensions" 和 "networking.k8s.io" API 组的 Ingress 资源

这些规则定义了该 ClusterRole 在集群中对各种资源的访问权限,以及允许的操作。这样配置的 ClusterRole 可以被绑定到用户、服务账户或者其他身份上,以控制它们对集群资源的访问权限。

此处采用ingress暴露方式方法二:

🤔​​​​🤔🤔采用DaemonSet+HostNetwork+nodeSelector暴露服务

5.3修改 Deployment 为 DaemonSet ,指定节点运行,并开启 hostNetwork 网络

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 的部署方式从 Deployment 修改为 DaemonSet,并且指定它在具有特定标签的节点上运行,同时开启 hostNetwork 模式,你需要对 mandatory.yaml 文件进行以下修改:

  • 修改 kind 为 DaemonSet: 将 kind: Deployment 更改为 kind: DaemonSet。
  • 删除 replicas 字段: DaemonSet 不需要 replicas 字段,因为它会确保 Pod 在每个选定的节点上运行一个实例。
  • 添加 hostNetwork: true: 在 spec.template.spec 下添加 hostNetwork: true,这将使 Pod 使用宿主机的网络命名空间。
  • 添加 nodeSelector: 在 spec.template.spec 下添加 nodeSelector 字段,并设置 ingress: "true",以便 Pod 只在带有 ingress=true 标签的节点上运行。

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

kubectl label nodes node02 nanjing=dataiyang  #这里选择在node02设置标签

kubectl get node --show-labels  #查看标签

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

cd /opt/ingress
tar zxvf ingree.contro.tar.gz
scp ingree.contro.tar node02:/opt

cd /opt
docker load -i ingree.contro.tar 

5.6启动 nginx-ingress-controller

kubectl apply -f mandatory.yaml
kubectl get pods -n ingress-nginx

如果此处是running但是,不是1/1,排错可能是端口占用,去node查看80端口,或者可以查看日志、或详细信息哦

查看详细信息 kubectl describe pod -n ingress-nginx pod名 进行排错

或者查看日志 kubectl logs -n ingress-nginx pod名字 进行排错

nginx-ingress-controller 已经运行 node02 节点

nginx-ingress-controller 已经在 node02 节点上成功运行,并且配置了 hostNetwork,这意味着 nginx 直接在宿主机上监听了 80、443 和 8181 端口。这样,任何对这些端口的请求都会被转发到 nginx-ingress-controller

kubectl get pod -n ingress-nginx -o wide

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

确保所有相关的 ConfigMaps 和 DaemonSet 都已经创建,并且状态正常

确保 nginx-ingress-controller Pod 的状态是 Running,并且 READY 列显示为 1/1,这表示 Pod 已经准备好接收流量。

到 node02 节点查看

在 node02 节点上运行 netstat 命令来验证 nginx 是否在预期的端口上监听。 netstat 的输出,显示了 nginx 在 80、443 和 8181 端口上的监听。

netstat -lntp|grep nginx

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

5.7创建 ingress 规则

创建一个deploy的业务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
          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

本文此处用的yaml文件

kubectl apply -f service-nginx.yaml

如果不写yaml文件,用下图的创建也可以哦

创建 ingress
#方法一:(extensions/v1beta1 Ingress 在1.22版本即将弃用)
vim ingress-app.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-app-ingress
spec:
  rules:
  - host: www.kgc.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.kgc.com
    http:
      paths:
      - path: /
        pathType: Prefix     
        backend:
          service:
            name: nginx-app-svc
            port:
              number: 80

使用方法二:

kubectl apply -f ingress-app.yaml

现在,已经准备好应用 Ingress 规则。在应用 Ingress 规则之前,请确保域名 www.zzz.com 已经正确解析到了运行 nginx-ingress-controller 的节点的公网 IP 地址。如果域名解析还没有设置好,Ingress 规则将无法正常工作,因为外部请求无法正确路由到你的服务。

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

kubectl get pods,svc -owide

kubectl get ingress

5.8测试访问

本地 host 添加域名解析

curl www.zzz.com

5.9查看 nginx-ingress-controller

kubectl get pod -n ingress-nginx -o wide
kubectl exec -it nginx-ingress-controller-brdtd  -n ingress-nginx /bin/bash

more /etc/nginx/nginx.conf

在 Pod 的 Bash shell 中,可以使用 more 或 cat 命令来查看 Nginx 的配置文件。你应该能够看到 www.zzz.com 的配置,这表明 Ingress 规则已经被正确地应用到了 Nginx 的配置中。

如果看到了 www.zzz.com 的配置,这意味着 nginx-ingress-controller 已经根据你创建的 Ingress 规则更新了 Nginx 的配置。现在,当外部请求到达 node02 节点的 80 端口时,它们将被正确地路由到 nginx-app-svc 服务。

回车键可以查看

再添加一个域名:www.nanjing.com

5.10数据流向

DaemonSet+HostNetwork+nodeSelector部署 ingress-controller的数据流向

客户端---->ingress-controller(pod和host共享ip和端口---> 业务应用service----> 业务的应用 pod)

🤔🤔🤔采用Deployment+NodePort模式的Service暴露服务

为了不影响,我们先把上面的删除了,方便我们进行模拟

1.下载 nginx-ingress-controller 和 ingress-nginx 暴露端口配置文件

mkdir /opt/ingress-nodeport
cd /opt/ingress-nodeport

官方下载地址:

官方下载地址:

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 资源地址:

国内 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


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

docker load -i ingree.contro-0.30.0.tar

3.启动 nginx-ingress-controller

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

kubectl describe svc -n ingress-nginx

从输出来看,nginx-ingress-controller Pod 正在 ingress-nginx 命名空间中正常运行,状态为 Running。同时,ingress-nginx 服务是 NodePort 类型,这意味着它在集群的每个节点上都开放了特定的端口(80 端口映射到 32383 端口,443 端口映射到 32133 端口)以供外部访问。

七、Ingress HTTP 代理访问

Ingress HTTP代理访问通常用于在Kubernetes集群中管理入站和出站流量。通过设置Ingress代理,可以实现对集群中部署的服务进行访问控制、负载均衡、SSL终止等功能。 

进入Kubernetes集群中的Ingress相关的目录:/opt/ingress-nodeport

cd /opt/ingress-nodeport

7.1创建 deployment、Service、Ingress Yaml 资源

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app-zzz  #跟之前重复了,修改下名字
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:                #规定了Ingress资源的规格,包括访问规则
  rules:             #定义了访问规则,指定了如何路由到后端服务
  - host: www.a.com  #指定了这条规则适用于主机 www.a.com
    http:            #定义了 HTTP 访问规则
      paths:         # 指定了路径匹配规则
      - path: /              # 表示所有以 / 开头的路径都会匹配到这个规则
        pathType: Prefix     #指定了路径匹配类型为前缀匹配
        backend:             #指定了后端服务的配置
          service:           #定义了后端服务的名称和端口号
            name: nginx-svc  #指定了后端服务的名称为 nginx-svc
            port:
              number: 80

使用vim编辑器创建一个名为ingress-nginx.yaml的YAML文件,该文件包含以下资源的定义:

  • kind: Deployment:名为nginx-app,包含两个Nginx容器副本,监听容器端口80。
  • kind: Service:名为nginx-svc,类型为ClusterIP,端口80,选择器为name=nginx。
  • kind: Ingress:名为nginx-test,配置了一个规则,将访问www.a.com域名的流量转发到nginx-svc服务的端口80。
kubectl apply -f ingress-nginx.yaml 
#查看服务和Pod的状态。输出显示nginx-svc服务已创建,但没有外部IP,两个Nginx Pod正在运行。

kubectl get svc,pod -owide

为了使外部流量能够访问到这个服务,需要确保:

  • Ingress Controller已正确安装并运行。
  • 域名www.a.com已正确解析到Ingress Controller的外部IP地址。
  • 如果在云服务提供商上部署,可能需要配置负载均衡器或网络策略。

7.2进入容器编辑页面内容

7.3测试访问

#获取Service信息
kubectl get svc -n ingress-nginx
#使用kubectl get svc -n ingress-nginx命令获取名为ingress-nginx的Service信息。该Service配置了NodePort类型,监听端口80和443,并且有对应的NodePort(例如,80端口对应的NodePort为30864)

任意node地址添加域名解析:

[root@master01 ingress-nodeport]#vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.246.10 master01
192.168.246.11 node01
192.168.246.12 node02
192.168.246.12 www.zzz.com www.a.com

7.4数据流向

八、Ingress HTTP 代理访问虚拟主机

测试和实践在Kubernetes集群中使用Ingress资源实现同一端口但不同域名的服务路由和负载均衡。具体来说,通过创建两个不同的Service资源,并使用Ingress资源来将不同域名的流量路由到这两个Service上。

mkdir /opt/ingress-nodeport/vhost
cd /opt/ingress-nodeport/vhost
  • 使用mkdir命令创建一个新的目录/opt/ingress-nodeport/vhost。这个目录用于存放虚拟主机的配置文件,如SSL证书、密钥、以及其他与虚拟主机相关的文件。

使用Ingress来配置HTTP代理以访问虚拟主机。通过Ingress资源,您可以定义不同的虚拟主机(host)与后端服务之间的映射关系,从而实现基于虚拟主机的访问控制和路由。

8.1创建虚拟主机1资源

在Kubernetes集群中创建一个名为deployment1的Deployment和一个名为svc-1的Service。

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
  • 在该文件中定义了一个Deployment,名为deployment1,它包含两个Nginx容器的副本,这些容器使用标签name: nginx1进行选择。

  • 容器使用的镜像是soscscs/myapp:v1,并且监听容器端口80。

创建Service资源:

在同一个YAML文件中定义了一个Service,名为svc-1。

  • 该Service配置了一个端口80,用于将外部流量转发到选择器name: nginx1匹配的Pod的80端口。
  • Service类型默认为ClusterIP,这意味着它只能在集群内部访问。
kubectl apply -f deployment1.yaml 

  • 使用kubectl apply -f deployment1.yaml命令将这些配置应用到Kubernetes集群中。

  • 这些资源的创建将允许在集群内部通过svc-1服务访问名为nginx1的Deployment中的Nginx容器

8.2创建虚拟主机2资源

在Kubernetes集群中创建第二个虚拟主机资源,包括一个名为deployment2的Deployment和一个名为svc-2的Service

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 #启动主机2资源

8.3创建ingress资源

vim ingress-nginx.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
spec:
  rules:
    - host: www01.zzz.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: www02.zzz.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: svc-2
              port:
                number: 80
  • 在该文件中定义了两个Ingress资源,ingress1和ingress2。
  • ingress1配置了一个规则,当访问www01.zzz.com时,流量将被路由到名为svc-1的服务的端口80。
  • ingress2配置了一个规则,当访问www02.zzz.com时,流量将被路由到名为svc-2的服务的端口80。
kubectl apply -f ingress-nginx.yaml

kubectl get svc -n ingress-nginx

8.4测试访问

(๑•̀ㅂ•́)و✧ 🤔修改页面的效果,有没有更清晰

九、Ingress  HTTPS 代理访问 

在Kubernetes集群中配置HTTPS代理访问通常涉及以下步骤:

  • 获取或生成SSL/TLS证书和私钥。
  • 将证书和私钥文件放置在集群节点可以访问的位置,例如您刚刚创建的https目录。
  • 创建Ingress资源的YAML配置文件,指定SSL/TLS证书和私钥的位置,以及需要启用HTTPS的虚拟主机规则。

一旦这些步骤完成,就可以使用kubectl apply命令应用Ingress配置,从而启用HTTPS代理访问。这将允许外部用户通过安全的HTTPS连接访问您的服务。

mkdir /opt/ingress-nodeport/https
cd /opt/ingress-nodeport/https

使用mkdir命令在/opt/ingress-nodeport路径下创建一个新的目录,命名为https。这个目录将用于存放与HTTPS相关的配置文件,如SSL/TLS证书和密钥

9.1创建ssl证书

生成一个自签名的TLS证书,用于在实验中配置HTTPS代理访问时使用

一般的话去你买域名的网站,下载

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/0=nginxsvc"



# -x509:表示生成自签名的证书。
# -sha256:表示使用SHA-256算法进行证书签名。
# -nodes:表示生成的私钥不加密。
# -days 365:表示证书的有效期为365天。
# -newkey rsa:2048:表示生成一个2048位的RSA私钥。
# -keyout tls.key:表示将生成的私钥保存到名为tls.key的文件中。
# -out tls.crt:表示将生成的证书保存到名为tls.crt的文件中。
# -subj "/CN=nginxsvc/O=nginxsvc":表示指定证书的主题信息,其中/CN表示Common Name(通用名称),/O表示Organization(组织)。

9.2创建 secret 资源进行存储

9.2.1创建Secret资源:

kubectl create secret tls tls-secret --key tls.key --cert tls.crt
  • 使用kubectl create secret tls命令创建一个新的Kubernetes Secret资源,名为tls-secret

  • 该Secret资源包含您之前创建的tls.key(私钥)和tls.crt(证书)文件。

9.2.2获取Secret资源信息:

kubectl get secrets
  • 查看当前命名空间(默认为default)中的Secret资源列表。

  • 可以看到了名为tls-secret的Secret资源,它包含TLS类型的数据

9.2.3查看Secret资源:

  • 使用kubectl describe secret tls-secret命令获取tls-secret的详细信息。

  • 可以看到了Secret资源的类型为kubernetes.io/tls,并且包含了证书和私钥的数据。

kubectl describe secret tls-secret

现在,可以在创建Ingress资源时引用这个Secret,以便为Ingress Controller配置HTTPS支持。这将允许Ingress Controller使用这个SSL证书来终止外部HTTPS请求。

9.3创建 deployment、Service、Ingress Yaml 资源

vim ingress-https.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app-https  #修改名字,防止重复
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-https  #后端服务的名称为nginx-svc-https
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:
      - www3.zzz.com
      secretName: tls-secret   # 存储TLS证书和私钥的 Secret 对象的名称为tls-secret
  rules:
    - host: www3.zzz.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: nginx-svc-https  #后端服务的名称为nginx-svc-https
              port:
                number: 80

YAML配置文件解读:

  • 在该文件中定义一个Deployment(nginx-app-https),它包含两个Nginx容器的副本。
  • 定义一个Service(nginx-svc-https),它将端口80的流量转发到标签为name: nginx的Pod。
  • 定义一个Ingress资源(nginx-https),它配置了HTTPS支持,使用之前创建的tls-secret证书和私钥。
  • Ingress资源中定义了一个规则,当访问www03.zzz.com时,流量将被路由到nginx-svc服务的端口80。
kubectl apply -f ingress-https.yaml

使用kubectl apply -f ingress-https.yaml命令将这些配置应用到Kubernetes集群中。

kubectl get svc -n ingress-nginx
  • 使用kubectl get svc -n ingress-nginx命令获取Ingress Controller的Service信息。会看到了ingress-nginx服务,它是一个NodePort类型的服务,监听端口80和443,但没有外部IP地址(192.168段的)

9.4访问测试

在宿主机的 C:\Windows\System32\drivers\etc\hosts 文件中添加映射

浏览器访问测试:

www3.zzz.com:30907

请注意,由于使用的是NodePort而不是外部IP地址,这种访问方式通常只适用于集群内部或者在知道NodePort端口号的情况下。对于外部用户,他们需要通过域名解析到Ingress Controller的外部IP地址,并且Ingress Controller需要配置为使用您创建的TLS证书来处理HTTPS请求。

十、Nginx 进行 BasicAuth

在Kubernetes集群中配置Nginx Ingress Controller以实现基本的HTTP身份验证(BasicAuth)

mkdir /opt/ingress-nodeport/basic-auth
cd /opt/ingress-nodeport/basic-auth

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

yum -y install httpd
htpasswd -c auth zhaoz			#认证文件名必须为 auth
kubectl create secret generic basic-auth --from-file=auth

#认证文件名必须为 auth

10.2创建Secret资源

kubectl create secret generic basic-auth --from-file=auth
  • 使用kubectl create secret generic basic-auth --from-file=auth命令创建一个新的Kubernetes Secret资源,名为basic-auth,并将之前生成的auth文件作为数据。

10.3创建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 - zhaoz'
spec:
  rules:
  - host: auth.zzz.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: nginx-svc
            port:
              number: 80

使用vim编辑器创建一个名为ingress-auth.yaml的YAML文件。(如上代码)

  • 在该文件中定义了一个Ingress资源,名为ingress-auth,它包含了基本认证的配置。
  • 使用注解设置了认证类型(basic)、认证使用的Secret资源名称(basic-auth)以及认证窗口提示信息。
  • 定义了一个规则,当访问auth.zzz.com时,流量将被路由到nginx-svc服务的端口80。

具体详细设置方法可参考官网

https://kubernetes.github.io/ingress-nginx/examples/auth/basic/

kubectl apply -f ingress-auth.yaml


kubectl get svc -n ingress-nginx
echo '192.168.246.11 auth.zzz.com' >> /etc/hosts

这边使用真机win进行检测,添加主机映射在本机C盘中

10.4浏览器检测

浏览器访问:http://auth.zzz.com:30864

这里,30864是Ingress Controller的NodePort端口号。

进入查看页面

十一、Nginx重写

在Kubernetes集群中配置Nginx Ingress Controller以实现URL重写,可以配置 Nginx Ingress Controller,然后通过编辑 Ingress 资源规则,使用 Nginx 的 rewrite 指令来修改传入请求的 URL 路径,实现定制的路由和重定向功能。

11.1 metadata.annotations 配置说明

Nginx 进行重写

#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上定义的路径是否使用正则表达式

11.2创建重写Ingress资源

mkdir rewrite
cd rewrite

vim ingress-rewrite.yaml
  • apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-rewrite
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: http://www02.zzz.com:30864
    spec:
      rules:
      - host: re.kgc.com #由于re.kgc.com只是用于跳转不需要真实站点存在,因此svc资源名称可随意定义
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nginx-svc
                port:
                  number: 80
  • 使用vim编辑器创建一个名为ingress-rewrite.yaml的YAML文件。
  • 在该文件中定义了一个Ingress资源,名为nginx-rewrite,它包含了URL重写的注解配置。
  • 注解nginx.ingress.kubernetes.io/rewrite-target设置为http://www3.zzz.com:30907,这意味着所有发送到re.gzb.com的流量都将被重定向到这个目标URI。
kubectl apply -f ingress-rewrite.yaml

echo '192.168.246.11 re.kgc.com' >> /etc/hosts  #任意node的ip地址

11.3浏览器访问

http://re.kgc.com:30864

浏览器访问:http://re.kgc.com:30864就会跳转到http://www02.zzz.com:30864

十二、温故而知新

  • ingress是k8s集群的请求入口,可以理解为对多个service的再次抽象
  • 通常说的ingress一般包括ingress资源对象及ingress-controller两部分组成
  • ingress-controller有多种实现,社区原生的是ingress-nginx,根据具体需求选择
  • ingress自身的暴露有多种方式,需要根据基础环境及业务类型选择合适的方式
  • Ingress Controller 可以理解为控制器,它通过不断的跟 Kubernetes APl交互,实时获取后端Service、Pod的变化,比如新增、删除等,结合Ingress 定义的规则生成配置,然后动态更新上边的Nginx 或者 trafik负载均衡器,并刷新使配置生效,来达到服务自动发现的作用。
  • Ingress是定义规则,通过它定义某个域名的请求过来之后转发到集群中指定的 Service。它可以通过Yaml 文件定义,可以给一个或多个 Service 定义一个或多个 Ingress 规则。

12.1Ingress数据流向

  • DaemonSet + Hostwork + NodeSelector Ingress-Controller    部署的ingress控制器

数据流向:客户端 -> 通过node节点的80/433端口进入ingress控制器 -> 根据ingress对象的转发规则 -> 业务Pod的Service -> 通过标签选择器 -> 业务Pod

  • Deployment + NodePort 

客户端------>域名访问------> ingress控制器的Service------>Ingress-Controller(Pod)---->根据ingress对象的转发规则 ------>业务应用Service------>业务的应用Pod,域名可以解析成NodePortIP或者负载均衡VIP

12.2K8S集群外部的客户端访问K8S集群内部的方案?

  • 基于Service实现:NodePort  LoadBalancer  externalIPs   只能支持四层反向代理,如果K8S集群规模较大运行的业务较多时NodePort端口/externalIPs管理成本会很高
  • 基于Ingress实现:支持七层反向代理,可自定义规则根据用户请求的域名或URL路径转发给指定Service进行代理访问

12.3基于主机名的虚拟主机

rules:
- host: hostname1
......
- host: hostname2

12.4Ingress的组成

  • ingress控制器(ingress controller):根据在ingress资源对象配置的规则转发用户请求的组件,以Pod形式运行的
  • ingress资源对象:设置转发规则,告诉ingress控制器应该根据什么域名或URL路径转发请求给相应的Service资源的endpoints端点(podIP:容器Port)

12.5创建Ingress资源 

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

12.6Ingress资源配置 

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端口   

12.7基于不同域名或者不同URL路径做转发

  #基于不同域名的代理转发
  - host: 域名2
    http:
	  paths:
	  - path: URL路径1
        pathType:
        backend: 
	      ....
	  #基于不同URL路径的代理转发
	  - path: URL路径2
        pathType:
        backend: 
          ....

12.8基于https代理转发 

要生成TLS证书和私钥文件

(在企业需要到域名中的网站下载,有免费正常购买的时候,其次收费的大概在3000/年)

创建Secret资源TLS类型,把证书信息保存到K8S集群内

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

12.9Rewrite重定向

简约版

metadataL
  annotations:
    nginx.ingress.kubernets.io/rewrite-target
    #指定重定向的URL路径(http://域名:ingress-controller的端口)
spec:
  rules:
  - host: 源主机名
  backend
  #这里源主机名仅用于跳转所有不需要实际站点存在,因此后端绑定的Service资源可以随意定义

细致版

基于rewrite实现重写访问路径 

#基于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

12.10基于basic-auth实现访问认证

#基于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: '认证窗口提示信息'

GitHub - kubernetes/ingress-nginx: Ingress-NGINX Controller for Kubernetesicon-default.png?t=N7T8https://github.com/kubernetes/ingress-nginx


 

                            

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/683041.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TSR,FSR,DLSS超级分辨率的原理分析

先了解一些时域抗锯齿的方法&#xff1a; TAA&#xff1a; 抖动 TAA 的主要原理是跨帧计算多个子像素样本&#xff0c;然后将它们组合成一个最终像素。最简单的方案是在像素内生成随机样本&#xff0c;但有更好的方法来生成固定序列的样本。选择一个好的序列以避免聚集非常重…

LeetCode-数学基础开篇

概念 1.实数 2.指数函数 f(x) &#xff08;a&#xff1e;0且a≠1&#xff09;【a: 底数&#xff08;常量&#xff09;&#xff0c;x: 指数&#xff08;变量&#xff09;】 特征&#xff1a;指数函数在x轴没有交点&#xff0c;是光滑的曲线 3.幂函数 f(x) 【x&#xff…

Nginx的https功能

一.HTTPS功能简介 Web网站的登录页面都是使用https加密传输的&#xff0c;加密数据以保障数据的安全&#xff0c;HTTPS能够加密信息&#xff0c;以免敏感信息被第三方获取&#xff0c;所以很多银行网站或电子邮箱等等安全级别较高的服务都会采用HTTPS协议&#xff0c;HTTPS其实…

Python——range() 函数用法详解

Python——range() 用法详解 range() 是一个用于生成整数序列的内置函数&#xff0c;在Python中常用于循环迭代等场景。 它可以接受一个或多个参数&#xff0c;生成一个按指定规则的整数序列。 1.range() 函数的语法 range(stop) range(start, stop,[step])start&#xff1…

1. lvs负载均衡

lvs负载均衡 一、集群技术概述1、集群技术类型2、负载均衡技术3、高可用技术 二、负载均衡 LVS1、LVS介绍2、负载均衡策略/算法3、LVS设计模式3.1 NAT模式的注意事项3.2 DR 直接路由模式的注意事项 三、LVS nat模式的实现1、确认后端服务器网关正确2、安装ipvsadm软件3、开启路…

Java 实验8 集合类

&#xff08;一&#xff09;实验目的 1、掌握JAVA集合类中的Collection的特点及其应用情形&#xff1b; 3、掌握Collection、熟悉集合的特点及应用。 &#xff08;二&#xff09;实验内容和步骤 1、仿照课堂练习的MyStack示例&#xff0c;使用LinkedList集合类实现一个先进…

Java项目:100 springboot共享汽车管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本共享汽车管理系统有管理员和用户。 管理员功能有个人中心&#xff0c;用户管理&#xff0c;投放地区管理&#xff0c;汽车信息管理&#xff0c;汽车…

xrun简单的仿真环境

xrun xceliun makefile文本 all: clean comp ela sim comp:xrun -64bit -compile test.v accessrwc ela:xrun -64bit -elaborate test.v accessrwc sim:xrun -64bit -R -gui clean:xrun -clean 仿真代码 timescale 1ns/1ns module test (); reg clk; initial beginclk 1b…

xtsk—选择自由

最近和一些自由职业者交流时深刻感受到&#xff0c;系统思考不是为了创造更多的工作&#xff0c;而是为了创造更多的自由。我们工作的最终目的&#xff0c;实际上是为了达到不需要为了生存而工作的自由状态&#xff0c;赚钱只是手段&#xff0c;其本质是为了赢得更多的选择权。…

【机器学习300问】108、什么是多项式回归模型?

一、多项式回归是什么 &#xff08;1&#xff09;举例说明 假设你经营着一家农场&#xff0c;想要根据土地面积来预测作物的产量。如果你只用线性模型&#xff08;即&#xff09;&#xff0c;你可能会发现它并不足以描述实际的产量情况&#xff0c;因为实际产量可能会随着土地…

Huawei 大型 WLAN 组网 AC 间漫游

AC1配置命令 <AC6005>display current-configuration # vlan batch 100 # interface Vlanif100description to_S3_CAPWAPip address 10.0.100.254 255.255.255.0 # interface GigabitEthernet0/0/1port link-type trunkport trunk allow-pass vlan 100# ip route-stati…

【2024】Kafka Streams纤细介绍与具体使用(1)

目录 介绍关键特性应用场景核心概念部署方式kafka streams的处理模式 具体使用1、准备工作2、添加依赖3、代码实现3、测试 介绍 Kafka Streams是构建在Apache Kafka之上的客户端库&#xff0c;用于构建高效、实时的流处理应用。它允许你以高吞吐量和低延迟的方式处理记录流&am…

uniapp小程序多线程 Worker 实战【2024】

需求 最近遇到个小程序异步解码的需求&#xff0c;采用了WebAssembly&#xff0c;涉及大量的计算。由于小程序的双线程模型只有一个线程处理数据&#xff0c;因此智能寻求其它的解决方案。查看小程序的文档&#xff0c;发现小程序还提供一个异步线程的Worker方案&#xff0c;可…

Java | Leetcode Java题解之第134题加油站

题目&#xff1a; 题解&#xff1a; class Solution {public int canCompleteCircuit(int[] gas, int[] cost) {int n gas.length;int i 0;while (i < n) {int sumOfGas 0, sumOfCost 0;int cnt 0;while (cnt < n) {int j (i cnt) % n;sumOfGas gas[j];sumOfCos…

如何通过 6 种简单方法将照片从华为转移到 PC?

华为作为全球领先的智能手机供应商之一&#xff0c;最近推出了其自主研发的操作系统——HarmonyOS 2.0&#xff0c;旨在为智能手机、平板电脑和智能手表等设备提供更流畅的用户体验。随着Mate 40/P40等系列手机计划升级到HarmonyOS 2.0&#xff0c;用户可能需要将手机中的文件备…

【云原生】Kubernetes----轻量级的现代HTTP反向代理和负载均衡器之Traefik

目录 引言 一、Traefik基本概念 &#xff08;一&#xff09;什么是Ingress &#xff08;二&#xff09;什么是Traefik &#xff08;三&#xff09;Traefik和Nginx的区别 1.设计目标 2.配置语言 3.容器支持 4.功能特性 二、安装部署Traefik &#xff08;一&#xff0…

[C][数据结构][顺序表]详细讲解+实现

目录 1.线性表2.顺序表 - SeqList3.实现4.顺序表缺点 1.线性表 线性表(linear list)是n个具有相同特性的数据元素的有限序列线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构&#xff0…

十.数据链路层——MAC/ARP

IP和数据链路层之间的关系 引言 在IP一节中&#xff0c;我们说IP层路由(数据转发)的过程&#xff0c;就像我们跳一跳游戏一样&#xff0c;从一个节点&#xff0c;转发到另一个节点 它提供了一种将数据从A主机跨网络发到B主机的能力 什么叫做跨网络&#xff1f;&#xff1f;&a…

Windows开启远程桌面

搜索并进入【远程桌面设置】 ​​ 开启远程桌面 ​​​ ipconfig​命令查看ip地址&#xff0c;并使用地址在另一台电脑远程登录此电脑 选择其他账户登录&#xff0c;输入用户和密码 ​​ ​​ 成功登录 ​​

AlDente Pro for Mac(电池最大充电限制工具)v1.24激活版

AlDente Pro for Mac是一款运行在MacOS平台上专业的电池最大充电限制工具。通过 AlDente Pro 您可以设置电池的最大充电百分比设置为 20&#xff05; 至 100&#xff05;&#xff0c;然后&#xff0c;它将保持在所需的电池百分比&#xff0c;然后再次使用电源适配器进行充电。 …