编辑/etc/sysconfig/kubelet 使用 KUBE_PROXY_NODE=ipvs 指定service的模式 那么ipvs使用的算法包括 : ip_vs ip_vs_rr ip_vs_sh
如果一个主机没有Cluster IP 那么我们就称为 Headless --> 将serveicename 解析到后端的pod上
k8s 的三个核心资源: pod 控制器 service
那么service是四层的负载均衡 ,不是七层的,只能是基于 iptables 或者是 ipvs ,如果用户访问的是https 的请求 ,那么对四层来说无法惊醒负载, 如果pod中的应用是HTTP的想要增强成HTTPS的,那么我们可以想一下其中的证书呀,私钥配置在什么地方,如果我们的调度器是lvs ,那么我们想提供HTTP 的服务 ,那么这个HTTP应该配置在那里? 注: 应该配置在后端主机上,不能配置在lvs上,所以我们必须在后端的每个服务器上配置 HTTPS ,配置证书,私钥 ,,等等 ,
无论是ipvs 还是 iptables ,都无法调度七层的应用,因此我们要使用http 或者 https 我们就必须使用七层的调度 ,将客户 -> 调度器 (使用七层) -> 后端 , 那么现在我们就只能换调度器 , k8s 采用(可以理解为加一层),后端配置的是不加https ,就是明文的htp, 那么我们使用一个独特的调度器,当用户试图访问的时候,我们不让他们到达后端的服务器,而是先到达调度器 (可以定义一个pod资源) , 然后在访问后端的服务器 ,这样原来的明文就可以被https访问到了 。
那么在K8s中我们有特定的方法来解决这个七层的负载的方法:
我们使用一个新的控制器称为 Ingress Controller ,这个和之前说的 DaemonSet ReplicaSet 都不太一样,----> 他们是作为manager来存在的 ,是master上的核心组件之一,而Ingress 是自己独立存在的一组组件pod资源,通常就是一组应用程序,这个应用程序就是拥有七层调度功能的一组应用程序,k8s上的选择有四种: 最不受待见的是HAproxy 默认的是 Nginx 现在服务网格当中Envoy 当前还有其他的,Traefik 所以我们在配置应用的是有三种选择 : Nginx Envoy traefik(为微服务设计而生) ,
但是它们最为调度器而言不止要调度一个后端服务,那么在后端的web服务有多种时(电商、api、..),使用调度器调度的时候我们怎么可以判断调度的究竟是我们想要的服务? : 1.我们可以考虑在Nginx上怎么调度,首先我们有四组upstream ,然后对客户端而言我们可以做四个虚拟主机 来进行以域名的形式访问。
在k8s 上有一类特殊的资源,Ingress资源,Ingress 和 Ingress Controller是两个概念 ,我们定义Ingres 的意义就是说定义我们期望Ingress Controller 如何给我们建一个前端(可能是虚拟主机也可能是url映射)而又给我们定义一个后端(有几个主机 Ingress 是通过srevice得到的),首先我们由一个service对后端的pod进行分类,而后Ingress基于这个分类识别出这几个pod的ip地址 ,然后生成配置信息注入到(以Nginx为例,那就是upstream 中)
那么在Igress实现的七层负载的过程是: 最外面的对节点的均衡 Externalname ---> 具体的某一节点上 NodePort ----> 节点上的 Ingresss Controller ---> 调度到具体的Ingress 上 ,因为Ingress 分别管理着一组pod资源 ----> 通过service 对这些pod进行分组传给Ingress 引用
那么下来我们要使用Ingress这个功能,我们要去创建一个Ingress Controller Pod 而后我们要定义后端的service 在将他们之间建立联系。我们下来看一个Ingress怎么定义 ? Ingress 也是标准的K8s资源 。我们一样使用explain的文档去查看类似的参数的定义,同样在包含的资源的清单中也会有: apiVersion kind metadata spec status
[root@server1 ~]# kubectl explain ingress
KIND: Ingress
VERSION: extensions/v1beta1
DESCRIPTION:
Ingress is a collection of rules that allow inbound connections to reach
the endpoints defined by a backend. An Ingress can be configured to give
services externally-reachable urls, load balance traffic, terminate SSL,
offer name based virtual hosting etc.
FIELDS:
apiVersion <string>
APIVersion defines the versioned schema of this representation of an
object. Servers should convert recognized schemas to the latest internal
value, and may reject unrecognized values. More info:
https://git.k8s.io/community/contributors/devel/api-conventions.md#resources
kind <string>
Kind is a string value representing the REST resource this object
represents. Servers may infer this from the endpoint the client submits
requests to. Cannot be updated. In CamelCase. More info:
h