Eli's Blog

1. 简介

LVS 主要由两部分组成:

  • ipvs:ip virtual server,是工作在内核空间上的一段代码,主要是实现调度的代码,它是实现传输层负载均衡的核心。
  • ipvsadm:工作在用户空间,负责为ipvs内核框架编写规则,用于定义谁是集群服务,谁是后端真实服务器

IPVS 基于 Netfilter, Netfilter 的数据包有五个挂载点Hook Point:PRE_ROUTING、INPUT、OUTPUT、FORWARD、POST_ROUTING。IPVS工作在其中的INPUT链上

img

专有名词

  • DS:Director Server,指的是前端负载均衡器。

  • RS:Real Server,指的是后端工作的服务器。

  • VIP:Virtual IP,用户请求的目标IP地址。

  • DIP:Director Server IP,前端负载均衡器的IP地址。

  • RIP:Real Server IP,后端服务器的IP地址。

  • CIP:Client IP,访问客户端的IP地址。

1. 存储格式

密钥、密文、签名字符串的存储格式

1
2
3
4
5
6
7
8
9
10
// hex:转为十六进制字符串表示
hex.EncodeToString(src []byte) string
hex.DecodeString(s string) ([]byte, error)

// base64
base64.StdEncoding.EncodeToString(src []byte) string
base64.StdEncoding.DecodeString(s string) ([]byte, error)

// pem: 密钥解析
pem.Decode(data []byte) (p *Block, rest []byte)

1. API-Server

1.1 工作原理

核心功能:资源操作入口

  • 提供集群管理的 REST API 接口,包括认证授权、准入控制、数据校验以及集群状态变更等
  • 提供其他模块之间的数据交互和通信的枢纽(其他模块通过 API Server 查询或修改数据,只有 API Server 能够直接操作 etcd

img

1. 环境准备

1.1 安装规划

角色 IP 组件
k8s-master1 192.168.80.45 etcd, api-server, controller-manager, scheduler, docker
k8s-node01 192.168.80.46 etcd, kubelet, kube-proxy, docker
k8s-node02 192.168.80.47 etcd, kubelet, kube-proxy, docker

软件版本:

软件 版本 备注
OS Ubuntu 16.04.6 LTS
Kubernetes 1.21.4
Etcd v3.5.0
Docker 19.03.9

1. Kubeadm原理

1
2
3
4
5
# 创建一个 Master 节点
$ kubeadm init

# 将一个 Node 节点加入到当前集群中
$ kubeadm join <Master 节点的 IP 和端口 >

执行 kubeadm init:

  • 自动检查集群机器是否合规
  • 自动生成集群运行所需的各类证书及各类配置,并将Master节点信息保存在名为cluster-info的ConfigMap中。
  • 通过static Pod方式,运行API server, controller manager 、scheduler及etcd组件。
  • 生成Token以便其他节点加入集群

执行 kubeadm join时:

  • 节点通过token访问kube-apiserver,获取cluster-info中信息,主要是apiserver的授权信息(节点信任集群)。
  • 通过授权信息,kubelet可执行TLS bootstrapping,与apiserver真正建立互信任关系(集群信任节点)。

kubeadm做的事就是把大部分组件都容器化,通过StaticPod方式运行,并自动化了大部分的集群配置及认证等工作,简单几步即可搭建一个可用Kubernetes的集群。

1. TCP

a

TCP 是面向连接、可靠的、基于字节流传输层通信协议。

  • 面向连接:一对一的连接。不像 UDP 可以同时向多个主机发送消息。
  • 可靠的:网络链路中出现变化,TCP 可以保证一个报文一定能够到达指定端。

1. HTTP

1.1 特性

  • 构建在TCP上的应用层协议
  • 无连接无状态

1.2 状态码

  • 200 OK
  • 301 Moved Permanently 永久重定向,后续请求直接发往新地址
  • 302 Moved Temporarily 临时重定向
  • 304 Not Modified 文件未修改,直接使用缓存文件
  • 400 Bad Request 客户端请求有语法错误
  • 401 Unauthorized 请求未经授权
  • 403 Forbidden 认证通过,但无权限访问资源
  • 404 Not Found 请求的资源不存在
  • 405 Method Not Allowed
  • 500 Internal Server Error
  • 502 Bad Gateway 与upstream建立了连接,但响应超时。可能原因:后端代码执行超时、数据库响应慢等 (received an invalid response from the upstream server)
  • 503 Service Unavailable 服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常。(The server cannot handle the request, because it is overloaded or down for maintenance, generally this is temporary state.)
  • 504 Gateway Time-out 完全无法与upstream建立连接,一般是nginx配置错误 (did not receive a timely response from the upstream server)

1. 负载均衡

1.1 SLB

SLB: Server Load Balance

  • 通过设置虚拟服务地址(IP),将位于同一区域(Region)的多台云服务器(Elastic Compute Service,ECS)的资源虚拟成一个高性能、高可用的应用服务池;再根据应用指定的方式,将来自客户端的网络请求分发到云服务器池中

  • SLB服务会检查云服务器池中ECS的健康状态,自动隔离异常状态的ECS,从而解决了单台ECS的单点问题,同时提高了应用的整体服务能力

负载均衡算法:

  • 轮询 (Round Robin)

  • 最小连接 (Leaster Connections): 优先选择连接数最小的服务器

  • Source: 根据请求源IP的hash值来选择要转发的服务器,保证特定用户连接到相同服务器

1. 逃逸分析

1.1 堆和栈:

  • 堆(Heap):
    • 一般情况下,手动申请、分配、释放。内存大小并不定,较大的对象。另外其分配相对慢,涉及到的指令动作也相对多
    • 堆在内存分配中类似于往一个房间里摆放各种家具,家具的尺寸有大有小。
    • 引用类型 (指针、slice、map、chan、interface)的地址对应的数据存储内存通常分配在堆上
  • 栈(Stack):
    • 由编译器进行管理,自动申请、分配、释放。一般不会太大,我们常见的函数参数,局部变量等等都会存放在栈上
    • 栈是一种拥有特殊规则的线性表数据结构,只允许线性表的一端放入数据,之后再这一端取出数据,按照后进先出(lifo)的顺序
    • 值类型 (整型、浮点型、bool、string、array和struct) 的变量直接存储值,内存通常分配在栈上