>ContainerAWSのKubernetesでサービスを公開する最高の方法~ALB,ACM,Route53の自動作成~2019/03/04Kubernetesが流行っているので、これからEKSを使ってサービスを公開していこうと考えている方の参考になれば嬉しいです。AWSのEKSを使って構築しています。はじめにEKSでサービスを公開したいけど、ロードバランサとか証明書とかの設定面倒くさいと考えている方が多いと思います。今回の記事のゴールはymlファイルをKubernetesにデプロイするだけで、ALB作成、Route53にレコードセット追加、ACMの証明書をALBに割当の作業を自動でできるようにします。Balancer)を使用していますが、L7ロードバランサがいいのでALBで作成します。ホストベースでもパスベースでもどちらでもルーティングしてくれるので。本記事丁寧に説明するのですごく長くなりそうです。AWSであればRoute53でDNSレコードを作成してくれます。https://github.com/kubernetes-incubator/external-dnsやっていくIAMロールの作成3つのロールを準備する必要があります。Node用のIAMロールに対して権限を付与します。eksctlを使ってクラスタを構築した場合、XXXXXXXX-NodeInstanceRole-YYYYYYYYYYYYという名前のロールが作成されます。このロールに対してconfig/node-role-permission-policy.jsonのポリシーをアタッチします。ダウンロードしています。$INGRESS_POLICY_ARNexternal-dns用のIAMロールALB用のIAMロールと同じようにexternal-dns用のIAMロールも作成していきます。config/route53-iam-policy.jsonファイルは次のようにしています。$ROUTE53_POLICY_ARN以上で3つのIAMロールの準備ができました。付与するポリシーをどうするかです。こんな感じのポリシーが必要になります。公式手順ではこのポリシーをノードのロールにアタッチしていますが、これをするとノード配下のPodに対しても同様の権限が与えられるというセキュリティ上恐ろしいことが起こってしまします。そこでkube2iamを使ってノードに権限を与えるのではなくPodに権限を与えます。類似プロダクトとしてkiamというものもあるみたいです。Kubernetes(のアクセス管理機能)とIAMの間に入ってアクセス権限の管理を行ってくれるのが「kube2iam」や「kiam」です。デプロイ下記のmanufest.ymlファイルをデプロイするとDaemonsetでPodが各ノードで動きます。manufest.ymlkube2iamのオプションパラメーター(args:)の意味は以下の通りです。--auto-discover-base-arnロールのARNのベース部分(arn:aws:iam::XXXXXXX:role/)を自動検出します。--iptables=true「true」を指定した場合、ホスト(EC2)のiptablesに必要な設定を自動登録します。--host-ip=$(HOST_IP)「--iptables」を指定する場合は「--host-ip」もセットで必ず指定する必要があります。Networkingとして「amazon-vpc-cni-k8s」が採用されるため、このオプションは「eni+」を指定する必要があります。--verbose詳細なログを出力します。以上でkube2iamの準備は完了です。Controllerをやっていきます。検知したらAWSのリソースを作成し始めます。annotationを指定することで、サブネットやインターネット向けか内部向けかも決めることもできます。リスナーは、ingressのannotationで指定したポート用に作成されます。ポートが指定されていない場合、80または443を使用。ACMも使用することもできます。向き先となるターゲットグループは、ingressに記述されたServiceごとにAWSで作成。通りにrbac-role.yamlファイルをデプロイします。Controller本体をデプロイします。alb-ingress-controller.yaml)をダウンロードして2箇所変更します。--cluster-name=を自分のクラスタの名前に変更します。alb-ingress-controller.yamlファイルの下記の部分のappの下に追記します。ここまでymlファイルを保存してデプロイします。Controllerは自動でクラスタのサブネットを見つけてくれるのですが、そのためにはPublicサブネットにタグを付与する必要があります。Keyにkubernetes.io/role/alb-ingressを追加してValueは空。Keyにkubernetes.io/role/elbを追加してValueは1にして保存。Controllerの準備は完了です。ACMの準備example.comと*.example.comで証明書を取得してください。手順はこちらを参考にしていただければと思います。お名前.comで取得したドメイン(example.comとする)のサブドメイン(test.example.com)にアクセスして、EC2に構築したNginxの画面がhttpsで見えること。下記構成図の環境構築を目指す。証明書のプロビジョニング、管理、およびデプロイを簡単に行えます。サイトのアイデンティティを確立するために使用されます。証明書の購入、アップロード、および更新という時間のかかるプロセスを手動で行う必要がなくなります。ドメインさえあれば無料でSSL証明書を取得して、AWSの各リソース(ALB,ELB,EC2など)を簡単にSSL化することができるもの。ワイルドカードも対応しているみたい。今まで、なんで存在を知らんかったんや。便利やんけ!ってことで、やっていきます。流れとしては、次の5Stepです。ACMで証明書のリクエストをします。Managerを選びます。"証明書のリクエスト"をクリック。Zoneにレコードが登録できて非常に便利です。デプロイ下記のmanufest.ymlファイルのexample.comと<external-dns用のIAMロールのArn>をご自身の環境に変更してください。manufest.ymlexternal-dnsのオプションパラメーター(args:)の意味は以下の通りです。--sourceどのリソースをもとにroute53のレコードセットを作成するかを決めます。今回はServiceとIngressを指定しています。--domain-filterHostedZoneに対応するドメイン名に置き換えます。--providerAWSを使うのでAWSで大丈夫です。他にもGoogleやAzureなどが指定できるようです。--policysyncにすると削除も反映されます。作成のみにしたい場合はupsert-onlyにしてください。--registrytxtレコードの登録を行います。--txt-owner-idここは適当にしましたが問題なく動きました。サンプルアプリケーションすべての準備ができましたので、サンプルアプリケーションをデプロイしてみます。サンプルアプリケーションはClassMethodさんのサイトのものを使っています。ECRの作成ECRを作成してログインします。コマンドが出力されるのですべてコピーして貼り付けrepositoryUriは後で使うのでコピーしておいてください。Dockerの準備アクセスしたらPod名を返却するWebサーバを作成します。"/go/src/server.go"]イメージを作成してECRにプッシュします。XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.comはECRのrepositoryUriに変更してください。XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/eks-test-app:target1target2も同じように作成してECRにプッシュしてください。パスベースのルーティングtest.example.com/target1にアクセスしたらtarget1のPodに、test.example.com/target2にアクセスしたらtarget2のPodにアクセスするmanufest.ymlファイルを作成します。manufest.ymltest.example.com/target1とtest.example.com/target2にアクセスして挙動を確かめてください。ホストベースでのルーティング先ほど作成したmanufest.ymlファイルのingressのspecの部分のみ変更しています。80これをデプロイすることでホストベースでもアクセス振り分けができます。2.2.2.2/32ymlファイルを書いたら長くなったので、あとでGithubにソース上げておきます。...[超簡単!]kubernetesでオートスケールkubernetes1.10ではCPUベースの水平オートスケーリングが可能です。...DockerでPostgreSQLの起動を待ってからWEBサービスを起動するDockerでよくある構成って下記のようなWEB+DBが多いと思います。...BareMetalのkubernetesクラスタでkube-dnsを動かす!kubernetesクラスタ環境ではpod間のアクセスに名前解決が使えます。Reserved.Translate。