最简k8s部署(AWS Load Balancer Controller使用)

news/2024/4/15 4:29:29/文章来源:https://blog.csdn.net/fxtxz2/article/details/136500538

问题

我需要在k8s集群里面部署springboot服务,通过k8s ingress访问集群内部的springboot服务,应该怎么做?
这里假设已经准备好k8s集群,而且也准备好springboot服务的运行镜像了。这里我们将精力放在k8s服务编排上面。

一图胜千言

ingress最简扇出模式
上图来自于kubernetes的ingress教程。接下来,我们按照上述部署1个ingress+2个服务。

service1

先用kubectl命令创建一个deployment.yaml和service.yaml,然后,将这两个内容合并到一个文件中,即service1.yaml。具体命令如下:
创建deployment.yaml:

kubectl create deployment service1 --image xxx.dkr.ecr.us-east-1.amazonaws.com/service1:latest -o yaml --dry-run=client > k8s/deployment.yaml 

创建service.yaml:

 kubectl create service clusterip service1 --tcp 8080:8080 -o yaml --dry-run=client > k8s/service.yaml 

根据自己需求,去掉一下不要的内容,调整相关配置,合并成如下内容:

service1.yaml

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: service1name: service1
spec:replicas: 2selector:matchLabels:app: service1template:metadata:labels:app: service1spec:containers:- image: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/service1:latestname: service1resources:requests:memory: "2Gi"cpu: "2"limits:memory: "2Gi"cpu: "2"# 准备检查,通过则接入流量readinessProbe:httpGet:path: /foo/actuator/healthport: 8080# 活力检查,不通过时重启容器livenessProbe:httpGet:path: /foo/actuator/healthport: 8080
---
apiVersion: v1
kind: Service
metadata:labels:app: service1name: service1
spec:ports:- name: httpport: 4200targetPort: 4200selector:app: service1type: ClusterIP

service2

按之前service1方式,获得如下内容:

service2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:labels:app: service2name: service2
spec:replicas: 2selector:matchLabels:app: service2template:metadata:labels:app: service2spec:containers:- image: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/service2:latestname: service2resources:requests:memory: "2Gi"cpu: "2"limits:memory: "2Gi"cpu: "2"# 准备检查,通过则接入流量readinessProbe:httpGet:path: /bar/actuator/healthport: 8080# 活力检查,不通过时重启容器livenessProbe:httpGet:path: /bar/actuator/healthport: 8080
---
apiVersion: v1
kind: Service
metadata:labels:app: service2name: service2
spec:ports:- name: httpport: 8080targetPort: 8080selector:app: service2type: ClusterIP

ingress

使用kubectl命令获得ingress基本配置,如下命令:

kubectl create ingress ingress --rule="/path=service1:8080" -o yaml --dry-run=client > k8s/ingress.yaml

根据自己的需求调整后的内容如下:

ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingress
spec:rules:- http:paths:- backend:service:name: service1port:number: 4200path: /foopathType: Prefix- backend:service:name: service2port:number: 8080path: /barpathType: Prefix

这里有个问题,由于我现在使用的aws云,所以,这k8s ingress在aws云环境下面,需要针对这种情况调整aws云相关配置。

AWS EKS配置AWS Load Balancer Controller

为集群创建 IAM OIDC 提供商

找到现有集群的OpenID Connect 提供商 URL值,点击copy,如下图:
复制集群的OpenID
然后,回到IAM主页,为集群创建 IAM OIDC 提供商,具体如下:
添加提供商
创建提供商如下图:
创建身份提供商

AWS Load Balancer Controller 部署到EKS
创建AWSLoadBalancerControllerIAMPolicy策略

我这里用到aws云区是普通云区,所以,这里使用的aws-load-balancer-controller的策略脚本如下:
https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json
下载命令如下:

curl -o iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_policy.json

新建一个策略:

aws iam create-policy \--policy-name AWSLoadBalancerControllerIAMPolicy \--policy-document file://iam-policy.json
创建一个ServiceAccount给k8s
eksctl create iamserviceaccount \
--cluster=<cluster-name> \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::<AWS_ACCOUNT_ID>:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--region <region-code> \
--approve

这里用到eksctl命令,给k8s集群创建一个ServiceAccount服务账号aws-load-balancer-controller,并使用上面之前创建的权限策略。怎么安装eksctl命令,可以看看官网,这里就不提了。

helm安装aws-load-balancer-controller

这里假设我们已经会使用k8s集群的包管理器helm了。
添加EKS资源库到helm,如下命令:

helm repo add eks https://aws.github.io/eks-charts

更新本地资源库,如下命令:

helm repo update eks

安装aws-load-balancer-controller,如下命令:

helm install aws-load-balancer-controller eks/aws-load-balancer-controller --set clusterName=my-cluster -n kube-system --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller

等待一段时间出现,如下反馈,说明aws-load-balancer-controller安装成功:

NAME: aws-load-balancer-controller
LAST DEPLOYED: Thu Mar  7 15:11:01 2024
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
AWS Load Balancer controller installed!

如果出现,如下错误:
Error: INSTALLATION FAILED: cannot re-use a name that is still in use
说明,需要先卸载,再安装,具体命令如下:

helm delete aws-load-balancer-controller -n kube-system

检查k8s集群中aws-load-balancer-controller是否安装成功,具体命令如下:

kubectl get deployment -n kube-system aws-load-balancer-controller

安装成功示例,如下:

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
aws-load-balancer-controller   2/2     2            2           10m

调整ingress配置

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingressannotations:# alb名称alb.ingress.kubernetes.io/load-balancer-name: apg2# 内网alb.ingress.kubernetes.io/scheme: internal# 流量路由到pod层面alb.ingress.kubernetes.io/target-type: ip
spec:# 使用alb作为ingress默认类ingressClassName: albrules:- http:paths:- backend:service:name: service1port:number: 4200path: /foopathType: Prefix- backend:service:name: service2port:number: 8080path: /barpathType: Prefix

调整service配置

除了再ingress里面添加lbc注解之外,还需要再service中添加健康检查的lbc注解:

  annotations:alb.ingress.kubernetes.io/healthcheck-path: /api/demo/actuator/health
service1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: service1name: service1
spec:replicas: 2selector:matchLabels:app: service1template:metadata:labels:app: service1spec:containers:- image: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/service1:latestname: service1resources:requests:memory: "2Gi"cpu: "2"limits:memory: "2Gi"cpu: "2"# 准备检查,通过则接入流量readinessProbe:httpGet:path: /foo/actuator/healthport: 8080# 活力检查,不通过时重启容器livenessProbe:httpGet:path: /foo/actuator/healthport: 8080
---
apiVersion: v1
kind: Service
metadata:labels:app: service1name: service1annotations:# aws目标组健康检查alb.ingress.kubernetes.io/healthcheck-path: /for/actuator/health
spec:ports:- name: httpport: 4200targetPort: 4200selector:app: service1type: ClusterIP
service2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: service2name: service2
spec:replicas: 2selector:matchLabels:app: service2template:metadata:labels:app: service2spec:containers:- image: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/service2:latestname: service2resources:requests:memory: "2Gi"cpu: "2"limits:memory: "2Gi"cpu: "2"# 准备检查,通过则接入流量readinessProbe:httpGet:path: /bar/actuator/healthport: 8080# 活力检查,不通过时重启容器livenessProbe:httpGet:path: /bar/actuator/healthport: 8080
---
apiVersion: v1
kind: Service
metadata:labels:app: service2name: service2annotations:# aws目标组健康检查alb.ingress.kubernetes.io/healthcheck-path: /bar/actuator/health
spec:ports:- name: httpport: 8080targetPort: 8080selector:app: service2type: ClusterIP

部署

kubectl apply -f ./k8s

清除资源:

kubectl delete -f ./k8s

总结

AWS Load Balancer Controller没有重写路径功能,注意安全。这里只介绍的主要是EKS创建ALB在私有VPC内部访问。这里没有介绍CDN套在API接口外面的情况,一般来说,预算足够的情况下面,都会在API接口外面套一层CDN服务。需要注意的是AWS CloudFront(CDN服务)只支持公网的LB。不知道什么原因维护AWS Load Balancer Controller(LBC)团队的人,死活不肯提供重写路径功能。这里还没有服务监控,有机会再介绍介绍吧!
下面是公有ingress创建ALB的配置:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: ingressannotations:# alb名称alb.ingress.kubernetes.io/load-balancer-name: apg2# 只让cdn(CloudFront)访问负载均衡器alb.ingress.kubernetes.io/security-groups: cloudfront-only# pod和node安全组自动生成alb.ingress.kubernetes.io/manage-backend-security-group-rules: "true"# 公网alb.ingress.kubernetes.io/scheme: internet-facing# 流量路由到pod层面alb.ingress.kubernetes.io/target-type: ip
spec:# 使用alb作为ingress默认类ingressClassName: albrules:- http:paths:- backend:service:name: service1port:number: 4200path: /foopathType: Prefix- backend:service:name: service2port:number: 8080path: /barpathType: Prefix

就这样吧,ingress用http端口,然后限制只有cdn节点才能访问,这样公网alb就相对安全了一些。加上前面有cdn的话,基本上没人知道真实的alb地址。

参考:

  • Ingress
  • Deploy a Spring Boot application on a multi-architecture Amazon EKS cluster
  • Spring on Kubernetes
  • Spring Boot Kubernetes
  • Amazon EKS 上的应用程序负载均衡
  • 安装AWS Load Balancer Controller
  • 安装 AWS Load Balancer Controller 附加组件
  • Security Groups for Load Balancers

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_999367.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Image)

Image为图片组件&#xff0c;常用于在应用中显示图片。Image支持加载PixelMap、ResourceStr和DrawableDescriptor类型的数据源&#xff0c;支持png、jpg、jpeg、bmp、svg、webp和gif类型的图片格式。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&am…

【Web安全】htaccess攻击

.htaccess攻击 文章目录 .htaccess攻击1. .htaccess文件2. 常见用法2.1. 自定义出错界面2.2. 强制文件执行方式2.3. PCRE绕过正则匹配2.4. php_value修改php设定2.5. php_value文件包含2.6. 把htaccess当作php 1. .htaccess文件 .htaccess是Apache网络服务器一个配置文件&#…

系统提示mfc100u.dll丢失或错误的解决方法分享

mfc100u.dll是Microsoft Foundation Classes (MFC)库中的一个关键动态链接库文件。 mfc100u.dll文件是Microsoft Foundation Classes (MFC)库的一部分&#xff0c;这是一个为软件开发者提供的一系列类和功能&#xff0c;旨在简化Windows应用程序的开发过程。这个特定的文件包含…

酷开科技以消费者需求为导向冲刺OTT行业的星辰大海

通过大屏营销、互动营销等方式&#xff0c;提升品牌认知度和市场竞争力。酷开科技始终坚持以消费者的需求为导向&#xff0c;致力于为品牌方和消费者搭建高效、准确的沟通桥梁&#xff0c;开创OTT大屏营销新纪元。 伴随技术发展&#xff0c;智能电视已经从“尝鲜”变成了主流产…

GO语言并发编程

点击名片关注 阿尘blog&#xff0c;一起学习&#xff0c;一起成长 1 Goroutine和channel Go语言通过goroutine和channel来实现并发编程。Goroutine是Go语言中轻量级的线程&#xff0c;它由Go运行时&#xff08;runtime&#xff09;管理&#xff0c;并且拥有自己的栈空间。Gorou…

mac本地启动sentinel

启动Sentinel控制台 1&#xff09;下载sentinel控制台jar包 https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar 2&#xff09;启动sentinel控制台 使用如下命令启动控制台&#xff1a; java -Dserver.port8080 -Dcsp.sentinel.d…

flink实战--Flink任务资源自动化优化

背景 在生产环境Flink任务资源是用户在实时平台端进行配置,用户本身对于实时任务具体配置多少资源经验较少,所以存在用户资源配置较多,但实际使用不到的情形。比如一个 Flink 任务实际上 4 个并发能够满足业务处理需求,结果用户配置了 16 个并发,这种情况会导致实时计算资…

Ajax+Axios+前后端分离+YApi+Vue-ElementUI组件+Vue路由+nginx【全详解】

目录 一.Ajax技术 二. Axios 三.前后台分离开发介绍 四. YAPI 五.前端工程化 六.vue工程的目录结构 七.Vue项目核心文件 八.Vue组件库ElementUI AboutView.vue最终代码 AboutView.vue最终代码 九.Vue路由 十.案例 十一.nginx介绍 一.Ajax技术 1.Ajax概述 Ajax: 全…

最新基于R语言lavaan结构方程模型(SEM)技术

原文链接&#xff1a;最新基于R语言lavaan结构方程模型&#xff08;SEM&#xff09;技术https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247596681&idx4&sn08753dd4d3e7bc492d750c0f06bba1b2&chksmfa823b6ecdf5b278ca0b94213391b5a222d1776743609cd3d14…

git分布式管理-头歌实验合并远程分支、rebase、储藏

一、合并远程分支merge 任务描述 在软件开发中&#xff0c;通常会在版本库中创建多个不同的分支进行开发。例如&#xff0c;最基本的可以有一个测试版分支和一个正式版分支&#xff0c;其中测试版分支用来完成最新功能代码的开发与测试&#xff0c;正式版则用于管理即将发布的版…

C# OpenCvSharp DNN 部署L2CS-Net人脸朝向估计

目录 介绍 效果 模型信息 项目 代码 下载 介绍 github地址&#xff1a;https://github.com/Ahmednull/L2CS-Net The official PyTorch implementation of L2CS-Net for gaze estimation and tracking 效果 模型信息 Inputs ------------------------- name&#xff1…

深入探索加载器(Loader)与插件(Plugin)的工作原理与技术实现

在软件开发和构建过程中&#xff0c;加载器与插件是两大核心组件&#xff0c;它们共同助力开发者实现代码的模块化、可扩展性以及复用性。对于技术型论坛的读者来说&#xff0c;理解这两者的工作原理和技术实现至关重要。以下&#xff0c;我们将对加载器和插件进行深入的剖析。…

【大数据】通过 docker-compose 快速部署 MinIO 保姆级教程

文章目录 一、概述二、MinIO 与 Ceph 对比1&#xff09;架构设计对比2&#xff09;数据一致性对比3&#xff09;部署和管理对比4&#xff09;生态系统和兼容性对比 三、前期准备1&#xff09;部署 docker2&#xff09;部署 docker-compose 四、创建网络五、MinIO 编排部署1&…

sheng的学习笔记-AI-多分类学习:ECOC,softmax

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 基本术语&#xff1a; 若我们欲预测的是离散值&#xff0c;例如“好瓜”“坏瓜”&#xff0c;此类学习任务称为“分类”(classification)&#xff1b; 若欲预测的是连续值&#xff0c;例如西瓜成熟度0.95、0.37&#xff0c;…

Java基础数据结构之队列

一.什么是队列 队列是一种先进先出的数据结构&#xff0c;也就是从左边进从右边出&#xff0c;或者说&#xff0c;只允许在一端插入元素&#xff0c;在另一端删除元素 进行插入操作的一端称为队尾&#xff08;tail/rear&#xff09;&#xff0c;删除操作的一段称为队头&#…

第二门课:改善深层神经网络<超参数调试、正则化及优化>-优化算法

文章目录 1 Mini-batch梯度下降2 理解Mini-batch梯度下降法3 指数加权平均数4 理解指数加权平均数5 指数加权平均的偏差修正7 RMSprop<均方根传播>8 Adam优化算法<Momentum与RMSprop结合>9 学习率衰减10 局部最优的问题 1 Mini-batch梯度下降 Batch梯度下降法&…

win11本地账户登录密码忘了

第一个方法&#xff1a;没有权限&#xff08;可以研究下如何拿到权限&#xff0c;我后来没研究&#xff09; 第二个办法解决问题&#xff1a; 参考这个图&#xff1a; 步骤&#xff1a; 0.背景描述&#xff1a;我wly_yxx的账户&#xff08;类型是管理员&#xff09;知道pin可…

eclipse搭建java web项目

准备条件 eclipsejdk1.8 &#xff08;配置jdk环境&#xff09;apache-tomcat-8.5.97&#xff08;记住安装位置&#xff09; 一 点击完成 开始创建javaweb项目 import java.io.IOException; import java.io.PrintWriter;import javax.servlet.ServletException; import javax.s…

数据库系统概念(第一周)

⚽前言 &#x1f3d0;四个基本概念 一、数据 定义 种类 特点 二、数据库 三、数据库管理系统&#xff08;DBMS&#xff09; 四、 数据库系统&#xff08;DBS&#xff09; &#x1f3c0;数据库系统和文件系统对比 文件系统的弊端 &#x1f94e;数据视图 数据抽象 …

开源模型应用落地-工具使用篇-Spring AI-高阶用法(九)

一、前言 通过“开源模型应用落地-工具使用篇-Spring AI-Function Call&#xff08;八&#xff09;-CSDN博客”文章的学习&#xff0c;已经掌握了如何通过Spring AI集成OpenAI以及如何进行function call的调用&#xff0c;现在将进一步学习Spring AI更高阶的用法&#xff0c;如…