AWS CLI / AKSK
AWS 网页端针对EKS/ECR等未提供网页版资源操作功能, 多数情况下都需要使用cli 和本地的kubectl 来操作资源, 所以需要先安装基础环境
- 下载
https://awscli.amazonaws.com/AWSCLIV2.msi
- AKSK
AWS控制台进入: IAM/安全性/创建访问密钥, 创建一个 AKSK, IDEA插件可以直接配置AKSK使用.
- 命令行登录
命令行输入 aws login ,自动跳转浏览器登录即可
ECR
创建存储库
xxx/yyyy页面创建后获取存储库 URI
push
@echo off
setlocal enabledelayedexpansion
:: 1. 检查是否安装了 aws CLI
where aws >nul 2>nul
if errorlevel 1 (
echo [错误] 未找到 aws 命令,请先安装 AWS CLI。
exit /b 1
)
:: 2. 获取当前时间(格式:YYYYMMDDHHmm)
for /f "usebackq delims=" %%a in (`powershell -Command "Get-Date -Format 'yyyyMMddHHmm'"`) do set mydatetime=%%a
echo 构建标签时间戳: %mydatetime%
:: 3. 设置镜像标签
set DOCKER_TAG=V2.0.12-%mydatetime%
echo 镜像标签: %DOCKER_TAG%
:: 4. 获取 ECR 临时密码
echo 正在获取 ECR 临时密码(区域: us-east-1)...
for /f "usebackq delims=" %%p in (`aws ecr get-login-password --region us-east-1`) do set ECR_PASSWORD=%%p
if errorlevel 1 (
echo [错误] 获取 ECR 密码失败,请检查 AWS CLI 配置和网络。
exit /b 1
)
echo ECR 密码已获取(长度: !ECR_PASSWORD:~0,5!...)
:: 5. 使用获取到的密码登录到 ECR
echo 正在登录到 ECR...
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 862087104231.dkr.ecr.us-east-1.amazonaws.com
if errorlevel 1 (
echo [错误] docker login 失败,请检查 Docker 是否运行。
exit /b 1
)
echo 登录成功!
:: 6. 执行 Maven 构建(只 build,不 push)
set IMAGE_NAME=*****.dkr.ecr.us-east-1.amazonaws.com/demo/demo:%DOCKER_TAG%
@echo 镜像构建 %IMAGE_NAME% begin...
docker build -t %IMAGE_NAME% .
@echo 结束部署
:: 7. 手动推送镜像
echo 推送镜像: %IMAGE_NAME%
docker push %IMAGE_NAME%
if errorlevel 1 (
echo [错误] Docker 推送失败
exit /b 1
)
echo ================================
echo 推送镜像成功!
echo ================================
endlocalRDS
EKS
IAM Policy
使用ROOT账号给IAM账号赋权 AmazonEKSAdminPolicy
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"aed"},"name":"aed","namespace":"default"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"aed"}},"strategy":{"rollingUpdate":{"maxSurge":"25%","maxUnavailable":"25%"},"type":"RollingUpdate"},"template":{"metadata":{"annotations":{"redeploy-timestamp":"1727438872541"},"labels":{"app":"aed"}},"spec":{"containers":[{"env":[{"name":"LANG","value":"en_US.UTF-8"},{"name":"LANGUAGE","value":"en_US:en"},{"name":"JAVA_HOME","value":"/usr/lib/jvm/jdk-17.0.10-bellsoft-x86_64"},{"name":"TZ","value":"Asia/Shanghai"},{"name":"PARAMS","valueFrom":{"configMapKeyRef":{"key":"PARAMS","name":"aed-prod-params"}}}],"image":"862087104231.dkr.ecr.us-east-1.amazonaws.com/aed/iwork-aed:V2.0.12-202607151522","imagePullPolicy":"Always","name":"aed","ports":[{"containerPort":80,"name":"ng","protocol":"TCP"},{"containerPort":5701,"name":"hz","protocol":"TCP"}],"resources":{"requests":{"cpu":"500m","ephemeral-storage":"4Gi","memory":"1Gi"}}}],"dnsPolicy":"ClusterFirst","imagePullSecrets":[{"name":"aed"}],"restartPolicy":"Always","schedulerName":"default-scheduler","securityContext":{},"terminationGracePeriodSeconds":30}}}}
labels:
app: aed
name: aed
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: aed
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
redeploy-timestamp: "1727438872541"
labels:
app: aed
spec:
containers:
- env:
- name: LANG
value: en_US.UTF-8
- name: LANGUAGE
value: en_US:en
- name: JAVA_HOME
value: /usr/lib/jvm/jdk-17.0.10-bellsoft-x86_64
- name: TZ
value: Asia/Shanghai
- name: PARAMS
valueFrom:
configMapKeyRef:
key: PARAMS
name: aed-prod-params
image: *****.dkr.ecr.us-east-1.amazonaws.com/demo/demo:1
imagePullPolicy: Always
name: aed
ports:
- containerPort: 80
name: ng
protocol: TCP
- containerPort: 5701
name: hz
protocol: TCP
resources:
requests:
cpu: 500m
ephemeral-storage: 4Gi
memory: 1Gi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: aed
restartPolicy: Always
schedulerName: default-scheduler
securityContext: { }
terminationGracePeriodSeconds: 30ConfigMap
configMap的 key 要和上面的 引用的 key保持一致
apiVersion: v1
kind: ConfigMap
metadata:
name: aed-prod-params
namespace: default
data:
PARAMS: |
-Dspring.profiles.active=prodService
ALB和NLB
对于需要 TCP服务和HTTPS服务而言,常见的思路有两种:
- 融合架构:NLB (四层) as a Target for ALB (七层) + 纯 TCP 业务直连
在 EKS 生产环境中,通常会面临 HTTP/HTTPS (Web 应用) 与纯 TCP (物联网/长连接) 流量共存的场景。 本方案将 AWS NLB 置于公网最前端作为“唯一入口”,通过端口分流: 80/443 端口:转发给内网 ALB,由 ALB 负责 SSL 证书卸载与七层域名/路径路由。 9122 端口:直接转发给后端的 codec Pod,避开 ALB,支持高性能 TCP 长连接。
- 极简解耦架构:公网 ALB (七层) + 独立公网 NLB (四层)
通过采用两个独立的域名,我们将网页业务与 TCP 业务在 DNS 层面彻底剥离。两套流量各走各的负载均衡通道,互不干扰,架构极其清爽。
ALB 安装
第一步:安装 eksctl 和 helm
CloudShell 默认没有这两个工具,需要先装上。
安装 eksctl:
PLATFORM=$(uname -s)_amd64
curl -L "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$PLATFORM.tar.gz" | tar -xz -C /tmp
sudo mv /tmp/eksctl /usr/local/bin安装 helm:
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash第二步:执行安装命令
然后,你就可以完全按照我们之前讨论的步骤,在 CloudShell 中依次执行所有命令了:
创建 IAM OIDC 提供商 (你已经做过了):
eksctl utils associate-iam-oidc-provider --cluster aed --region us-east-1 --approve下载并创建 IAM 策略:
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.3/docs/install/iam_policy.json
aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json创建 ServiceAccount 并绑定 IAM 角色:
eksctl create iamserviceaccount \
--cluster=aed \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--attach-policy-arn=arn:aws:iam::862087104231:policy/AWSLoadBalancerControllerIAMPolicy \
--override-existing-serviceaccounts \
--region us-east-1 \
--approve安装 AWS Load Balancer Controller:
helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
--set clusterName=aed \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=us-east-1 \
--set vpcId=<你的VPC_ID> \
-n kube-system小提示:vpcId 参数是必须的,可以通过以下命令获取:
bashaws eks describe-cluster --name aed --region us-east-1 --query "cluster.resourcesVpcConfig.vpcId" --output text
✅ 安装后验证
安装完成后,记得检查一下 Controller Pod 是否正常运行:
kubectl get pods -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller看到 Pod 状态为 Running 就说明安装成功了。之后,你的 Ingress 资源就会被控制器接管,ALB 也会自动创建出来。
ClusterIP Service
apiVersion: v1
kind: Service
metadata:
name: aed
namespace: default
spec:
ports:
- name: aed
port: 443
targetPort: 80
protocol: TCP
selector:
app: aed
type: ClusterIPNLB Service
apiVersion: v1
kind: Service
metadata:
name: codec-nlb
namespace: default
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
spec:
type: LoadBalancer
selector:
app: codec # 准确勾连你的 codec 容器
ports:
- name: tcp-codec
port: 9122 # NLB 对外暴露的公网端口
targetPort: 9122 # 容器内部监听的端口
protocol: TCPkubectl get svc codec-nlb -n default 获取 aws 域名
安全组和目标群组
在 ip 模式下,NLB 会直接使用集群私有子网的 IP(即 NLB 所在子网的 IP)去连接你的 Pod。 排查动作:
- 找到你 EKS 实例(Worker Node)所绑定的安全组 (Security Group)。
- 检查其入站规则 (Inbound Rules)。
- 必须确保允许:协议 = TCP, 端口 = 9122, 源地址 = 0.0.0.0/0 或者是你的“VPC 网段 CIDR”(例如 192.168.0.0/16)。
- 如果安全组没开,EKS 的网卡会直接丢弃 NLB 的健康检查流量,导致不健康。
NLB TCP 测试
Test-NetConnection -ComputerName "k8s-default-codecnlb-b3277b8189-4f8d0b35fddd89a8.elb.us-east-1.amazonaws.com" -Port 9122
Hazelcast集群
对 hazelcast集群而言, 只需要配置一个 clustIp模式 的service 即可, 需要注意的就是 hz 进去 DNS
apiVersion: v1
kind: Service
metadata:
name: hazelcast
namespace: default
spec:
clusterIP: None
clusterIPs:
- None
internalTrafficPolicy: Cluster
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
ports:
- name: hazelcast
port: 5701
protocol: TCP
targetPort: 5701
selector:
app: aed
sessionAffinity: None
type: ClusterIP集群的DNS发现的 域名需要配置如下: , 启动 default代表 pod 的 namespace
config.getNetworkConfig().getJoin().getKubernetesConfig().setEnabled(true) .setProperty("service-dns", dns);hazelcast.default.svc.cluster.local
Ingress
ALB证书
使用 aws cli 导入证书获取 arn key
aws acm import-certificate --certificate fileb://demo.com.pem --private-key fileb://demo.com.key --certificate-chain fileb://chain.pem --region us-east-1
ALB Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aed
namespace: default
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:******:certificate/********
alb.ingress.kubernetes.io/ssl-redirect: '443'
alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
alb.ingress.kubernetes.io/healthcheck-path: /
alb.ingress.kubernetes.io/success-codes: 200-499
spec:
ingressClassName: alb
rules:
- host: *******.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: aed
port:
number: 443CloudWatch
启用 Amazon EKS 的 CloudWatch Container Insights, 最推荐的方式是使用 Amazon CloudWatch Observability EKS 附加组件 (Add-on)
第一步:配置 IAM 权限
直接附加到 Worker 节点 IAM 角色(较简单,权限较大) 将 CloudWatchAgentServerPolicy 托管策略附加到你的 EKS 工作节点所在的 IAM 角色
aws iam attach-role-policy \
--role-name YourWorkerNodeRoleName \
--policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy第二步:安装 EKS 附加组件
在 AWS 控制台进入 Amazon EKS 服务。
选择你的集群,点击 “附加组件” 选项卡。
点击 “获取更多附加组件”,在列表中找到并选中 “Amazon CloudWatch Observability”。
点击 “下一步”,确认版本和 IAM 角色(可选择“从节点继承”或之前创建的 IRSA 角色),最后点击 “创建”。