kubernetes openelb

辰星2年前技术文章1175

1、背景

在云服务环境中的 Kubernetes 集群里,通常可以用云服务提供商提供的负载均衡服务来暴露 Service,但是在本地没办法这样操作。而 OpenELB 可以让用户在裸金属服务器、边缘以及虚拟化环境中创建 LoadBalancer 类型的 Service 来暴露服务,并且可以做到和云环境中的用户体验是一致的。

OpenELB 是一个开源的云原生负载均衡器实现,可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务。


OpenELB 项目最初由 KubeSphere 社区 发起,目前已作为 CNCF 沙箱项目 加入 CNCF 基金会,由 OpenELB 开源社区维护与支持。


2、操作前了解相关配置和要求

  1. 了解 NodePort、LoadBalancer、Ingress。那么它们到底有什么不同,要如何正确地使用这些组件?

  2. 了解 OpenELB 的核心功能

    1. BGP 模式和二层网络模式下的负载均衡

    2. ECMP 路由和负载均衡

    3. IP 池管理

    4. 基于 CRD 来管理 BGP 配置

    5. 支持 Helm Chart 方式安装

  1. 了解 OpenELB 工作模式(Layer2、BGP、VIP)


2、操作步骤


2.1 使用 kubectl 安装/删除


"安装"
wget https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yaml
kubectl apply -f openelb.yaml

"查看"
kubectl get pod -n openelb-system

"删除"
kubectl delete -f openelb.yaml


注意: 在删除 OpenELB 之前,必须先删除所有使用 OpenELB 的服务


2.2 使用 helm 安装/删除


"安装"
helm repo add test https://charts.kubesphere.io/test
helm repo update
helm pull test/openelb
helm install openelb . -f values.yaml -n openelb

"查看"
kubectl get pods -n openelb

"删除"
helm delete openelb


2.3 实战


2.3.1 Layer2 示例


前提:


"查看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

"重启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


创建 Eip 对象:


$ cat layer2-eip.yaml
apiVersion: network.kubesphere.io/v1alpha2
kind: Eip
metadata:
  name: layer2-eip
spec:
  address: 172.16.107.201-172.16.107.206  # Eip必须为Node相同网段但是未使用的IP地址池
  interface: enp1s0
  protocol: layer2

$ kubectl apply -f layer2-eip.yaml 
eip.network.kubesphere.io/layer2-eip created

$ kubectl get eip
NAME         CIDR                            USAGE   TOTAL
layer2-eip   172.16.107.201-172.16.107.206           6


创建测试服务:


apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-lb
  namespace: qingyun
spec:
  selector:
    matchLabels:
      app: myapp-lb
  replicas: 1
  template:
    metadata:
      labels:
        app: myapp-lb
    spec:
      containers:
      - name: myapp-lb
        image: zhangyyhub/myapp:v1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: myapp-lb-service
  namespace: qingyun
  annotations:
    lb.kubesphere.io/v1alpha1: openelb               # 指定Service使用OpenELB
    protocol.openelb.kubesphere.io/v1alpha1: layer2  # 指定OpenELB使用第2层模式
    eip.openelb.kubesphere.io/v1alpha2: layer2-eip   # 指定OpenELB使用的Eip对象
spec:
  selector:
    app: myapp-lb
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
  externalTrafficPolicy: Cluster
  # Cluster: OpenELB从所有Kubernetes集群节点中随机选择一个节点来处理Service请求。也可以通过kube-proxy访问其他节点上的Pod。
  # Local: OpenELB会在Kubernetes集群中随机选择一个包含Pod的节点来处理Service请求。只能访问选定节点上的Pod。
  
  # 使用 loadBalancerIP 字段从而指定VIP
  # loadBalancerIP: 10.31.88.113


"部署"
$ kubectl apply -f myapp-layer2-lb.yaml 
deployment.apps/myapp-lb created
service/myapp-lb-service created

"查看pod&service"
$ kubectl get pod,svc -n qingyun
NAME                           READY   STATUS    RESTARTS   AGE
pod/myapp-lb-cf589d555-zcf8p   1/1     Running   0          32s

NAME                       TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
service/myapp-lb-service   LoadBalancer   10.102.62.4   172.16.107.201   80:30591/TCP   32s

$ ip neigh | grep "172.16.107.201"
172.16.107.201 dev enp1s0  FAILED
$ arp -a | grep "172.16.107.201"
master (172.16.107.201) at <incomplete> on enp1s0


验证测试服务:


$ curl http://172.16.107.201
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>


2.3.2 BGP 示例


要使用 BGP 模式,您的路由器必须支持 BGP 和等价多路径(ECMP)路由。

3、注意事项


如果你的 kubernets 集群是在云上的,可以测试 layer2 模式,但最好还是使用云服务商提供的 Cloud LoadBalancer plugin。OpenELB 是为非云上的集群提供服务的。

4、结果检查


OpenELB 各模式下进行分别验证流量。


相关文章

kubernetes调度和调度器

一、Kubernetes调度Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上。听起来非常简单,但有很多要考虑的问题:公平:如何保证每个节点都能被...

hive 报 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster

hive 报 找不到或无法加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster

解决办法:关键需要配置两个配置:mapred-site.xml 和 yarn-site.xml下面配置hadoop classpath。先运行shell命令:hadoop classpath添加一个配...

MySQL运维实战(3.3) 管理数据库(database)

数据库使用create database语句创建数据库。创建数据库的账号需要有create权限。创建数据库用户拥有create权限才能创建数据库。-- 例子:创建dba用户,拥有创建数据库名...

MySQL运维实战(3.1) MySQL官方客户端使用介绍

mysql是mysql安装包默认的客户端。位于二进制安装包的bin目录。或者通过rpm安装包安装mysql-community-client。使用mysql程序linux终端下,输入mysql命令登陆...

大数据集群部署规划(二)硬件配置要求

CPU(虚拟机建议配置*2)X86服务器:最低配置:双路4核Intel处理器。推荐配置:双路8核Intel处理器。ARM服务器:双路32核ARM处理器Bit-mode64位内存(虚拟机不建议超分)物理...

hive元数据迁移

hive元数据迁移

一、在新集群中创建hive数据库,作为新集群中的元数据库。注意点:创建hive数据库时注意用户和用户的权限及使用的编码格式一致。查看旧集群中角色权限和编码格式,在新的hive元数据库中设置相同的角色权...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。