安装 cli

安装或更新最新版本的 AWS CLI

1
2
aws configure
aws configure list
  1. 总体设计看这个
  2. 最终看这个

然后输入:aws_access_key_id =aws_secret_access_keyDefault region name: us-east-1,output format 选 json。

推送 ECR

  1. 首先创建一个 ECR 的repo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# latest 不是一个标准 tag,需要给一个镜像打两个 tag:v24 latest
# 完整镜像名:namespace/reponame:tag
docker build -t namespace/reponame:v${{BK_CI_BUILD_NUM}} .

echo "aws sts get-caller-identity"
aws sts get-caller-identity

echo "docker push ima-accountid(去掉-).dkr.ecr.us-east-1.amazonaws.com/namespace/reponame:latest"
docker push ima-accountid(去掉-).dkr.ecr.us-east-1.amazonaws.com/namespace/reponame:v${{BK_CI_BUILD_NUM}}

docker build -t namespace/reponame:latest .

docker save mkt-api-gateway:latest -o /tmp/image/mkt-api-gateway-image.tar

#echo "docker tag mkt-api-gateway:latest ima-accountid(去掉-).dkr.ecr.us-east-1.amazonaws.com/namespace/reponame:latest"
docker tag namespace/reponame:latest ima-accountid(去掉-).dkr.ecr.us-east-1.amazonaws.com/namespace/reponame:latest

#echo "docker push ima-accountid(去掉-).dkr.ecr.us-east-1.amazonaws.com/namespace/reponame:latest"
docker push ima-accountid(去掉-).dkr.ecr.us-east-1.amazonaws.com/namespace/reponame:latest

podman 配置

1
2
3
# 用重定向来给podman login
aws ecr get-login-password --region us-east-1 | \
podman login --username AWS --password-stdin accountid.dkr.ecr.us-east-1.amazonaws.com

eks

prerequisite

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 如果在 docker root 用户下执行,则sudo 可以去掉

sudo yum install -y unzip

# 下载并安装 AWS CLI
sudo yum update -y
sudo yum install -y curl unzip wget tar git python3 python3-pip\n
cd
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"\nunzip awscliv2.zip\n./aws/install\naws --version
rm awscliv2.zip

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"\n
chmod +x kubectl\n
sudo mv kubectl /usr/local/bin/\n
mv kubectl /usr/local/bin/\n
kubectl version --client
curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp\n
sudo mv /tmp/eksctl /usr/local/bin\n
eksctl version
ll /usr/local/bin/
mv /tmp/eksctl /usr/local/bin\n
eksctl version

cluster.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
name: myapp-cluster
region: us-east-1
version: "1.32" # 您可以更改为您想要的 Kubernetes 版本

# 托管节点组配置
managedNodeGroups:
- name: myapp-cluster-nodes
instanceType: t3.medium # 可以根据需求调整,通常是 2c4g
desiredCapacity: 3
minSize: 3
# 这个集群最终要通过命名空间区分不同的业务/租户,所以maxsize实际上要非常大
maxSize: 30
iam:
withAddonPolicies:
imageBuilder: true # 允许访问 ECR

# 集群 IAM 配置
iam:
withOIDC: true # 启用 OIDC 身份提供商

eksctl create cluster -f cluster.yaml

myapp-deployment.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
# 资源分类的 kv,这是一个名字叫 myapp 的 app,属性是 deployment
app: myapp
spec:
# 副本数是 spec 的一部分
replicas: 3 # 指定 3 个副本
selector:
matchLabels:
# 匹配上面的标签的 pod
app: myapp
# 定义 pod
template:
metadata:
labels:
# 为创建的每个 Pod 添加标签 "app: myapp",这使得 selector 能够找到它们。
app: myapp
spec:
# 容器的 spec 是 template 的 spec 的一部分
containers:
- name: myapp
image: ima-accountid(去掉-).dkr.ecr.us-east-1.amazonaws.com/namespace/reponame:latest
ports:
- containerPort: 8111 # 根据您的应用实际端口调整
---
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8111 # 根据您的应用实际端口调整
type: LoadBalancer # 也可以选择 ClusterIP 或 NodePort

kubectl apply -f myapp-deployment.yaml

deployment 和 service 是两种不同的 kind。service 本质上是一组规则,不是任何实体运行的进程。

校验部署状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
aws eks update-kubeconfig --name myapp-cluster --region us-east-1
kubectl apply -f myapp-deployment.yaml
# 看看当前是不是在操作目标集群
kkubectl config current-context

# 检查部署状态
kubectl get deployments

# 查看节点状态
kubectl get nodes

# 查看部署状态
kubectl get deployments

# 查看服务状态及外部访问地址
kubectl get services

# 查看 Pod 状态
kubectl get pods

# 查看 pod 日志
kubectl glogs pod-name

# 进入容器
kubectl exec -it podname -- /bin/bash\n

# 更新版本,方法1
kubectl set image deployment/myapp myapp=680522723063.dkr.ecr.us-east-1.amazonaws.com/namespace/reponame:v40

# 更新版本,方法2
kubectl apply -f myapp-deployment.yaml

# 更新版本,方法3
kubectl edit deployment myapp

# 更新版本,方法4:如果镜像标签没变(比如仍然是 latest),但内容已更新,您可以强制重新部署:
kubectl rollout restart deployment/myapp

# 命令监控更新进度
kubectl rollout status deployment/myapp

# 删除测试pod、service和 deployment

# 首先优雅地停止所有 Pod(通过将副本数设置为0)
kubectl scale deployment mkt-api-gateway2 --replicas=0

# 等待所有 Pod 终止(可选)
kubectl wait --for=delete pod -l app=mkt-api-gateway2 --timeout=60s

# 删除 Deployment 资源(这将自动删除关联的 Pod)
kubectl delete deployment mkt-api-gateway2

# 如果需要,也可以删除关联的 Service
kubectl delete service mkt-api-gateway2-service

路由表补充节点组

通常一个账户能够创建的 vpc 有5个。假设我们创建了一个集群,挂靠到一个vpc,4个subnet。

假设有一个路由表 a。

我们要在vpc里面专门新建一个 internetgateway(互联网网关) igw-df。vpc关联路由表。加了一则新的路由,目标地址为 0.0.0.0/0,并且在目标选择「互联网网关」,填入 igw-df 后保存更改。

回到了 VPC 服务,点选子网,并且选中以下四个子网。编辑子网配置,在自动分配 IP 设置中,我们勾选了「启用自动分配公有 IPv4 地址」选项,并保存。

然后重新建立节点组。