Slide 1

Slide 1 text

1 EKSのいーかんじなサービス公開方法 Suguru Sugiyama(@sugimount) JAWS-UG コンテナ支部 #13

Slide 2

Slide 2 text

Who? 2 • Suguru Sugiyama (@sugimount) • Cloud Native Developpers JP Community運営 https://cnd.connpass.com/ • 趣味:ベース歴7年 • 会社:某SIer

Slide 3

Slide 3 text

Japan Container Days18.12 3 • EKSを使用してWebアプリケーション(qicoo)を開発して、登壇しました https://speakerdeck.com/cndjp/jkd-v18-dot-12-2w3

Slide 4

Slide 4 text

ちなみに 4 • Communityとしてロゴ・ステッカー・Tシャツを作成 • お金の使い方がファンキー ジトメェ

Slide 5

Slide 5 text

5 • あ Amazon EKS Available in Tokyo!!!!!

Slide 6

Slide 6 text

6 • あ よしEKSでWebアプリケーションを 公開してみよう

Slide 7

Slide 7 text

EKS Service Expose 7 • EKSでは、ELBを使用してサービスの公開が可能 • CLB・NLB・ALBの全種類が利用可能 • EKSのGettingStartでは、CLBが使用されているため、CLBを採用 • CLBで特に困った点はなかった (アプリの規模が小さいのもあるかも) ELBの種類 EKSで作成するServiceType 主な特徴 Classic Load Balancer LoadBalancer 何も考えず作成するとコレ 古いタイプのELB Network Load Balancer LoadBalancer annotationに “nlb” と指定 Layer4で動作 Application Load Balancer Ingress aws-alb-ingress-controllerを使用 Layer7で動作 host-base, path-baseルーティングによる ELB集約コストメリット HTTP/2サポートによるパフォーマンス向上 など https://kubernetes.io/docs/concepts/services-networking/service/#network-load-balancer-support-on-aws-alpha

Slide 8

Slide 8 text

EKS Service Expose 8 • EKSでLoadBalancerを作成すると、CLBと共に AWS側でrandomなEXTERNAL-IPが生成される $ kubectl get services -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE guestbook LoadBalancer 10.100.115.63 .us-west-2.elb.amazonaws.com 3000:31601/TCP 3m • 任意のドメインでサービスを公開するのはどうすればよい・・・? randomなEXTERNAL-IPに対して、名前解決するレコードを 手動で毎回設定するのは大変

Slide 9

Slide 9 text

EKS Service Expose 9 • OSSのExternalDNSで解決 • Serviceを作成するときに、公開したいFQDNを指定して 自動的に名前解決用のAレコードを生成 • 対応DNSサービス • AWS Route53 • Azure DNS • Google Cloud DNS • Oracle Cloud Infrastructure DNS など https://github.com/kubernetes-incubator/external-dns

Slide 10

Slide 10 text

EKS Service Expose 10 • httpsで公開するにはどうすればよい・・・? Amazon CertificateManagerと連携することで、 非常に簡単にhttpsが可能

Slide 11

Slide 11 text

11 設定方法 EKS + ExternalDNS + ACM

Slide 12

Slide 12 text

設定方法 EKS + ExternalDNS + ACM 12 1. 何かしらのサービスでドメインを購入 例)お名前.comでqicoo.tokyoを購入

Slide 13

Slide 13 text

設定方法 EKS + ExternalDNS + ACM 13 2. Route53上で HostedZone を作成

Slide 14

Slide 14 text

設定方法 EKS + ExternalDNS + ACM 14 3. HostedZone で生成されたNSレコードのvalueをコピー ※ 上記NSレコードは、現在は使用していません

Slide 15

Slide 15 text

設定方法 EKS + ExternalDNS + ACM 15 4. お名前.com にNSレコードの value を設定

Slide 16

Slide 16 text

設定方法 EKS + ExternalDNS + ACM 16 5. EKS Cluster をGettingStart の手順を基に進める https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/getting-started.html

Slide 17

Slide 17 text

設定方法 EKS + ExternalDNS + ACM 17 6. EKS の Worker Node (EC2インスタンス) を Deployする時に CloudFormationのTemplateに、IAMRoleを付与 NodeInstanceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - ec2.amazonaws.com Action: - sts:AssumeRole Path: "/" ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonRoute53AutoNamingFullAccess - arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy - arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy - arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly add amazon-eks-nodegroup.yaml

Slide 18

Slide 18 text

設定方法 EKS + ExternalDNS + ACM 18 7. EKS ClusterにExternalDNSをDeploy https://github.com/kubernetes-incubator/external-dns/blob/master/docs/tutorials/aws.md spec: serviceAccountName: external-dns containers: - name: external-dns image: registry.opensource.zalan.do/teapot/external-dns:latest env: - name: AWS_REGION value: us-west-2 args: - --source=service - --source=ingress - --domain-filter=qicoo.tokyo - --provider=aws - --policy=sync - --aws-zone-type=public - --registry=txt - --txt-owner-id=my-identifier Deployment Manifestを抜粋 awsのリージョンを指定 ExternalDNSと連携する EKSのリソースを指定 ドメイン名を指定 同期ポリシーを指定 sync : 作成, 更新, 削除 upsert-only : 作成のみ

Slide 19

Slide 19 text

設定方法 EKS + ExternalDNS + ACM 19 8. ACMでPublic Certificateを作成 次の流れで進めていく

Slide 20

Slide 20 text

設定方法 EKS + ExternalDNS + ACM 20 購入したドメインと サブドメインを指定

Slide 21

Slide 21 text

設定方法 EKS + ExternalDNS + ACM 21 DNS validationを指定

Slide 22

Slide 22 text

設定方法 EKS + ExternalDNS + ACM 22

Slide 23

Slide 23 text

設定方法 EKS + ExternalDNS + ACM 23 mask mask mask mask これを押すことで Route53へ validation 用の CNAMEレコードを自動作成

Slide 24

Slide 24 text

設定方法 EKS + ExternalDNS + ACM 24 mask mask

Slide 25

Slide 25 text

設定方法 EKS + ExternalDNS + ACM 25 mask CertificateのARNを KubernetesのManifestで指 定することが可能 hogehoge

Slide 26

Slide 26 text

設定方法 EKS + ExternalDNS + ACM 26 • ここまで設定することで、いーかんじにサービス公開可能 指定したFQDN・HTTPSで自動的に公開される 例)https://test.qicoo.tokyo apiVersion: v1 kind: Service metadata: annotations: external-dns.alpha.kubernetes.io/hostname: test.qicoo.tokyo service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-west-2:hogehoge service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443“ … snip ... ExternalDNSと連携 するObjectを指定 ACMのARNを指定

Slide 27

Slide 27 text

まとめ 27 • EKSを使用して、いーかんじなサービス公開方法を紹介 • 任意のドメイン名で公開:ExternalDNS • httpsでアクセス:ACM連携 • EKSを使い始めるときに、この資料を活用頂けますと幸い