建设银行上海黄浦支行网站,男女生做爰视频网站,手工制作收纳盒,巴中哪里可以做公司网站负载均衡是什么#xff1f;
负载均衡#xff08;Load Balancing#xff09;是指将计算机或网络资源分配给多个任务或请求#xff0c;以便有效地处理负
载#xff0c;提高系统性能和可靠性的技术或方法。在计算机网络中#xff0c;负载均衡可以应用于各种场景#xff0c;…负载均衡是什么
负载均衡Load Balancing是指将计算机或网络资源分配给多个任务或请求以便有效地处理负
载提高系统性能和可靠性的技术或方法。在计算机网络中负载均衡可以应用于各种场景如服务器负
载均衡、网络负载均衡和数据库负载均衡等。
负载均衡的主要目标是通过分配和管理资源避免某个节点或服务过载从而提高整个系统的性能和
可用性。它可以通过以下几种方式来实现
1、请求分发将来自用户或客户端的请求分发到多个服务器或节点上。这可以确保每个服务器都能
够处理适量的请求避免单个服务器过载。
2、资源调度根据服务器或节点的负载情况动态地将请求分配到最空闲或最合适的服务器上。这
样可以平衡负载确保每个服务器都得到合理的负载。
3、故障处理当一个服务器或节点发生故障时负载均衡系统可以自动将请求重新分配到其他正常
工作的服务器上以确保服务的连续性和可用性。
4、扩展性和可伸缩性通过添加更多的服务器或节点负载均衡系统可以实现水平扩展从而提高
系统的吞吐量和容量。
在 k8s 中为什么要做负载均衡
1、高可用性负载均衡可以确保应用程序的高可用性。在 K8s 集群中应用程序通常由多个副本
Pod组成这些副本运行在不同的节点上。通过负载均衡流量可以均匀地分发到这些副本上即使
一个节点或副本出现故障负载均衡仍然可以将流量重定向到其他健康的副本从而保持应用程序的可用
性。
2、水平扩展负载均衡可以支持应用程序的水平扩展。当应用程序的负载增加时可以通过增加副
本数量来扩展应用程序的容量。负载均衡器可以自动将流量分发到这些新创建的副本上从而实现应用程
序的扩展性。
3、流量管理负载均衡器能够管理流量的分发和控制。它可以根据不同的负载均衡算法如轮询、
最小连接数或基于权重等将流量分发到不同的副本上。这样可以确保每个副本都能够平均地处理请求
并避免某些副本被过载。
4、服务发现K8s 中的负载均衡器还可以提供服务发现功能。负载均衡器可以为应用程序提供一个
固定的访问入口通常是一个虚拟 IP 地址而不必直接暴露每个副本的 IP 地址。这样当副本的 IP 地
址发生变化时客户端仍然可以通过负载均衡器访问应用程序。扩展 在 k8s 为什么要引入七层负载均衡
1、应用层路由和转发七层负载均衡能够在应用层进行路由和转发决策。与四层负载均衡基于传
输层的负载均衡相比七层负载均衡可以根据应用协议如 HTTP、HTTPS的特定属性进行更精细
的流量分发例如基于 URL、HTTP 头、Cookie 等信息。这使得负载均衡器能够更好地理解应用程序的
行为并根据需要进行灵活的流量控制。
2、HTTP/HTTPS 负载均衡Kubernetes 中的大部分应用程序都使用 HTTP 或 HTTPS 协议进行
通信。七层负载均衡器可以在应用层进行 HTTP/HTTPS 的负载均衡具有更深入的应用层理解和更高级
的功能如 HTTP 请求重写、URL 重定向、会话保持等。这使得负载均衡器能够提供更强大和灵活的
HTTP/HTTPS 流量管理能力。
3、请求级别的负载均衡七层负载均衡器可以实现请求级别的负载均衡。它可以根据请求的特性和
需求将请求分发到不同的后端服务或副本。例如可以根据请求的 URL 路径将特定类型的请求发送到
专门的处理服务或者根据请求的 Cookie 信息将请求发送到特定的会话保持副本。这种细粒度的负载均
衡可以根据应用程序的需求进行定制和优化。
4、应用程序性能和可用性优化七层负载均衡器能够提供一系列应用层的性能优化和安全功能如
SSL 加速、Gzip 压缩、请求缓存等。它还可以通过健康检查和故障检测来监控后端服务的可用性并自
动将流量从故障的服务转移到健康的服务从而提高应用程序的可用性和可靠性。Ingress 和 Ingress Controller 深度解读
当我们在日常生活中想要去不同的商店购物时我们需要找到正确的入口并按照商店的规则进入。类
似地Ingress 和 Ingress-Nginx Controller 在 Kubernetes 中提供了类似的功能。
1. Ingress在 Kubernetes 中Ingress 是一个 API 对象它充当着一个入口点的角色帮助我
们将外部的请求引导到正确的服务上。就像商店的入口指示我们如何进入商店一样Ingress 定
义了一组规则指定了如何将外部的请求流量路由到 Kubernetes 集群内部的服务。
2. Ingress-Nginx ControllerIngress-Nginx Controller 是一个特定类型的 Ingress
Controller它使用 Nginx 作为负载均衡器来实现 Ingress 规则定义的流量转发。类比于商店
的入口Ingress-Nginx Controller 就像是一个管理商店入口的工作人员根据 Ingress 规则
将客户引导到正确的服务上。举个例子想象你是一个在线购物平台你有多个商家在平台上销售商品。每个商家都有自己的店铺服
务在 Kubernetes 集群中运行。现在你需要为每个商家提供一个独立的 URL 来访问他们的店铺同时
确保访问流量能够正确地转发到相应的店铺。这时你可以使用 Ingress 来定义规则比如为每个商家指
定一个独特的 URL 路径如/shop1、/shop2然后使用 Ingress-Nginx Controller 将来自外部的
请求根据这些规则转发到对应的商家店铺
使用 Ingress Controller 代理 k8s 内部应用的流程
1部署 Ingress controller我们 ingress controller 使用的是 nginx
2创建 Pod 应用可以通过控制器创建 pod
3创建 Service用来分组 pod
4创建 Ingress http测试通过 http 访问应用
5创建 Ingress https测试通过 https 访问应用
客户端通过七层调度器访问后端 pod 的方式备注跨域啥意思
跨域Cross-Origin是一个安全机制用于限制来自不同域名的资源之间的交互。当一个网页的
脚本尝试从一个源域、协议和端口的组合获取数据时浏览器会执行跨域检查以确保该请求的目标
源具有适当的访问权限。
Nginx 是一个流行的 Web 服务器软件它也可以用作反向代理服务器。在 Nginx 中跨域问题通
常与浏览器的同源策略Same-Origin Policy有关。同源策略要求网页中的 JavaScript 只能访问与
其来源具有相同域名、协议和端口的资源。
当你的网页上的 JavaScript 尝试从一个不同域名的资源请求数据时浏览器会发出跨域请求并且
会在控制台上报告跨域错误。为了解决这个问题你可以在 Nginx 服务器上进行跨域配置允许特定的
跨域请求。
在 Nginx 中配置跨域可以通过添加 HTTP 头字段来实现。以下是一个示例配置允许来自
example.com 域名的跨域请求
location / {add_header Access-Control-Allow-Origin http://example.com;add_header Access-Control-Allow-Methods GET, POST, OPTIONS;add_header Access-Control-Allow-Headers Origin, X-Requested-With, Content-Type, Accept;
}
上述配置将在每个响应中添加跨域相关的 HTTP 头字段允许来自 example.com 域的 GET、
POST 和 OPTIONS 请求并允许一些常见的请求头。安装 Nginx Ingress Controller
Ingress-controller 和 k8s 版本对照
Ingress-controller 官网 https://github.com/kubernetes/ingress-nginx/传镜像
rootubuntu0:~/matedata/volumes# ansible all -m copy -a srcnginx-ingress-controller_v1.1.1.tar.gz dest/rootrootubuntu0:~/matedata/volumes# ansible all -m copy -a srckube-webhook-certgen_1.1.1.tar.gz dest/root导入镜像
rootubuntu0:~/matedata/volumes# ansible all -m shell -a ctr -nk8s.io images import kube-webhook-certgen_1.1.1.tar.gz
rootubuntu0:~/matedata/volumes# ansible all -m shell -a ctr -nk8s.io images import nginx-ingress-controller_v1.1.1.tar.gz安装 Ingress conrtroller 需要的 yaml 所在的 github 地址
https://github.com/kubernetes/ingressnginx/blob/main/deploy/static/provider/baremetal/deploy.yaml
更改了镜像名称以及
rootubuntu0:~# grep hostNetwork deploy.yaml hostNetwork: true #运行在主机上rootubuntu0:~/matedata/ingress# kubectl apply -f deploy.yaml 授权
rootubuntu0:~/matedata/ingress# kubectl create clusterrolebinding clusterrolebinding-user-3 --clusterrolecluster-admin --usersystem:serviceaccount:ingress-nginx:ingress-nginx
clusterrolebinding.rbac.authorization.k8s.io/clusterrolebinding-user-3 created
rootubuntu0:~/matedata/ingress# kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-9hztd 0/1 Completed 0 60s
ingress-nginx-admission-patch-5wdz4 0/1 Completed 2 60s
ingress-nginx-controller-56dc9c69b9-656fg 0/1 Running 0 60s
这两个 Completed 状态的 Pod 是 Ingress-Nginx 控制器的准入控制 Webhook 的 Job Pod。这是正常现象这两个 Pod 的作用
1. ingress-nginx-admission-create
功能: 创建 TLS 证书和密钥用于验证 Ingress 资源的有效性作用: 为准入控制 Webhook 生成必要的安全凭证2. ingress-nginx-admission-patch
功能: 将 Webhook 配置更新到 Kubernetes API 服务器作用: 注册验证 Webhook确保创建的 Ingress 资源符合规范
工作流程
rootubuntu0:~/matedata/ingress# kubectl get jobs -n ingress-nginx
NAME COMPLETIONS DURATION AGE
ingress-nginx-admission-create 1/1 17s 4m10s
ingress-nginx-admission-patch 1/1 31s 4m10s
为什么是 Completed 状态
Job 类型: 这两个是 Kubernetes Job不是 Deployment一次性任务: Job 执行完成后就会处于 Completed 状态正常行为: 这是设计如此不需要持续运行
测试 Ingress HTTP 代理 k8s 内部站点
步骤
1部署 Ingress controller我们 ingress controller 使用的是 nginx
2创建 Pod 应用可以通过控制器创建 pod
3创建 Service用来分组 pod
4创建 Ingress http测试通过 http 访问应用
5创建 Ingress https测试通过 https 访问应用部署后端 tomcat 服务
rootubuntu0:~/matedata/ingress# cat ingress-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat-deploynamespace: default
spec: replicas: 2selector:matchLabels:app: tomcatrelease: canarytemplate:metadata:labels:app: tomcatrelease: canaryspec:containers:- name: tomcatimage: docker.io/library/tomcat:8.5.34-jre8-alpineimagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 8080- name: ajpcontainerPort: 8009
---
apiVersion: v1
kind: Service
metadata:name: tomcatnamespace: default
spec:selector:app: tomcatrelease: canaryports:- name: httptargetPort: 8080port: 8080- name: ajptargetPort: 8009port: 8009
rootubuntu0:~/matedata/ingress# kubectl apply -f ingress-demo.yaml
deployment.apps/tomcat-deploy created
service/tomcat created
rootubuntu0:~/matedata/ingress# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-pvc 1/1 Running 0 7h48m 10.244.152.105 ubuntu2 none none
read-pod 1/1 Running 0 6h43m 10.244.25.174 ubuntu1 none none
tomcat-deploy-7455769b96-b9z4r 1/1 Running 0 9s 10.244.25.191 ubuntu1 none none
tomcat-deploy-7455769b96-rlfs8 1/1 Running 0 9s 10.244.152.121 ubuntu2 none none
xpp-c44d68dcf-fkxkk 1/1 Running 0 6h56m 10.244.25.173 ubuntu1 none none
编写 ingress 规则
rootubuntu0:~/matedata/ingress# cat ingress-myapp.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-myappnamespace: default
spec:ingressClassName: nginxrules: #定义后端转发的规则- host: tomcat.lucky.com #通过域名进行转发 http:paths:- path: / #配置访问路径如果通过 url 进行转发需要修改空默认为访问的路径为/pathType: Prefixbackend: #配置后端服务service:name: tomcatport:number: 8080备注pathType: Prefix
指定了路径前缀匹配方式
http:paths:- path: /pathType: Prefixbackend:service:name: tomcatport: 8080
pathType: Prefix
指定了路径前缀匹配方式, 除了精确匹配根路径 / 外它还会匹配根路径之后的所有子路径。rootubuntu0:~/matedata/ingress# kubectl apply -f ingress-myapp.yaml
ingress.networking.k8s.io/ingress-myapp created
rootubuntu0:~/matedata/ingress# kubectl get ingress -owide
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-myapp nginx tomcat.lucky.com 192.168.23.97 80 65s访问ip不行只有域名因为host: tomcat.lucky.com 写的是域名写ip别人不认
测试 Ingress HTTPS 代理 tomcat
1.构建 TLS 站点
rootubuntu0:~# openssl genrsa -out tls.key 2048
rootubuntu0:~# openssl req -new -x509 -key tls.key -out tls.crt -subj /CCN/STBeijing/LBeijing/ODevOps/CNtomcat.lucky.com
2 生成 secret
rootubuntu0:~# kubectl create secret tls tomcat-ingress-secret --certtls.crt --keytls.key
secret/tomcat-ingress-secret created
NAME TYPE DATA AGE
default-token-mnzns kubernetes.io/service-account-token 3 43d
nfs-provisioner-token-n4w5h kubernetes.io/service-account-token 3 10h
tomcat-ingress-secret kubernetes.io/tls 2 62s
rootubuntu0:~# kubectl describe secrets tomcat-ingress-secret
Name: tomcat-ingress-secret
Namespace: default
Labels: none
Annotations: noneType: kubernetes.io/tlsDatatls.crt: 1310 bytes
tls.key: 1708 bytesIngress 规则可以参考官方
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
pathType 类型https://kubernetes.io/zh-cn/docs/concepts/servicesnetworking/ingress/#path-types
rootubuntu0:~/matedata/ingress# cat ingress-tomcat-tls.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress-tomcat-tlsnamespace: default
spec:ingressClassName: nginxtls:- hosts:- tomcat.lucky.comsecretName: tomcat-ingress-secretrules:- host: tomcat.lucky.comhttp:paths:- path: /pathType: Prefixbackend:service:name: tomcatport:number: 8080
rootubuntu0:~/matedata/ingress# kubectl apply -f ingress-tomcat-tls.yaml
Error from server (BadRequest): error when creating ingress-tomcat-tls.yaml: admission webhook validate.nginx.ingress.kubernetes.io denied the request: host tomcat.lucky.com and path / is already defined in ingress default/ingress-myapp
rootubuntu0:~/matedata/ingress# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-myapp nginx tomcat.lucky.com 192.168.23.97 80 41m
rootubuntu0:~/matedata/ingress# kubectl delete -f ingress-myapp.yaml
ingress.networking.k8s.io ingress-myapp deleted
rootubuntu0:~/matedata/ingress# kubectl apply -f ingress-tomcat-tls.yaml
ingress.networking.k8s.io/ingress-tomcat-tls created
rootubuntu0:~/matedata/ingress# kubectl get ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-tomcat-tls nginx tomcat.lucky.com 192.168.23.97 80, 443 5m1s