什么是 ALB
- 全稱 Application Load Balancer,是 AWS Elastic Load Balancing 中的一款產品
- Application Load Balancer 最適合 HTTP 和 HTTPS 流量的負載均衡
- 詳細功能
什么是 EKS
- Amazon Elastic Kubernetes Service (Amazon EKS) 是一項托管服務,可用于在 上運行 AWS Kubernetes,而無需安裝、操作和維護您自己的 Kubernetes 控制層面或節(jié)點
- 默認 k8s master 是在 aws 托管 VPC 內對用戶不可見,只暴露了 API 接口,與用戶所在 node VPC 需要通過 兩個 ENI 接口進行通訊
如何結合
- 需要引入一個 aws-load-balancer-controller
-
v2.0.0 版本開始 AWS ALB Ingress Controller 正式更名為 AWS LoadBalancer Controller 并 GA!(Our first GA release for AWS Load Balancer Controller ?? (aka. AWS ALB Ingress Controller v2))
- 再次證明了,AWS 生態(tài)的完善。此插件基本上就是官方放出來讓社區(qū)自己來完善并不斷迭代
- v2 版本開始,不單單只是一個 alb 的控制器了,添加了 nlb 的控制,至此可以同時支持 4 & 7 層
- controller 監(jiān)聽 k8s api server,其實是 watch ingress 的變化,當發(fā)現有變更,調用 aws api 觸發(fā) alb rule 變化,同時把一個 ingress 的 annotations 配置添加到 alb 中
- 依靠 ALB 本身就有的權重能力,配合 ingress annotations 配置多個 group + order(
alb.ingress.kubernetes.io/group.name & alb.ingress.kubernetes.io/group.order
)來實現單 k8s 的藍綠部署
-
How it works
注意點
- Rules per load balancer (not counting default rules) :100
- CD 系統(tǒng)適配
- 無多 K8S 集群能力
- 其他(發(fā)掘中。。。)
想象力
- 其實這個東西就差最后一步即可實現多 K8S 集群的流量調度,本身 ALB 就有這個能力做這個事情,畢竟其實就是 Nginx
- 比如可以基于 ALB 的 TargetGroup 將不同的 K8S 的 Node 放入,接著依賴 ALB 的權重能力來實現多集群調度流量,這個需求其實還是存在的,單集群的 K8S 其實當有重大升級操作 Or 其他特殊原因的事情很容易一把全掛的情況發(fā)生
- 慢慢讀代碼,嘗試添加此功能中。還是有蠻多細節(jié)需要注意的,比如需要注意 AWS API 限流,一次放多少規(guī)則過去,ALB 的 TargetGroup 會不會爆炸??等問題
核心代碼改動思考
- watch Ingress ---> Service ---> Pod ---> PodInfo
- 最后直接獲取 PodInfo 信息后添加到 ALB targetgroup,可以考慮 targetgroupbinding 模塊的邏輯中按照不同的 clusterName 來添加,這樣其實就可以實現同時控制多個 k8s 集群
// buildPodInfo will construct PodInfo for given pod.
func buildPodInfo(pod *corev1.Pod) PodInfo {
podKey := NamespacedName(pod)
var podENIInfos []PodENIInfo
// we kept podENIInfo as nil if the eniInfo via annotation is malformed.
if eniInfo, err := buildPodENIInfos(pod); err == nil {
podENIInfos = eniInfo
}
var containerPorts []corev1.ContainerPort
for _, podContainer := range pod.Spec.Containers {
containerPorts = append(containerPorts, podContainer.Ports...)
}
return PodInfo{
Key: podKey,
UID: pod.UID,
ContainerPorts: containerPorts,
ReadinessGates: pod.Spec.ReadinessGates,
Conditions: pod.Status.Conditions,
PodIP: pod.Status.PodIP,
ENIInfos: podENIInfos,
}
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。