openelb的介绍

具体根据官方文档进行安装官方文档,这里作为测试环境的安装使用. OpenELB 是一个开源的云原生负载均衡器实现,可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。OpenELB 项目最初由 KubeSphere 社区 发起,目前已作为 CNCF 沙箱项目 加入 CNCF 基金会,由 OpenELB 开源社区维护与支持。 与MetalLB类似,OpenELB也拥有两种主要工作模式:Layer2模式和BGP模式。OpenELB的BGP模式目前暂不支持IPv6。

layer2 Mode

BGP Mode

准备k8s的环境

千云物流测试环境部署使用openelb部署.

所需要的软件&版本

对应依赖软件版本

linux [CentOS]

7.9.2009

kubernetes

v1.22.12

docker [20.10.8]

20.10.8

openelb

kubesphere/openelb:v0.5.1

准备Layer2 Mode配置

配置ARP参数 部署Layer2模式需要把k8s集群中的ipvs配置打开strictARP,

strict ARP configure arp_ignore and arp_announce to avoid answering ARP queries from kube-ipvs0 interface

# 查看kube-proxy中的strictARP配置

$ kubectl get configmap -n kube-system kube-proxy -o yaml | grep strictARP

#strictARP: false

# 手动修改strictARP配置为true

$ kubectl edit configmap -n kube-system kube-proxy

configmap/kube-proxy edited

# 使用命令直接修改并对比不同

$ kubectl get configmap kube-proxy -n kube-system -o yaml | sed -e "s/strictARP: false/strictARP: true/" | kubectl diff -f - -n kube-system

# 确认无误后使用命令直接修改并生效

$ kubectl get configmap kube-proxy -n kube-system -o yaml | sed -e "s/strictARP: false/strictARP: true/" | kubectl apply -f - -n kube-system

# 重启kube-proxy确保配置生效

$ kubectl rollout restart ds kube-proxy -n kube-system

# 确认配置生效

$ kubectl get configmap -n kube-system kube-proxy -o yaml | grep strictARP

strictARP: true

开启之后k8s集群中的kube-proxy会停止响应kube-ipvs0网卡之外的其他网卡的arp请求,而由MetalLB接手处理。 strict ARP开启之后相当于把将arp_ignore设置为1;并将arp_announce设置为2启用严格的ARP,这个原理和LVS中的DR模式对RS的配置一样,可以参考之前的文章中的解释。

网卡配置

#多个网卡,需要指定master节点IP,一个网卡不需要

# kubectl annotate nodes k8s-master01 layer2.openelb.kubesphere.io/v1alpha1="masterip"

创建EIP

接下来我们需要配置loadbalancerIP所在的网段资源,这里我们创建一个Eip对象来进行定义,后面对IP段的管理也是在这里进行。

部署eip

apiVersion: network.kubesphere.io/v1alpha2

kind: Eip

metadata:

# Eip 对象的名称。

name: layer2-eip

spec:

# Eip 对象的地址池

address: 10.0.0.122-10.0.0.123

# openELB的运行模式,默认为bgp

protocol: layer2

# OpenELB 在其上侦听 ARP/NDP 请求的网卡。该字段仅在protocol设置为时有效layer2。

interface: ens160

# 指定是否禁用 Eip 对象

# false表示可以继续分配

# true表示不再继续分配

disable: false

status:

# 指定 Eip 对象中的IP地址是否已用完。

occupied: false

# 指定 Eip 对象中有多少个 IP 地址已分配给服务。

# 直接留空,系统会自动生成

usage:

# Eip 对象中的 IP 地址总数。

poolSize: 2

# 指定使用的 IP 地址和使用 IP 地址的服务。服务以Namespace/Service name格式显示(例如,default/test-svc)。

# 直接留空,系统会自动生成

used:

# Eip 对象中的第一个 IP 地址。

firstIP: 10.0.0.122

# Eip 对象中的最后一个 IP 地址。

lastIP: 10.0.0.123

ready: true

# 指定IP协议栈是否为 IPv4。目前,OpenELB 仅支持 IPv4,其值只能是true.

v4: true

检查eip状态

kubectl apply -f openelb/openelb-eip.yaml

#部署完成后检查eip的状态

kubectl get eip

部署openelb

这里我们还是使用yaml进行部署,官方把所有部署的资源整合到了一个文件中,我们还是老规矩先下载到本地再进行部署

apiVersion: v1

kind: Namespace

metadata:

name: openelb-system

---

apiVersion: apiextensions.k8s.io/v1

kind: CustomResourceDefinition

metadata:

annotations:

controller-gen.kubebuilder.io/version: v0.4.0

creationTimestamp: null

name: bgpconfs.network.kubesphere.io

spec:

group: network.kubesphere.io

names:

kind: BgpConf

listKind: BgpConfList

plural: bgpconfs

singular: bgpconf

scope: Cluster

versions:

- name: v1alpha1

schema:

openAPIV3Schema:

description: BgpConf is the Schema for the bgpconfs API

properties:

apiVersion:

description: '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/sig-architecture/api-conventions.md#resources'

type: string

kind:

description: '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: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'

type: string

metadata:

type: object

spec:

description: struct for container bgp:config. Configuration parameters

relating to the global BGP router.

properties:

as:

description: original -> bgp:as bgp:as's original type is inet:as-number.

Local autonomous system number of the router. Uses the 32-bit as-number

type from the model in RFC 6991.

format: int32

type: integer

port:

description: original -> gobgp:port

format: int32

maximum: 65535

minimum: 1

type: integer

routerID:

description: original -> bgp:router-id bgp:router-id's original type

is inet:ipv4-address. Router id of the router, expressed as an 32-bit

value, IPv4 address.

pattern: ^([0-9]{

1,3}\.){

3}[0-9]{

1,3}$

type: string

required:

- as

- port

- routerID

type: object

status:

description: BgpConfStatus defines the observed state of BgpConf

type: object

type: object

served: true

storage: false

- name: v1alpha2

schema:

openAPIV3Schema:

description: BgpConf is the Schema for the bgpconfs API

properties:

apiVersion:

description: '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/sig-architecture/api-conventions.md#resources'

type: string

kind:

description: '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: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'

type: string

metadata:

type: object

spec:

description: Configuration parameters relating to the global BGP router.

properties:

as:

format: int32

type: integer

asPerRack:

additionalProperties:

format: int32

type: integer

type: object

families:

items:

format: int32

type: integer

type: array

gracefulRestart:

properties:

deferralTime:

format: int32

type: integer

enabled:

type: boolean

helperOnly:

type: boolean

localRestarting:

type: boolean

longlivedEnabled:

type: boolean

mode:

type: string

notificationEnabled:

type: boolean

peerRestartTime:

format: int32

type: integer

peerRestarting:

type: boolean

restartTime:

format: int32

type: integer

staleRoutesTime:

format: int32

type: integer

type: object

listenAddresses:

items:

type: string

type: array

listenPort:

format: int32

type: integer

policy:

type: string

routerId:

type: string

useMultiplePaths:

type: boolean

type: object

status:

description: BgpConfStatus defines the observed state of BgpConf

properties:

nodesConfStatus:

additionalProperties:

properties:

as:

format: int32

type: integer

routerId:

type: string

type: object

type: object

type: object

type: object

served: true

storage: true

subresources:

status: {

}

status:

acceptedNames:

kind: ""

plural: ""

conditions: []

storedVersions: []

---

apiVersion: apiextensions.k8s.io/v1

kind: CustomResourceDefinition

metadata:

annotations:

controller-gen.kubebuilder.io/version: v0.4.0

creationTimestamp: null

name: bgppeers.network.kubesphere.io

spec:

group: network.kubesphere.io

names:

kind: BgpPeer

listKind: BgpPeerList

plural: bgppeers

singular: bgppeer

scope: Cluster

versions:

- name: v1alpha1

schema:

openAPIV3Schema:

description: BgpPeer is the Schema for the bgppeers API

properties:

apiVersion:

description: '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/sig-architecture/api-conventions.md#resources'

type: string

kind:

description: '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: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'

type: string

metadata:

type: object

spec:

properties:

addPaths:

description: original -> bgp:add-paths Parameters relating to the

advertisement and receipt of multiple paths for a single NLRI (add-paths).

properties:

sendMax:

description: original -> bgp:send-max The maximum number of paths

to advertise to neighbors for a single NLRI.

type: integer

type: object

config:

description: original -> bgp:neighbor-address original -> bgp

参考链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: