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

  • 安装在 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# 配置完成直接部署即可kubectl apply -f openelb/openelb-eip.yaml安装ArgoCDArgoCD 的部署 , 也可以通过官方提供的 Helm Chart 直接部署,但为了了解更多的底层逻辑,这里直接使用官方提供的配置清单安装 。
    # 建命名空间kubectl create namespace argocd# Non-HA:kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.12/manifests/install.yaml# HA:kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.12/manifests/ha/install.yaml# 安装应用 ArgoCD 配置清单,生产使用建议使用stable,https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yamlkubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/master/manifests/install.yaml# 或者先下载再安装wget https://raw.githubusercontent.com/argoproj/argo-cd/v2.4.12/manifests/install.yamlkubectl apply -n argocd -f install.yaml
    云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

    文章插图
    通过k9s查看argocd命名空间的pods
    云原生下基于K8S声明式GitOps持续部署工具ArgoCD实战-上

    文章插图
    默认情况下,Argo CD API服务器不公开外部IP 。要访问API服务器,可以选择以下技术之一来公开Argo CD API服务器:
    • Service Type Load Balancer:修改argocd-server服务类型为LoadBalancer:
    kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
    • Port Forwarding:Kubectl端口转发还可以用于连接到API服务器 , 而不公开服务 。操作如下后可以使用https://localhost:8080访问API服务器
    kubectl port-forward svc/argocd-server -n argocd 8080:443
    • Ingress配置,详细可以参考官方的文档

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

    文章插图
    创建vim argocd-ingress.yaml
    apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: argocd-server-ingressnamespace: argocdannotations:kubernetes.io/tls-acme: "true"kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/force-ssl-redirect: "true"nginx.ingress.kubernetes.io/ssl-passthrough: "true"nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"spec:rules:- host: argocd.test.comhttp:paths:- path: /pathType: Prefixbackend:service:name: argocd-serverport:name: httpstls:- hosts:- argocd.test.comsecretName: argocd-secret

    推荐阅读