用手动操作 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
广告
将在 10 秒后关闭
bannerAds