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

问题

我需要在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: service1
  name: service1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: service1
  template:
    metadata:
      labels:
        app: service1
    spec:
      containers:
        - image: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/service1:latest
          name: service1
          resources:
            requests:
              memory: "2Gi"
              cpu: "2"
            limits:
              memory: "2Gi"
              cpu: "2"
          # 准备检查,通过则接入流量
          readinessProbe:
            httpGet:
              path: /foo/actuator/health
              port: 8080
          # 活力检查,不通过时重启容器
          livenessProbe:
            httpGet:
              path: /foo/actuator/health
              port: 8080
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: service1
  name: service1
spec:
  ports:
    - name: http
      port: 4200
      targetPort: 4200
  selector:
    app: service1
  type: ClusterIP

service2

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

service2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: service2
  name: service2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: service2
  template:
    metadata:
      labels:
        app: service2
    spec:
      containers:
        - image: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/service2:latest
          name: service2
          resources:
            requests:
              memory: "2Gi"
              cpu: "2"
            limits:
              memory: "2Gi"
              cpu: "2"
          # 准备检查,通过则接入流量
          readinessProbe:
            httpGet:
              path: /bar/actuator/health
              port: 8080
          # 活力检查,不通过时重启容器
          livenessProbe:
            httpGet:
              path: /bar/actuator/health
              port: 8080
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: service2
  name: service2
spec:
  ports:
    - name: http
      port: 8080
      targetPort: 8080
  selector:
    app: service2
  type: 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: service1
            port:
              number: 4200
        path: /foo
        pathType: Prefix
      - backend:
          service:
            name: service2
            port:
              number: 8080
        path: /bar
        pathType: 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: ingress
  annotations:
  	# 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: alb
  rules:
  - http:
      paths:
      - backend:
          service:
            name: service1
            port:
              number: 4200
        path: /foo
        pathType: Prefix
      - backend:
          service:
            name: service2
            port:
              number: 8080
        path: /bar
        pathType: 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: service1
  name: service1
spec:
  replicas: 2
  selector:
    matchLabels:
      app: service1
  template:
    metadata:
      labels:
        app: service1
    spec:
      containers:
        - image: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/service1:latest
          name: service1
          resources:
            requests:
              memory: "2Gi"
              cpu: "2"
            limits:
              memory: "2Gi"
              cpu: "2"
          # 准备检查,通过则接入流量
          readinessProbe:
            httpGet:
              path: /foo/actuator/health
              port: 8080
          # 活力检查,不通过时重启容器
          livenessProbe:
            httpGet:
              path: /foo/actuator/health
              port: 8080
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: service1
  name: service1
  annotations:
  	# aws目标组健康检查
    alb.ingress.kubernetes.io/healthcheck-path: /for/actuator/health
spec:
  ports:
    - name: http
      port: 4200
      targetPort: 4200
  selector:
    app: service1
  type: ClusterIP

service2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: service2
  name: service2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: service2
  template:
    metadata:
      labels:
        app: service2
    spec:
      containers:
        - image: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/service2:latest
          name: service2
          resources:
            requests:
              memory: "2Gi"
              cpu: "2"
            limits:
              memory: "2Gi"
              cpu: "2"
          # 准备检查,通过则接入流量
          readinessProbe:
            httpGet:
              path: /bar/actuator/health
              port: 8080
          # 活力检查,不通过时重启容器
          livenessProbe:
            httpGet:
              path: /bar/actuator/health
              port: 8080
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: service2
  name: service2
  annotations:
  	# aws目标组健康检查
    alb.ingress.kubernetes.io/healthcheck-path: /bar/actuator/health
spec:
  ports:
    - name: http
      port: 8080
      targetPort: 8080
  selector:
    app: service2
  type: 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: ingress
  annotations:
  	# 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: alb
  rules:
  - http:
      paths:
      - backend:
          service:
            name: service1
            port:
              number: 4200
        path: /foo
        pathType: Prefix
      - backend:
          service:
            name: service2
            port:
              number: 8080
        path: /bar
        pathType: 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

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

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

相关文章

Supplementary Influence Maximization Problem in Social Networks

本论文发表于 IEEE TRANSACTIONS ON COMPUTATIONAL SOCIAL SYSTEMS, VOL. 11, NO. 1, FEBRUARY 2024 Abstract 由于在病毒式营销中的重要应用&#xff0c;影响力最大化&#xff08;IM&#xff09;已成为一个经过充分研究的问题。它的目的是找到一小部分初始用户&#xff0c;以…

智能问数,让数据对话变得如此简单

——用自然语言点亮数据智慧&#xff0c;让深度分析触手可及&#xff0c;让每个人都拥有私人数据分析师。 想象一下&#xff0c;曾经的数据查询&#xff0c;意味着面对着密密麻麻的电子表格&#xff0c;手动筛选、匹配与解读&#xff0c;耗费大量的时间与精力&#xff0c;或者…

【今日面经】24/3/8 又是Java后端面经啊啊啊啊啊啊啊

目录 1.osi七层模型&#xff1f;数据链路层是干什么的&#xff1f;2.tcp三次握手过程&#xff0c;tcp报文头部的结构&#xff1f;里面都有什么&#xff1f;3.讲讲超时重传和快重传&#xff0c;怎么等待的超时重传&#xff08;Timeout Retransmission&#xff09;快速重传&#…

高清数学公式视频素材、科学公式和方程式视频素材下载

适用于科普、解说的自媒体视频剪辑素材&#xff0c;黑色背景数学、科学公式和方程式视频素材下载。 视频编码&#xff1a;H.264 | 分辨率&#xff1a;3840x2160 (4K) | 无需插件 | 文件大小&#xff1a;16.12MB 来自PR视频素材&#xff0c;下载地址&#xff1a;https://prmuban…

Redis持久化机制之RDB内存快照

1、引言 我们经常在数据库层上加一层缓存&#xff08;如Redis&#xff09;&#xff0c;来保证数据的访问效率。 这样性能确实也有了大幅度的提升&#xff0c;因为从内存中取数远比从磁盘中快的多&#xff0c;但是本身Redis也是一层服务&#xff0c;也存在宕机、故障的可能性。…

蓝色经典免费wordpress模板主题

蓝色经典配色的免费wordpress建站主题&#xff0c;万能的wordpress建站主题。 https://www.wpniu.com/themes/24.html

【好书推荐-第十期】《AI绘画教程:Midjourney使用方法与技巧从入门到精通》

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

O2OA(翱途)开发平台如何在流程表单中使用基于Vue的ElementUI组件?

本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计&#xff0c;O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置&#xff0c;不需要过多的代码编写&#xff0c;业务人员可以直接进行修改操作。 在流程表单设计界面&#xff0c;可以在左边的工具栏找到Ele…

Take-home questions——L3

Match the spatial domain image to the Fourier magnitude image 1—D 2—B 3—A 4—E 5—C

STM32F4串口波特率相关时钟

在main中调用的 Stm32_Clock_Init(336, 8, 2, 7); /* 设置时钟,168Mhz *///8*336/8/2168 时钟源,PLL寄存器配置函数: HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef *RCC_OscInitStruct) 系统时钟,总线寄存器配置,及HCLK时钟计算函数: HAL_StatusTyp…

用于回归的概率模型

机器学习中的回归方法&#xff1a; 机器学习中的概率模型 机器学习&#xff5c;总结了11种非线性回归模型&#xff08;理论代码可视化&#xff09; 高斯过程回归&#xff1a; Gaussian Processes for Machine Learning GPML——Datasets and Code Gaussian Processes 学…

力扣-数组题

1. 两数之和 找出map中是否有target-nums[i]&#xff0c; class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {unordered_map<int, int> hash;for(int i 0 ;i < nums.size(); i){if(hash.find(target - nums[i]) ! hash…

Jmeter事务控制器实战

在性能测试工作中&#xff0c;我们往往只测试业务功能相关主要接口的数据请求和返回。然而实际上用户在使用web应用时&#xff0c;可能会加载诸多资源&#xff1a;htmldom、cssdom、javaScript、ajax请求、图片等。 从打开一个页面到界面渲染完成需要一定的加载时间&#xff0…

每日一题——1636.按照频率将数组升序排序

方法一 个人方法 用数组的键值对形式保存每个数字和他出现的次数&#xff0c;将对象的键值对转为数组&#xff0c;对数组进行自定义sort()排序&#xff0c;优先使用出现频次排序&#xff0c;如果出现频次一样就用大小就行排序。 排序完后按照出现频次拼接成字符串再转为数组 …

cannot change locale (zh_CN.UTF-8)

问题描述 在连接Centos7时出现告警提示 bash: warning: setlocale: LC_ALL: cannot change locale (zh_CN.UTF-8) /bin/sh: warning: setlocale: LC_ALL: cannot change locale (zh_CN.UTF-8) 原因分析 系统字符集配置问题 解决方案 查看可用的语言包&#xff0c;确保存在 …

网络基础aaa

三次握手 四次挥手 网络模型 TCP or UDP 的特点 如何理解 TCP 的5层协议 TCP的5层协议是指计算机网络体系结构中&#xff0c;与TCP&#xff08;传输控制协议&#xff09;相关的五个层次。这五个层次从高到低依次是&#xff1a;应用层、传输层、网络层、数据链路层和物理层。每…

cocos creator 3.7.2使用shader实现图片扫光特效

简介 功能&#xff1a;图片实现扫光效果 引擎&#xff1a;cocos Creator 3.7.2 开发语言&#xff1a;ts 完整版链接 链接https://lengmo714.top/284d90f4.html 效果图 shader代码 // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd. CCEffect %{techniques:- pas…

特性螺旋面的刀具设计记录

最近和成型类刀具杠上了&#xff0c;这不最近有小伙伴提供了两个比较特殊的螺旋面工件&#xff0c;通常称作阴、阳转子。具体形状如下&#xff1a; 阴转子 阴转子端面齿形没看出有什么特殊的&#xff0c;但是在轴剖面齿形是内凹的&#xff0c;这个是比较特殊的形式。 阳转子…

智慧园区综合运营数字化解决方案

1. 楼栋管理 2. 物业管理 3. 安防管理 4. 门禁管理 5. 停车管理 6. 能源管理 7. 环保管理 8. 园区生活服务 9. 招商管理 10. 收费中心 11. 园区地图 12. 门户网站 智慧园区软件方案&#xff1a;智慧园区软件解决方案&#xff0c;园区运营管理系统&#xff08;源码&#xff09;-…

【C++】C++模板基础知识篇

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化…