云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上( 三 )

安装K9S这里我们使用前面文章基于Rancher创建好的K8S集群
mkdir k9scd k9s# 下载最新版本v0.26.3wget https://github.com/derailed/k9s/releases/download/v0.26.3/k9s_Linux_x86_64.tar.gz# 解压文件tar -xvf k9s_Linux_x86_64.tar.gz./k9s version

云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

文章插图
直接执行./k9s,冒号后输入也支持简写比如ns
云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

文章插图
OpenLB
  • OpenELB 是一个开源的云原生负载均衡器实现,可以在基于裸金属服务器、边缘以及虚拟化的 Kubernetes 环境中使用 LoadBalancer 类型的 Service 对外暴露服务 。OpenELB 项目最初由 KubeSphere 社区[2] 发起,目前已作为 CNCF 沙箱项目[3] 加入 CNCF 基金会,由 OpenELB 开源社区维护与支持 。
  • 在 k8s 原生集群上部署 OpenELB 作为 k8s 的 LoadBalancer,主要涉及 OpenELB 的 Layer2 模式和 BGP 模式两种部署方案 。
  • 与 MetalLB 类似,OpenELB 也拥有两种主要工作模式:Layer2 模式和 BGP 模式 。OpenELB 的 BGP 模式目前暂不支持 IPv6 。无论是 Layer2 模式还是 BGP 模式,核心思路都是通过某种方式将特定 VIP 的流量引到 k8s 集群中,然后再通过 kube-proxy 将流量转发到后面的特定服务
例如:Layer2 模式需要我们的 k8s 集群基础环境支持发送 anonymous ARP/NDP packets 。因为 OpenELB 是针对裸金属服务器设计的,因此如果是在云环境中部署,需要注意是否满足条件 。
云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

文章插图
  • 图中有一个类型为 LoadBalancer 的 Service,其 VIP 为 192.168.0.91(和 k8s 的节点相同网段),后端有两个 pod(分别为 pod1 和 pod2)
  • 安装在 Kubernetes 集群中的 OpenELB 随机选择一个节点(图中为 worker 1)来处理 Service请求 。当局域网中出现 arp request 数据包来查询 192.168.0.91 的 mac 地址的时候,OpenELB 会进行回应(使用 worker 1 的 MAC 地址),此时路由器(也可能是交换机)将 Service 的 VIP 192.168.0.91 和 worker 1 的 MAC地址绑定,之后所有请求到 192.168.0.91 的数据包都会被转发到 worker1 上
  • Service 流量到达 worker 1 后,worker 1 上的 kube-proxy 将流量转发到后端的两个 pod 进行负载均衡,这些 pod 不一定在 work1 上
主要的工作流程就如同上面描述的一般,但是还有几个需要额外注意的点:
  • 如果 worker 1 出现故障,OpenELB 会重新向路由器发送 APR/NDP 数据包,将 Service IP 地址映射到 worker 2 的 MAC 地址,Service 流量切换到 worker 2
  • 主备切换过程并不是瞬间完成的,中间会产生一定时间的服务中断(具体多久官方也没说,实际上应该是却决于检测到节点宕机的时间加上重新选主的时间)
  • 如果集群中已经部署了多个 openelb-manager 副本,OpenELB 使用 Kubernetes 的领导者选举特性算法来进行选主,从而确保只有一个副本响应 ARP/NDP 请求
# 以yaml方式部署openelbwget https://raw.githubusercontent.com/openelb/openelb/master/deploy/openelb.yamlkubectl apply -f openelb.yaml配置 loadbalancerIP 所在的网段资源,创建一个 Eip 对象来进行定义,后面对 IP 段的管理也是在这里进行
apiVersion: network.kubesphere.io/v1alpha2kind: Eipmetadata:# Eip 对象的名称 。name: eip-layer2-poolspec:# Eip 对象的地址池address: 10.31.88.101-10.31.88.200# openELB的运行模式,默认为bgpprotocol: layer2# OpenELB 在其上侦听 ARP/NDP 请求的网卡 。该字段仅在protocol设置为时有效layer2 。interface: eth0# 指定是否禁用 Eip 对象# false表示可以继续分配# true表示不再继续分配disable: falsestatus:# 指定 Eip 对象中的IP地址是否已用完 。occupied: false# 指定 Eip 对象中有多少个 IP 地址已分配给服务 。# 直接留空,系统会自动生成usage:# Eip 对象中的 IP 地址总数 。poolSize: 100# 指定使用的 IP 地址和使用 IP 地址的服务 。服务以Namespace/Service name格式显示(例如,default/test-svc) 。# 直接留空,系统会自动生成used:# Eip 对象中的第一个 IP 地址 。firstIP: 10.31.88.101# Eip 对象中的最后一个 IP 地址 。lastIP: 10.31.88.20ready: true# 指定IP协议栈是否为 IPv4 。目前,OpenELB 仅支持 IPv4,其值只能是true.v4: true

经验总结扩展阅读