1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

備忘録:kubernetes/EKS基礎②(k8sコンポーネント)

Last updated at Posted at 2022-12-21

備忘録

  • kustomizeの使用
  • AWS LoadBalance Controllerを使用したALBの使用
  • スケーリング など

検証用クラスタ作成

eksctl create cluster \
    --region ap-northeast-1 \
	--name  eks-clu \
	--version 1.23 \
	--nodegroup-name eks-ng \
	--node-type t3.micro \
	--nodes 2 \
	--nodes-min 2

裏でCFnのスタックが作成されてコントロールプレーンとデータプレーン(EC2)が作成される。
~/.kube/configに認証情報が追加される
kubectl get node正しく認証されればノートの情報取得
kubectl exec -it pod_name -- /bin/bashでPod内のコンテナに接続
eksctl delete cluster --name eks-cluで削除

ネットワーク関連

Pod間通信

  • コンテナはIPを持たない。PodがプライベートIPをもっている
  • 同一コンテナ内はlocalhost+ポート番号で通信可能

Pod外通信

Serviceを定義してPodへのアクセスを抽象化。またはIngressを使用

Service Type

  • Cluster IP
    Clusterの内部IPを使用。クラスタ外部からはアクセス不可
  • NodePort
    Clusterの各ポートにIPを割当て、Pod宛の通信を転送。クラスタ外部からのアクセスが可能
  • LoadBalancer
    AWSの場合はデフォルトでCLBが作成される。nlbの作成も可能
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
  • Ingress
    クラスター内のServiceに対する外部からのアクセス(主にHTTP)を管理するAPIオブジェクト
    IngressはL7通信。Serviceとは別のリソース。Ingressコントローラーの作成が必要
    AWS LoadBalance ControllerはIngressコントローラーを使用する

ストレージ関連

Volume

Podで利用出来るストレージ領域。Pod再起動しても消えない

Persistent Volume

外部ストレージを使用。Podと切り離して作成可能。
volumeClaimTemplatesで作成してvolumeMountsで紐づける。

        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "my-storage-class"
      resources:
        requests:
          storage: 1Gi

kustomize

マニフェストの管理ツール。ベースを作成しておいて、環境に応じて設定値を上書き出来る。例えば下記のようにベースを定義しておいて、本番環境、開発観環境用に設定を上書いて使用出来る。

.
├── base
│   ├── deployment.yml
│   ├── kustomization.yml
│   └── service.yml
└── overlays
    ├── dev
    │   └── kustomization.yml
    └── prod
        └── kustomization.yml
base/kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - service.yml
  - deployment.yml
base/deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.20
          ports:
            - containerPort: 80
overlays/prod/kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base
namespace: production
replicas:
- name: deployment
  count: 5

Helm

k8sで使用するパッケージマネージャー。リポジトリではイメージは管理せず、Chartと呼ばれる設定ファイルのみを管理する仕組み。HelmでChartをダウンロードしてデプロイする。作成、更新、削除、ロールバックも可能。

AWS LoadBalance Controller

AWS LoadBalance Controllerのインストール

下記手順を実施。

事前にクラスターのIAM OIDC IDプロバイダーを作成する必要がある。

eksctl utils associate-iam-oidc-provider --cluster my-cluster --approve

IAM関連設定

  • IAM Policyを作成する
  • IRSAを作成してIAM Policyを紐づける

IRSA(IAM Role for Service Acoount)とはk8s内で管理されているアカウントで、Podと紐づけてAWSリソースへのアクセス制御を行う機能。

下記の様な形でサービスアカウントを作成している。

スクリーンショット 2022-12-21 10.46.33.png

Helmを使用してChartのインストール

  • Helm
    k8s用のパッケージマネージャー、yumやaptのようなもの
  • Chart
    Helmで取得出来る設定ファイル。Chartではイメージを管理しているのではなく設定ファイルのみ管理している。Helmでこれをダウンロードしてデプロイする。

Helmの使用方法は①リポジトリの追加②リポジトリの更新③Chartのインストール

helm repo add eks https://aws.github.io/eks-charts
helm repo update
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=eks-clu \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller 

コントローラのインストールを確認

kubectl get deployment -n kube-system aws-load-balancer-controller

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
aws-load-balancer-controller   2/2     2            2           33s

Ingress作成

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: instance
spec:
  defaultBackend:
    service:
      name: service
      port:
        number: 80

  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service
                port:
                  number: 80
---
apiVersion: v1
kind: Service
metadata:
  name: service
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app.kubernetes.io/name: app

スケーリング関連

Resource Request/Limits

Pod作成時、deploymentの中などで指定。Requests分リソースを確保する。MemoryのLimitsを超えた際はOOM Killerによりプロセスがkillされる。CPUのLimitsを超えた場合はパフォーマンスが落ちる。

QoSクラス

Podの優先度を定義。Resource Request/Limitsの値を元に自動的に付与される。OOM KillerでPodがkillされる時のPodの選定などに使用

Horizontal Pod Autoscaler

Podをスケールアウトする。PodのCPU使用率、メモリ使用率、カスタムメトリクスを使用して監視。指定したメトリクスを下回るようにPod数を調整してスケーリングする

Cluster Autoscaler

クラスタ内のノード数を動的に調整

関連記事

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?