株式会社ヴァンデミックシステム

Blog

<スポンサーリンク>

Ingress Controllerとは

  • 必要になったらALBを作成してくれるPodのこと
  • いずれかのNodeで起動する
  • Ingressを使う場合GCPでは意識しなくて良いが、AWSではこのように手動で作成する必要がある
  • ALBを作成せずにクラスター内にNginxを配備することでサービス公開するNginx Ingressというのもあるみたい

参考

https://dev.classmethod.jp/cloud/aws/eks-aws-alb-ingress-controller/

クラスタ作成

eksctl create cluster --name = k8s-cluster --nodes = 2 --node-type 
= t2.medium

出力結果

[ℹ] eksctlバージョン0.7.0
[ℹ]リージョンus-east-2を使用
[ℹ]可用性ゾーンを[us-east-2c us-east-2a us-east-2b]に設定する
[ℹ] us-east-2cのサブネット-public:192.168.0.0/19 private:192.168.96.0/19
[ℹ] us-east-2aのサブネット-public:192.168.32.0/19 private:192.168.128.0/19
[ℹ] us-east-2bのサブネット-public:192.168.64.0/19 private:192.168.160.0/19
[ℹ]ノードグループ「ng-ac8bfd87」は「ami-082bb518441d3954c」を使用します
[AmazonLinux2 / 1.14]
[ℹ] Kubernetesバージョン1.14を使用
[ℹ]「us-east-2」リージョンにEKSクラスター「k8s-cluster」を作成しています
[ℹ]クラスター自体と初期ノードグループ用に2つの個別のCloudFormationスタックを作成します
[ℹ]問題が発生した場合は、CloudFormationコンソールを確認するか、
「eksctl utils describe-stacks --region = us-east-2 --name 
= k8s-cluster」を試してください
[ℹ] CloudWatchロギングは、「us-east-2」のクラスター「k8s-cluster」では有効になりません
[ℹ] 'eksctl utils update-cluster-logging --region = us-east-2 
--name = k8s-cluster'で有効にできます
[ℹ] 2つの順次タスク:{クラスターコントロールプレーン "k8s-cluster"を作成し、
ノードグループ "ng-ac8bfd87"を作成します}
[ℹ]クラスタスタック「eksctl-k8s-cluster-cluster」を構築しています
[ℹ]スタック「eksctl-k8s-cluster-cluster」をデプロイしています
[ℹ]ノードグループスタック「eksctl-k8s-cluster-nodegroup-ng-ac8bfd87」を
構築しています
[ℹ] --nodes-min = 2がノードグループng-ac8bfd87に自動的に設定されました
[ℹ] --nodes-max = 2がノードグループng-ac8bfd87に自動的に設定されました
[ℹ]スタック「eksctl-k8s-cluster-nodegroup-ng-ac8bfd87」をデプロイしています
[✔]「k8s-cluster」のすべてのEKSクラスターリソースが作成されました
[✔] kubeconfigを「/Users/yuta/.config/k3d/k3s-default/kubeconfig.yaml」
として保存しました
[ℹ] ID「arn:aws:iam :: 241161305159:role / eksctl-k8s-cluster-nodegroup
-ng-a-NodeInstanceRole-MPUARSLLOYNO」を認証ConfigMapに追加
[ℹ]ノードグループ「ng-ac8bfd87」には0個のノードがあります
[ℹ]「ng-ac8bfd87」で少なくとも2つのノードの準備が整うのを待つ
[ℹ]ノードグループ「ng-ac8bfd87」には2つのノードがあります
[ℹ]ノード「ip-192-168-39-153.us-east-2.compute.internal」の準備ができています
[ℹ]ノード「ip-192-168-75-177.us-east-2.compute.internal」の準備ができています
[ℹ] kubectlコマンドは「/Users/yuta/.config/k3d/k3s-default/kubeconfig.yaml」
で機能するはずです。'kubectl--kubeconfig = / Users / yuta / .config / k3d 
/ k3s-default / kubeconfig .yaml getノード '
[✔]「us-east-2」リージョンのEKSクラスター「k8s-cluster」の準備ができています

サービスアカウント作成、ロールのバインド

kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs
/aws-alb-ingress-controller/v1.0.0/docs/examples/rbac-role.yaml

出力結果

clusterrole.rbac.authorization.k8s.io/alb-ingress-controller構成済み
clusterrolebinding.rbac.authorization.k8s.io/alb-ingress-controller
設定済み
serviceaccount / alb-ingressが作成されました

AWS ALB Ingress Controllerのデプロイ

マニュフェストファイルをダウンロード

curl -sS "https://raw.githubusercontent.com/kubernetes-sigs/aws-alb
-ingress-controller/v1.0.0/docs/examples/alb-ingress-controller.yaml"
> alb-ingress-controller.yaml

cluster-nameの部分をデプロイしているクラスタ名へ変更

            #クラスタの名前。作成されたリソースに名前を付けるときに使用されます
            #ALBイングレスコントローラーによって、
            #個のクラスター。
            ---cluster-name = k8s-cluster

展開

kubectl apply -f alb-ingress-controller.yaml

展開確認

AWS ALB IngressController用のポッドが作成されている

kubectl get pod --all-namespaces | grep alb-ingress
kube-system alb-ingress-controller-574db97b5f-2j7hb 1/1 Running 0 32s

サンプルアプリケーションデプロイメント

ECR経由でEKSへ展開する

ECR作成

aws ecr create-repository --repository-name eks-test-app

出力結果

{
    "リポジトリ":{
        "repositoryUri": "241161305159.dkr.ecr.us-east-2.amazonaws.com
/eks-test-app"、
        "レジストリID": "241161305159"、
        "imageTagMutability": "MUTABLE"、
        "repositoryArn": "arn:aws:ecr:us-east-2:241161305159:repository
 / eks-test-app"、
        "リポジトリ名": "eks-test-app"、
        「createdAt」:1571584240.0
    }
}

ECRログイン情報を取得

aws ecr get-login --no-include-email

上記の出力結果を実行する

Dockerログイン-u AWS -p XXXXXX

ローカルにサンプルアプリケーションを作成

server.go
パッケージ メイン

インポート 
    "fmt" 
    "log" 
    "net / http" 
    "os" 


func  main () { 
    http HandleFunc "/"  FUNC W  HTTP ResponseWriter  R 
 * HTTP リクエスト { 
      FMT fprintfのW  "健康な!" 
    })

    http HandleFunc "/ターゲット1"  FUNC W  HTTP ResponseWriter  R 
 * HTTP リクエスト { 
      FMT fprintfのW  "/ターゲット1:"  +  OS GETENV "POD_NAME" ))
    })
    ログ致命的HTTP ListenAndServe ":8080"  nilの))
}

Dockerfile

FROM golang

追加。/ go / src / 
EXPOSE 8080 
CMD ["/ usr / local / go / bin / go"、 "run"、 "/go/src/server.go"]

ビルド

docker build -t eks-test-app:target1。

タグ変更

Dockerタグeks-test-app:target1 XXXXXXXXXXXX.dkr.ecr.us-east-2.
amazonaws.com/eks-test-app:target1

ECRへのプッシュ

docker push XXXXXXXXXXXX.dkr.ecr.us-east-2.amazonaws.com
/eks-test-app:target1

target2用のアプリも同じ手順で作成

docker build -t eks-test-app:target2。
Dockerタグeks-test-app:target2 XXXXXXXXXXXX.dkr.ecr.us-east-2.amazonaws.com/eks-test-app:target2
docker push XXXXXXXXXXXX.dkr.ecr.us-east-2.amazonaws.com/eks-test-app:target2

Pushされているイメージ一覧

image.png

マニュフェスト作成

apiVersion:v1
種類:名前空間
メタデータ:
  名前:「test-app」

---
apiVersion:extensions / v1beta1
種類:展開
メタデータ:
  名前:「test-app-deployment-target1」
  名前空間:「test-app」
スペック:
  レプリカ:2
  テンプレート:
    メタデータ:
      ラベル:
        app: "test-app-target1"
    スペック:
      コンテナ:
      -画像:XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
/eks-test-app:target1
        imagePullPolicy:常に
        名前:「test-app-target1」
        ポート:
        -containerPort:8080
        env:
        -名前:POD_NAME
          valueFrom:
            fieldRef:
              fieldPath:metadata.name

---
apiVersion:extensions / v1beta1
種類:展開
メタデータ:
  名前:「test-app-deployment-target2」
  名前空間:「test-app」
スペック:
  レプリカ:2
  テンプレート:
    メタデータ:
      ラベル:
        app: "test-app-target2"
    スペック:
      コンテナ:
      -画像:XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com
/eks-test-app:target2
        imagePullPolicy:常に
        名前:「test-app-target2」
        ポート:
        -containerPort:8080
        env:
        -名前:POD_NAME
          valueFrom:
            fieldRef:
              fieldPath:metadata.name

---
apiVersion:v1
種類:サービス
メタデータ:
  名前:「test-app-service-target1」
  名前空間:「test-app」
スペック:
  ポート:
    -ポート:80
      targetPort:8080
      プロトコル:TCP
  タイプ:NodePort
  セレクタ:
    app: "test-app-target1"

---
apiVersion:v1
種類:サービス
メタデータ:
  名前:「test-app-service-target2」
  名前空間:「test-app」
スペック:
  ポート:
    -ポート:80
      targetPort:8080
      プロトコル:TCP
  タイプ:NodePort
  セレクタ:
    app: "test-app-target2"

アプリケーションの展開

kubectl apply -f test-app.yaml

出力結果

名前空間/テストアプリが作成されました
deployment.extensions / test-app-deployment-target1が作成されました
deployment.extensions / test-app-deployment-target2が作成されました
service / test-app-service-target1が作成されました
service / test-app-service-target2が作成されました

展開確認

kubectl get all --all-namespaces | grepテストアプリ

出力結果

test-app pod / test-app-deployment-target1-66498868db-67zdw 
1/1 Running 0 56s
test-app pod / test-app-deployment-target1-66498868db-tvfgx 
1/1 Running 0 56s
test-app pod / test-app-deployment-target2-646fd4978f-282qj 
1/1 Running 0 55s

test-app pod / test-app-deployment-target2-646fd4978f-xjqw7 
1/1 Running 0 55s

test-app service / test-app-service-target1 NodePort 10.100.82.136
 <なし> 80:31922 / TCP 55s

test-app service / test-app-service-target2 NodePort 10.100.208.75 
<none> 80:32280 / TCP 55s


test-app deployment.apps / test-app-deployment-target1 2/2 2 2 57s
test-app deployment.apps / test-app-deployment-target2 2/2 2 2 56s
test-app replicaset.apps / test-app-deployment-target1-66498868db 
2 2 2 57s

test-app replicaset.apps / test-app-deployment-target2-646fd4978f 
2 2 2 56s

ALB作成

ingress.yaml
apiVersion  拡張/ v1beta1の
種類 イングレスの
メタデータ
   入」
  の名前空間 テストアプリ」
  の注釈
    kubernetes.io/ingress.class  ALB 
    alb.ingress.kubernetes.io/scheme  インターネットに面した
  ラベル
    アプリ テストアプリ
仕様
  ルール
    -  HTTP 
        パス
          -  パス /ターゲット1 
            バックエンド
              serviceNameを " テストアプリサービス・ターゲット1" 
              SERVICEPORT  80 
          -  パス / TARGET2 
            バックエンド
              serviceNameを " テストアプリサービス-TARGET2" 
              SERVICEPORT  80

ALBマニュフェストのapply

kubectl apply -f ingress.yaml

ALBが作成されないっぽい

ログ確認

kubectlログ-n kube-system alb-ingress-controller-5bfd896bd9-hctqk

怪しいエラー

E1020 16:46:07.820806 1:0] kubebuilder / controller "msg" = "Reconciler
 error" "error" = "AWSタグの取得に失敗したため、LoadBalancer構成の構築に
失敗しましたエラー:AccessDeniedException:ユーザー:arn:aws:sts 
:: 241161305159:assumed-role / eksctl-k8s-cluster-nodegroup-ng-a
-NodeInstanceRole-MPUARSLLOYNO / i-0c18a25d7a5c8e53cの実行は
許可されていません:タグ:GetResources \ n \ tステータスコード:400、
リクエストID:7225892f-f803 -4a10-86a3-c4769ff83a2d "" Controller "="
 alb-ingress-controller "" Request "= {" Namespace ":" test-app "、" 
Name ":" ingress "}

対処手順参考

export REGION = us-east-2
ALB_POLICY_ARN = $(aws iam create-policy --region = $ REGION --policy-name aws-alb-ingress-controller --policy-document "https://raw.githubusercontent.com/kubernetes-sigs/aws- alb-ingress-controller / master / docs / examples / iam-policy.json "--query" Policy.Arn "| sed 's /" // g')
エクスポートNODE_ROLE_NAME = eksctl-k8s-cluster-nodegroup-ng-a-NodeInstanceRole-MPUARSLLOYNO
aws iam attach-role-policy --region = $ REGION --role-name = $ NODE_ROLE_NAME --policy-arn = $ ALB_POLICY_ARN

NODE_ROLE_NAMEの箇所
image.png

再度デプロイ

kubectl delete pod alb-ingress-controller-5bfd896bd9-hctqk -n 
kube-system
kubectl apply -f alb-ingress-controller.yaml

ALBが無事作成された
image.png

動作確認

target1へのアクセス

〜/ D / ingress❯❯❯curl http://b0a25c21-testapp-ingress-1d16-1953215674
.us-east-2.elb.amazonaws.com/target1
/ target1:test-app-deployment-target1-66498868db-tvfgx%
〜/ D / ingress❯❯❯curl http://b0a25c21-testapp-ingress-1d16-1953215674
.us-east-2.elb.amazonaws.com/target1
/ target1:test-app-deployment-target1-66498868db-67zdw%

target2へのアクセス

〜/ D / ingress❯❯❯curl http://b0a25c21-testapp-ingress-1d16-1953215674
.us-east-2.elb.amazonaws.com/target2
/ target2:test-app-deployment-target2-646fd4978f-xjqw7%
〜/ D / ingress❯❯❯curl http://b0a25c21-testapp-ingress-1d16-1953215674
.us-east-2.elb.amazonaws.com/target2
/ target2:test-app-deployment-target2-646fd4978f-282qj%

<スポンサーリンク>

コメントを残す

Allowed tags:  you may use these HTML tags and attributes: <a href="">, <strong>, <em>, <h1>, <h2>, <h3>
Please note:  all comments go through moderation.

*

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)