Ingress with ALB
Ingress を EKS で使う
以下公式ブログを参照して試していたところ、ところどころバージョンが古かった。
Kubernetes Ingress with AWS ALB Ingress Controller
https://aws.amazon.com/jp/blogs/opensource/kubernetes-ingress-aws-alb-ingress-controller/
なので、コマンドなどは以下のほうを参考にしたほうが良い。
Setup ALB ingress controller
https://kubernetes-sigs.github.io/aws-alb-ingress-controller/guide/controller/setup/
事前知識
Ingress Traffic
AWS ALB Ingress controller は 2 つの traffic mode を持っている。
- instance mode
NodePort を利用し、クラスタ内の Pod にルーティングされる。
このモードでは常に 2 ホップでパケットが Pod に到達する。 - ip mode
Pod に直接ルーティングされる。
このとき、 2 つ目の ENI が必要になる。
これらは Pod のセカンダリ IP として利用される。
以下のプラグインが必要。
aws/amazon-vpc-cni-k8s
https://github.com/aws/amazon-vpc-cni-k8s
このモードでは常に 1 ホップでパケットが Pod に到達する。
デプロイ作業
IAM ロールの作成
以下の権限を持つポリシーを作成し、 EKS ワーカーノードのインスタンスロールに追加でアタッチ。
自分の場合ワーカーノードのインスタンスロールは eks-NodeInstanceRole-******* といったものだった。
マニフェストを使ってデプロイ
RBAC のデプロイ
$ 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" created
clusterrolebinding.rbac.authorization.k8s.io "alb-ingress-controller" created
serviceaccount "alb-ingress" created
ALB ingress controller のデプロイ
まず、以下のリンクよりマニフェストをダウンロードして、 --cluster-name を自分の EKS クラスタ名に変更する。
その後、デプロイ。
$ kubectl apply -f alb-ingress-controller.yaml
deployment.apps "alb-ingress-controller" created
確認作業
$ kubectl logs -n kube-system $(kubectl get po -n kube-system | egrep -o alb-ingress[a-zA-Z0-9-]+)
-------------------------------------------------------------------------------
AWS ALB Ingress controller
Release: v1.1.0
Build: git-72962fcb
Repository: https://github.com/kubernetes-sigs/aws-alb-ingress-controller.git
-------------------------------------------------------------------------------
...
log は出てるが、 ALB は作成されてないし失敗したのでは?
kubectl get all しても Ingress が出てこない。うーむ。
このトラシューにかなり時間を割いてしまったが、namespace が違うから出なかったのか…。
まだまだよくわかってないな、 Kubernetes …。
$ kubectl get pod --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default sample-pod 1/1 Running 0 4d
kube-system alb-ingress-controller-xxxx-yyyy 1/1 Running 0 5m
...
アプリケーションと ALB のデプロイ
アプリケーションのデプロイ
aws blog のサンプルのバージョンを 1.10 に変えたものを利用している。
# namespace の作成
$ cat 2048-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: "2048-game"
$ kubectl apply -f 2048-namespace.yaml
namespace "2048-game" created
# deployment の作成
$ cat 2048-deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: "2048-deployment"
namespace: "2048-game"
spec:
replicas: 5
template:
metadata:
labels:
app: "2048"
spec:
containers:
- image: alexwhen/docker-2048
imagePullPolicy: Always
name: "2048"
ports:
- containerPort: 80
$ kubectl apply -f 2048-deployment.yaml
deployment.extensions "2048-deployment" created
# service の作成
$ cat 2048-service.yaml
apiVersion: v1
kind: Service
metadata:
name: "service-2048"
namespace: "2048-game"
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: NodePort
selector:
app: "2048"
$ kubectl apply -f 2048-service.yaml
service "service-2048" created
Ingress リソース (ALB) のデプロイ
$ cat 2048-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: "2048-ingress"
namespace: "2048-game"
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
labels:
app: 2048-ingress
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: "service-2048"
servicePort: 80
$ kubectl apply -f 2048-ingress.yaml
ingress.extensions "2048-ingress" created
確認作業
$ kubectl get ingress/2048-ingress -n 2048-game
NAME HOSTS ADDRESS PORTS AGE
2048-ingress * xxxxxxxx-2048... 80 19s
おお。できてる。
ALB も作成された! ALB にアクセスすると 2048 ゲームができた。
SG を確認してみた。
ALB には 0.0.0.0/0 80 のルール、ターゲット側にはその SG を許可するルールがついてた。
何でもかんでもやってくれて超便利だなあ。
