Skip to content

AWS CLI / AKSK

AWS 网页端针对EKS/ECR等未提供网页版资源操作功能, 多数情况下都需要使用cli 和本地的kubectl 来操作资源, 所以需要先安装基础环境

  • 下载

https://awscli.amazonaws.com/AWSCLIV2.msi

  • AKSK

AWS控制台进入: IAM/安全性/创建访问密钥, 创建一个 AKSK, IDEA插件可以直接配置AKSK使用.

  • 命令行登录

命令行输入 aws login ,自动跳转浏览器登录即可

ECR

  1. 创建存储库 xxx/yyyy

    页面创建后获取存储库 URI

  2. 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 ================================
endlocal

RDS

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: 30

ConfigMap

configMap的 key 要和上面的 引用的 key保持一致

apiVersion: v1
kind: ConfigMap
metadata:
  name: aed-prod-params
  namespace: default
data:
  PARAMS: |
    -Dspring.profiles.active=prod

Service

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:

bash
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:

bash
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
第二步:执行安装命令

然后,你就可以完全按照我们之前讨论的步骤,在 CloudShell 中依次执行所有命令了:

创建 IAM OIDC 提供商 (你已经做过了):

bash
eksctl utils associate-iam-oidc-provider --cluster aed --region us-east-1 --approve

下载并创建 IAM 策略:

bash
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 角色:

bash
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:

bash
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 参数是必须的,可以通过以下命令获取:

bash
aws eks describe-cluster --name aed --region us-east-1 --query "cluster.resourcesVpcConfig.vpcId" --output text
✅ 安装后验证

安装完成后,记得检查一下 Controller Pod 是否正常运行:

bash
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: ClusterIP

NLB 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: TCP

kubectl 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: 443

CloudWatch

启用 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 角色),最后点击 “创建”。