YOKOHEI.COM

YOKOHEI.COM

›Amazon EKS

Kubernetes Basics

  • Kubernetes Basics
  • Commands
  • Static Pod
  • Drain & Uncordon
  • Cluster Upgrade
  • Backup & Restore
  • Certification
  • RBAC
  • CNI
  • CoreDNS
  • Ingress

Kubernetes the Hard Way

  • the Hard Way?
  • AWS Prerequisites
  • CA and TLS
  • Configuration Files
  • Data Encryption
  • Bootstrapping etcd
  • Bootstrapping Control Plane
  • Bootstrapping Worker Node
  • kubectl configuraton
  • Pod Network
  • RBAC for Kubelet
  • Coredns Add-On
  • Test
  • TLS Bootstrapping

Amazon EKS

  • EKS Introduction
  • Ingress with ALB
  • PersistentVolume with EBS
  • NetworkPolicy with Calico
  • Secret with KMS
  • EKS Hands-On

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 ワーカーノードのインスタンスロールに追加でアタッチ。

iam-policy.json

自分の場合ワーカーノードのインスタンスロールは 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 クラスタ名に変更する。

https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.0/docs/examples/alb-ingress-controller.yaml

その後、デプロイ。

$ 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 を許可するルールがついてた。
何でもかんでもやってくれて超便利だなあ。

← EKS IntroductionPersistentVolume with EBS →
▼ Codes ▼
LeetCodeGitHub
▼ Profile ▼
LinkedInFlickr
▼ Logo made with DesignEvo ▼
DesignEvo
Copyright © 2020 Kohei Yoshida