【AWS】 【Kubernetes】EKSでIngressControllerを使ってALBを作成して、サービスを公開する

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が作成されました
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
#クラスタの名前。作成されたリソースに名前を付けるときに使用されます
#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へ展開する
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
}
}
aws ecr get-login --no-include-email
Dockerログイン-u AWS -p XXXXXX
パッケージ メイン
インポート (
"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
docker push XXXXXXXXXXXX.dkr.ecr.us-east-2.amazonaws.com
/eks-test-app:target1
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
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
apiVersion : 拡張/ v1beta1の
種類: イングレスの
メタデータ:
名: 「入」
の名前空間: 「テストアプリ」
の注釈:
kubernetes.io/ingress.class : ALB
alb.ingress.kubernetes.io/scheme : インターネットに面した
ラベル:
アプリ: テストアプリ
仕様:
ルール:
- HTTP :
パス:
- パス: /ターゲット1
バックエンド:
serviceNameを: " テストアプリサービス・ターゲット1"
SERVICEPORT : 80
- パス: / TARGET2
バックエンド:
serviceNameを: " テストアプリサービス-TARGET2"
SERVICEPORT : 80
kubectl apply -f ingress.yaml
ログ確認
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の箇所
再度デプロイ
kubectl delete pod alb-ingress-controller-5bfd896bd9-hctqk -n
kube-system
kubectl apply -f alb-ingress-controller.yaml
ALBが無事作成された
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%