用手动操作 EKS 并对其机制有一定的理解
eksctl的安装
参照文档中介绍,根据各自的环境安装 eksctl。
确认是否安装了 eksctl。
eksctl version
使用kubectl进行安装。
我們將根據各個環境的需要,安裝相應的 kubectl,並參考相關文件。
确认kubectl已经安装。
kubectl version --short --client
安装每个工具
根据需要,在使用Kubernetes时常常使用的一些便利工具的安装以及配置命令自动补全。
集群 (jú
准备用于创建集群的cluster.yaml文件如下。
为了降低成本,我们使用了较小的节点。另外,也可以创建在现有的 VPC 上,请参考上述文档或者查看文章后半部分。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-cluster
region: ap-northeast-1
version: "1.25"
nodeGroups:
- name: eks-ng
instanceType: t3.small
desiredCapacity: 1
执行以下命令将创建集群。
eksctl create cluster -f cluster.yaml
确认正在运动的节点。
$ kubectl get node
NAME STATUS ROLES AGE VERSION
ip-192-168-92-235.ap-northeast-1.compute.internal Ready <none> 2m40s v1.25.7-eks-a59e1f0
如果不使用EC2,需要收费,您可以使用以下命令删除节点。
$ eksctl delete nodegroup -f cluster.yaml --approve
豆荚
创建一个名为 nginx.yaml 的文件来启动 nginx 容器。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: nginx:latest
name: nginx
restartPolicy: Always
使用kubectl apply命令部署pod。
$ kubectl apply -f nginx.yaml
pod/nginx created
我们需要确认一下,pod 是否已经成功启动了。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 89s
节点端口
在nginx.yaml文件中添加一个Service。
apiVersion: v1
kind: Pod
metadata:
name: nginx
# selector に合わせることで そのリソースと紐づく
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
restartPolicy: Always
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
# labels に合わせることで そのリソースと紐づく
selector:
app: nginx
type: NodePort
用kubectl apply 命令部署服务。
$ kubectl apply -f nginx.yaml
service/nginx created
确认NodePort已启动。
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 7h43m
nginx NodePort 10.100.178.212 <none> 80:31142/TCP 7s
通过以下命令查看节点的详细信息,并通过访问 X.X.X.X:31142 可以显示 Nginx 页面。请注意,需要在安全组中放开该端口。
$ kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-192-168-42-127.ap-northeast-1.compute.internal Ready <none> 7h39m v1.25.7-eks-a59e1f0 192.168.42.127 X.X.X.X Amazon Linux 2 5.10.178-162.673.amzn2.x86_64 containerd://1.6.19
AWS负载均衡器控制器
准备包含IAM策略更新的cluster.yaml文件来添加到节点中。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-cluster
region: ap-northeast-1
version: "1.25"
nodeGroups:
- name: eks-ng
instanceType: t3.small
desiredCapacity: 1
# AWS Load Balancer Controller を動かすための IAMポリシーを設定します。
iam:
withAddonPolicies:
awsLoadBalancerController: true
部署节点。
$ eksctl create nodegroup -f cluster.yaml
部署Pod。
$ kubectl apply -f nginx.yaml
pod/nginx created
请根据以下页面参考,安装AWS负载均衡器控制器。
确认 AWS 负载均衡控制器已被创建。
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
aws-load-balancer-controller-7b66fb998b-twkgf 1/1 Running 0 20m
创建用于部署ALB的Ingress。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
annotations:
# AWS Load Balancer Controller の設定内容を記述する
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
spec:
rules:
- http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: Prefix
使用 kubectl apply 命令部署 Ingress。
$ kubectl apply -f nginx-ingress.yaml
ingress.networking.k8s.io/nginx created
请使用以下命令确认ALB的DNS名称,并通过curl或浏览器确保可以访问。
aws elbv2 describe-load-balancers --query 'LoadBalancers[].DNSName[]'
健康检查
请按如下方式创建nginx.yaml文件。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
# Pod が正常に起動しているか確認する。
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
# Pod がサービスインする準備ができているかを確認する。
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
使用 kubectl apply 命令部署 Pod。
$ kubectl apply -f nginx.yaml
使用 kubectl describe 命令来查看 Pod 的详细配置。
$ kubectl describe pods nginx
Liveness: http-get http://:80/ delay=5s timeout=1s period=10s #success=1 #failure=3
Readiness: http-get http://:80/ delay=5s timeout=1s period=10s #success=1 #failure=3
为了确认操作,我们可以在一个新标签页中使用-w选项来检查Pod的状态。
$ kubectl get pods -w
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 7m33s
使用 kubectl exec 命令,进入 Pod 中,模拟并结束该 Pod。
$ kubectl exec nginx -it /bin/sh
# rm /usr/share/nginx/html/index.html
当您检查在另一个选项卡中打开的Pod的状态时,可以确认已经启动了一个新的Pod。
$ kubectl get pods -w
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 7m33s
nginx 0/1 Running 0 8m
nginx 0/1 Running 1 (2s ago) 8m3s
nginx 1/1 Running 1 (9s ago) 8m10s
部署
请按以下方式创建nginx.yaml文件。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
# nginx という Deployment が作成されます。
name: nginx
spec:
# 1 つのレプリカ Pod を作成します。
replicas: 1
selector:
# Deployment が管理する Pod のラベルを定義。
matchLabels:
app: nginx
strategy: {}
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
用kubectl apply进行部署。
$ kubectl apply -f nginx.yaml
检查部署和Pod的状态。
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 81s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-84fdd6fdbd-lqzj5 1/1 Running 0 60s
惠普
请参考以下页面的内容,安装metrics-server。
使用 kubectl top 命令可以确认查看节点的 CPU 和内存状态。
$ kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
ip-192-168-37-209.ap-northeast-1.compute.internal 45m 2% 635Mi 43%
请创建以下内容的 nginx.yaml 文件。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
# 1 コア の 1/10 の値を要求する。
resources:
requests:
cpu: 100m
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
创建一个能够将Pod的副本数量保持在1到10之间的HPA。
$ kubectl autoscale deployment nginx --cpu-percent 50 --min 1 --max 10
horizontalpodautoscaler.autoscaling/nginx autoscaled
我会确认HPA的状态。
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 1%/50% 1 10 1 21m
使用Apache-Bench容器对负载进行测试,以确保Pod可以扩展。
$ kubectl run apache-bench -i --tty --rm --image httpd -- /bin/sh
If you don't see a command prompt, try pressing enter.
while true;
> do ab -n 10 -c 10 http://nginx.default.svc.cluster.local/ > /dev/null;
> done
确认Pod或HPA的运行状态。
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
apache-bench 1/1 Running 0 3m47s
nginx-6c85484665-t9n4g 1/1 Running 0 14m
nginx-6c85484665-xb5jv 0/1 Pending 0 0s
nginx-6c85484665-xb5jv 0/1 Pending 0 0s
$ kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx Deployment/nginx 150%/50% 1 10 4 34m
nginx Deployment/nginx 162%/50% 1 10 4 34m
nginx Deployment/nginx 163%/50% 1 10 4 35m
集群自动缩放器
请按照以下方式创建一个名为 cluster.yaml 的文件,其中包含一个范围为1到3的集群。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-cluster
region: ap-northeast-1
version: "1.22"
nodeGroups:
- name: eks-ng
instanceType: t3.small
desiredCapacity: 1
# 最小1/最大のノード数を指定。
minSize: 1
maxSize: 3
iam:
withAddonPolicies:
awsLoadBalancerController: true
# AutoScaler を利用できるように設定を追加。
autoScaler: true
按照下一页中的说明,准备cluster-autoscaler.yaml文件。
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-addon: cluster-autoscaler.addons.k8s.io
k8s-app: cluster-autoscaler
name: cluster-autoscaler
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cluster-autoscaler
labels:
k8s-addon: cluster-autoscaler.addons.k8s.io
k8s-app: cluster-autoscaler
rules:
- apiGroups: [""]
resources: ["events", "endpoints"]
verbs: ["create", "patch"]
- apiGroups: [""]
resources: ["pods/eviction"]
verbs: ["create"]
- apiGroups: [""]
resources: ["pods/status"]
verbs: ["update"]
- apiGroups: [""]
resources: ["endpoints"]
resourceNames: ["cluster-autoscaler"]
verbs: ["get", "update"]
- apiGroups: [""]
resources: ["nodes"]
verbs: ["watch", "list", "get", "update"]
- apiGroups: [""]
resources:
- "pods"
- "services"
- "replicationcontrollers"
- "persistentvolumeclaims"
- "persistentvolumes"
verbs: ["watch", "list", "get"]
- apiGroups: ["extensions"]
resources: ["replicasets", "daemonsets"]
verbs: ["watch", "list", "get"]
- apiGroups: ["policy"]
resources: ["poddisruptionbudgets"]
verbs: ["watch", "list"]
- apiGroups: ["apps"]
resources: ["statefulsets", "replicasets", "daemonsets"]
verbs: ["watch", "list", "get"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses", "csinodes"]
verbs: ["watch", "list", "get"]
- apiGroups: ["batch", "extensions"]
resources: ["jobs"]
verbs: ["get", "list", "watch", "patch"]
- apiGroups: ["coordination.k8s.io"]
resources: ["leases"]
verbs: ["create"]
- apiGroups: ["coordination.k8s.io"]
resourceNames: ["cluster-autoscaler"]
resources: ["leases"]
verbs: ["get", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: cluster-autoscaler
namespace: kube-system
labels:
k8s-addon: cluster-autoscaler.addons.k8s.io
k8s-app: cluster-autoscaler
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["create","list","watch"]
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["cluster-autoscaler-status", "cluster-autoscaler-priority-expander"]
verbs: ["delete", "get", "update", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: cluster-autoscaler
labels:
k8s-addon: cluster-autoscaler.addons.k8s.io
k8s-app: cluster-autoscaler
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-autoscaler
subjects:
- kind: ServiceAccount
name: cluster-autoscaler
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cluster-autoscaler
namespace: kube-system
labels:
k8s-addon: cluster-autoscaler.addons.k8s.io
k8s-app: cluster-autoscaler
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: cluster-autoscaler
subjects:
- kind: ServiceAccount
name: cluster-autoscaler
namespace: kube-system
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: cluster-autoscaler
namespace: kube-system
labels:
app: cluster-autoscaler
spec:
replicas: 1
selector:
matchLabels:
app: cluster-autoscaler
template:
metadata:
labels:
app: cluster-autoscaler
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '8085'
spec:
serviceAccountName: cluster-autoscaler
containers:
# kubernetes のバージョンに合わせる。
- image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.25.6
name: cluster-autoscaler
resources:
limits:
cpu: 100m
memory: 600Mi
requests:
cpu: 100m
memory: 600Mi
command:
- ./cluster-autoscaler
- --v=4
- --stderrthreshold=info
- --cloud-provider=aws
- --skip-nodes-with-local-storage=false
- --expander=least-waste
# 環境のクラスター名前に変更。
- --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,k8s.io/cluster-autoscaler/eks-cluster
volumeMounts:
- name: ssl-certs
mountPath: /etc/ssl/certs/ca-certificates.crt #/etc/ssl/certs/ca-bundle.crt for Amazon Linux Worker Nodes
readOnly: true
imagePullPolicy: "Always"
volumes:
- name: ssl-certs
hostPath:
path: "/etc/ssl/certs/ca-bundle.crt"
使用kubectl apply命令来部署cluster-autoscaler。
$ kubectl apply -f cluster-autoscaler-autodiscover.yaml
确认 cluster-autoscaler 已经被创建。
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
cluster-autoscaler-7c44b7fc58-7pllg 0/1 ImagePullBackOff 0 106s
使用kubectl apply命令部署Pod。
$ kubectl apply -f nginx.yaml
我們將使用Pod的複製品,將其放大到10個範例以檢查集群是否能夠進行擴展。
$ kubectl scale deployment --replicas 10 nginx
deployment.apps/nginx scaled
确认集群正在扩展。
$ kubectl get node
NAME STATUS ROLES AGE VERSION
ip-192-168-35-58.ap-northeast-1.compute.internal Ready <none> 30m v1.25.7-eks-0a21954
ip-192-168-77-129.ap-northeast-1.compute.internal Ready <none> 32s v1.25.7-eks-0a21954
配置映射
在 .env 文件中创建环境变量。
ENV=dev
创建配置图。
$ kubectl create configmap eks-cluster --from-env-file=.env
configmap/eks-cluster created
查看已创建的配置映射。
$ kubectl describe configmap eks-cluster
Name: eks-cluster
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
ENV:
----
dev
在nginx.yaml中,需进行如下配置以加载环境变量。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
# 環境変数を設定する。
envFrom:
- configMapRef:
name: eks-cluster
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
resources:
requests:
cpu: 100m
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
部署nginx.yaml。
$ kubectl apply -f nginx.yaml
确认Pod的名称。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-c97746c48-785dz 1/1 Running 0 18s
用 “exec” 命令在 Pod 中进入容器,并确认环境变量。
$ kubectl exec -it nginx-c97746c48-785dz env
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=nginx-c97746c48-785dz
TERM=xterm
ENV=dev
另外,若編輯了env文件,必須重新啟動Pod。
$ kubectl rollout restart deployment/nginx
确认Pod的名称。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-b9d6884ff-qrgbr 1/1 Running 0 32s
使用exec命令进入容器中的Pod,以确认环境变量是否已更改。
$ kubectl exec -it nginx-b9d6884ff-qrgbr env
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=nginx-b9d6884ff-qrgbr
TERM=xterm
ENV=stg
秘密
创建秘密情报。在这里,我们尝试创建数据库的用户和密码。
$ kubectl create secret generic eks-cluster --from-literal=DB_USER=root --from-literal=DB_PASS=pass
secret/eks-cluster created
查看秘密情报。
$ kubectl describe secret eks-cluster
DB_PASS: 4 bytes
DB_USER: 4 bytes
秘密信息可以通过以下指令进行确认。
$ kubectl get secret eks-cluster -o yaml
apiVersion: v1
data:
DB_PASS: cGFzcw==
DB_USER: cm9vdA==
kind: Secret
metadata:
creationTimestamp: "2023-05-21T05:53:26Z"
name: eks-cluster
namespace: default
resourceVersion: "576461"
uid: afc2cee0-7e84-4fdc-9985-04d79993ddf3
type: Opaque
通过将其进行base64解码,您可以查看Secret的实际值。
$ echo 'cGFzcw==' | base64 --decode
pass
在nginx.yaml文件中,像configMap一样,要写入secret。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
# 環境変数を設定する。
envFrom:
- configMapRef:
name: eks-cluster
- secretRef:
name: eks-cluster
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
timeoutSeconds: 1
periodSeconds: 10
failureThreshold: 3
resources:
requests:
cpu: 100m
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: 80-80
port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
type: NodePort
使用 kubectl apply 进行部署。
$ kubectl apply -f nginx.yaml
deployment.apps/nginx configured
service/nginx unchanged
确认Pod名称。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-c98f99b4c-ppg5x 1/1 Running 0 13s
在Pod中通过使用exec命令进入容器,并确认环境变量是否已设置。
$ kubectl exec -it nginx-c98f99b4c-ppg5x env
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=nginx-c98f99b4c-ppg5x
TERM=xterm
ENV=stg
DB_PASS=pass
DB_USER=root
云监视器容器洞察
将 cluster.yaml 编辑为已添加了 CloudWatch 权限的版本。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-cluster
region: ap-northeast-1
version: "1.24"
nodeGroups:
- name: eks-ng
instanceType: t3.small
desiredCapacity: 1
minSize: 1
maxSize: 3
iam:
withAddonPolicies:
awsLoadBalancerController: true
autoScaler: true
# cloudWatch の権限を追加。
cloudwatch: true
根据下一页的说明,部署 Container Insights。
接下来,让我们从CloudWatch的Container Insights中确认一下指标、日志组等。
另外,似乎创建了以下这样的日志组在日志组中。
/AWS/容器洞察/EKS集群/应用程序 /AWS/容器洞察/EKS集群/数据平面 /AWS/容器洞察/EKS集群/主机 /AWS/容器洞察/EKS集群/性能
应用程序的部署
我想要尝试部署我自己开发的应用程序。
首先,我们需要准备必要的环境。
$ node -v
v16.20.0
$ mkdir nodejs && cd nodejs
$ npm init -y
$ npm install express --save
准备示例应用程序。
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello World!'));
app.listen(3000, () => console.log('Example app listening on port 3000'));
在本地进行验证。
$ node app.js
$ curl http://localhost:3000
创建Dockerfile。
FROM node:14-alpine
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "node", "app.js" ]
容器的准备和操作确认。
$ docker build -t node-web-app:latest
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
node-web-app latest df7248480cfc About a minute ago 122MB
$ docker run -d -p 3000:3000 node-web-app:latest
f28581312123a0e95c0fac891c4b0fb1fcad4f2ff876394e104314af3a68218a
$ curl http://localhost:3000
Hello World!
创建容器镜像、登录、推送。
$ docker build -t XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/node-web-app:1.0 .
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
$ aws ecr create-repository --repository-name node-web-app --region ap-northeast-1
$ docker push XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/node-web-app:1.0
按照以下方式准备node-web-app.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: node-web-app
name: node-web-app
spec:
replicas: 1
selector:
matchLabels:
app: node-web-app
strategy: {}
template:
metadata:
labels:
app: node-web-app
spec:
containers:
#ECRにpushしたイメージを指定。
- image: XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/node-web-app:1.0
name: node-web-app
resources: {}
确认启动 apply 和 pod。
$ kubectl apply -f node-web-app.yaml
deployment.apps/node-web-app created
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
node-web-app-5fdc988f58-4ljj2 1/1 Running 0 2m38s
用户管理
在给EKS资源创建的IAM用户或IAM角色上,将授予Kubernetes上的管理员权限。要将Kubernetes权限授予其他IAM用户或IAM角色,需要单独执行操作。
我会确认现状。
$ eksctl get iamidentitymapping --cluster eks-cluster
ARN USERNAME GROUPS ACCOUNT
arn:aws:iam::XXXXXXXXXXXX:role/eksctl-eks-cluster-nodegroup-eks-NodeInstanceRole-XXXXXXXXXXXX system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
目前,通过CloudShell以eks-user的身份进行操作。
$ aws sts get-caller-identity
{
"Account": "XXXXXXXXXXXX",
"UserId": "XXXXXXXXXXXX",
"Arn": "arn:aws:iam::XXXXXXXXXXXX:user/eks-user"
}
只要启动Cloud9并准备好EKS role即可。
$ aws sts get-caller-identity
{
"Account": "XXXXXXXXXXXX",
"UserId": "AXXXXXXXXXXXX:i-0XXXXXXXXXXX",
"Arn": "arn:aws:sts::XXXXXXXXXXXX:assumed-role/eks-role/i-0XXXXXXXXXX"
}
创建ID映射。
$ eksctl create iamidentitymapping --cluster eks-cluster --arn arn:aws:iam::XXXXXXXXXXXX:role/eks-role --group system:masters --username eks-admin
确认是否已设定完成。
$ eksctl get iamidentitymapping --cluster eks-cluster
ARN USERNAME GROUPS ACCOUNT
arn:aws:iam::XXXXXXXXXXXX:role/eksctl-eks-cluster-nodegrou-NodeInstanceRole-XXXXXXXXXXXX system:node:{{EC2PrivateDNSName}} system:bootstrappers,system:nodes
arn:aws:iam::XXXXXXXXXXXX:role/ekshandson-admin eks-admin system:masters
创建背景。
$ aws eks update-kubeconfig --region ap-northeast-1 --name eks-cluster
Added new context arn:aws:eks:ap-northeast-1:XXXXXXXXXXXX:cluster/eks-cluster to /home/ec2-user/.kube/config
确认通过Cloud9的eks-role可以进行操作。
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-6c85484665-qsxkn 1/1 Running 0 63s
如果出现以下错误,请参考文档更新aws-cli,这可能是因为您的aws-cli版本过旧。
$ kubectl get pods
error: exec plugin: invalid apiVersion "client.authentication.k8s.io/v1alpha1"
$ aws --version
aws-cli/2.11.26 Python/3.11.3 Linux/4.14.314-238.539.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
在现有的VPC上进行构建
在现有的VPC上进行标记。
-
- プライベートサブネット:kubernetes.io/role/elb=1
- パブリックサブネット:kubernetes.io/role/internal-elb=1
请按照以下的方式创建 cluster.yaml 文件。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: eks-cluster
region: ap-northeast-1
version: "1.25"
# vpc と サブネットIDを指定。
vpc:
id: "vpc-XXX"
subnets:
private:
eks-private-1:
id: "subnet-XXX"
eks-private-2:
id: "subnet-XXX"
public:
eks-public-1:
id: "subnet-XXX"
eks-public-2:
id: "subnet-XXX"
nodeGroups:
- name: eks-ng
instanceType: t3.small
desiredCapacity: 1
# プライベートサブネットに作成するように指定。
privateNetworking: true
minSize: 1
maxSize: 3
iam:
withAddonPolicies:
awsLoadBalancerController: true
autoScaler: true
cloudWatch: true
创建一个集群。
$ eksctl create cluster -f cluster.yaml
EKS的更新
在进行更新等意图终止节点时,我们将创建一个功能,确保最低限度启动的Pod数量。在以下设置中,最低保证为1个。
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: nginx
spec:
minAvailable: 1
selector:
matchLabels:
app: nginx
部署 PDB。
$ kubectl apply -f pdb.yaml
确认正在制作中的事物。
$ kubectl get poddisruptionbudget.policy
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
nginx 1 N/A 1 2m21s
确认当前版本。
$ kubectl version --short
Flag --short has been deprecated, and will be removed in the future. The --short output will become the default.
Client Version: v1.26.4-eks-0a21954
Kustomize Version: v4.5.7
Server Version: v1.25.10-eks-c12679a
每次更新。
$ eksctl upgrade cluster --name eks-cluster --approve
$ eksctl utils update-aws-node --name eks-cluster --approve
$ eksctl utils update-coredns --name eks-cluster --approve
$ eksctl utils update-kube-proxy --name eks-cluster --approve