$30 off During Our Annual Pro Sale. View Details »

はじめての CircleCI × EKS

enta0701
January 25, 2019
510

はじめての CircleCI × EKS

enta0701

January 25, 2019
Tweet

Transcript

  1. はじめての CircleCI × EKS Created by @endotakuya

  2. 話すこと CircleCI 経由 で EKS へデプロイする方法 環境変数の取り扱い ALB の DNS

    名でアクセスする設定
  3. 話さないこと Kubernetes の概念や用語 Kubernetes の各種設定 CircleCI v2 の 詳細設定 ECR

    の使い方
  4. CircleCI 経由 で EKS へデプロイ

  5. 前提 / 準備 Rails Application MySQL Nginx 各コンテナの Docker イメージが作れる(Build

    できる)こと。
  6. CirlceCI AWS の各リソースへの操作は awscli を使用 ... deploy: &deploy <<: *defaults

    docker: - image: circleci/python:3.5 - run: name: Install the AWS CLI command: | sudo pip install --upgrade pip sudo pip install awscli==1.16.89 - run: # build / push - run: # deploy ...
  7. CirlceCI ― Docker イメージ の Build/Push shell script でごりごり。 #

    Docker Login eval $(aws ecr get-login --region ap-northeast-1 --no-include-email) # Docker image # app app=xxxx.dkr.ecr.ap-northeast-1.amazonaws.com/example/app:$CIRCLE_SHA1 docker build -t $app -f .docker/app/Dockerfile . docker push $app # web ...
  8. CirlceCI ― Deploy 1. 必要なコマンドをインストール 2. 対象のクラスタをセット # Install kubectl

    ... # Install aws-iam-authenticator ... # Set cluster aws eks update-kubeconfig --name $AWS_EKS_CLUSTER_NAME kubectl config use-context $AWS_EKS_CLUSTER_ARN
  9. CirlceCI ― Deploy envsubst により、環境変数を設定ファイルの k8s の yaml に埋め込む #

    Deploy sudo apt-get update && sudo apt-get install -y gettext-base k8s_resource_path=./.docker/.k8s for file in $k8s_resource_path/*.yaml; do envsubst < $file | kubectl apply -f - done これで、External IP が発行されればOK ※ k8s の設定ファイルは BananaCI の設定とほとんど同じです
  10. 環境変数の取り扱い

  11. CirlceCI での環境変数 恐らくリポジトリで設定してるはず

  12. 本番 / ステージングはどうする?

  13. CircleCI Contexts Organization や Account 単位で環境変数郡を作成することができる

  14. CircleCI Contexts (ex.) example-production AWS_EKS_CLUSTER_NAME RAILS_ENV MYSQL_HOST example-staging AWS_EKS_CLUSTER_NAME RAILS_ENV

    MYSQL_HOST
  15. CircleCI Contexts の呼び出し方 work ow の job 呼び出し時に指定する workflows: version:

    2 build_and_deploy: jobs: - deploy-staging: context: example-staging - deploy-production: context: example-production filters: branches: only: - release
  16. ALB の DNS 名でアクセスする設定

  17. Ingress L7 層レベル(http/https のパスベースで負荷分散ができる)で Service を介して、クラスタを外部とつなぐ apiVersion: extensions/v1beta1 kind: Ingress

    metadata: name: example-ingress spec: rules: - http: paths: - path: /* backend: serviceName: example-svc # Service 名 servicePort: 80
  18. ALB Ingress Controller kubernetes-sigs/aws-alb-ingress-controller ingress を作成したタイミングで ALB やターゲットグループを作成 セキュリティグループやサブネットを自動検出して関連付け 対象クラスタやアクセキーを設定するだけ

    $ kubectl apply -f alb-rbac-role.yaml
  19. RBAC Role-Based Access Control クラスタの操作権限や内部の Kubernetes API の操作ユーザーを限定 alb-ingress-controller は、一般ユーザが容易に触れないほうがいいの

    で、操作を限定したユーザーを作成 https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress- controller/v1.0.0/docs/examples/rbac-role.yaml $ kubectl apply -f alb-rbac-role.yaml
  20. ALB の DNS 名を叩けば…

  21. ね?簡単でしょ?