AWS EKS 盛り盛り構成インストールガイド 　～完結編～

# EKS構築手順 完結編

## 前提
  **前編のつづきとなっていますので、そちらを閲覧されてからどうぞ**
  https://qiita.com/lapolapo/items/99bda7f4c8cf1b517448
  

## やりたいこと
  1. 既存PrivateVPCでEKSを使いたい
  1. ALBも使いたい
  1. EFSも使うんだ
  1. **Apache + PHP7.4** のいわゆるWEBサーバを作る(CacheやDBはElasticacheやらRDSを使う)
  1. HTTPSも使いたい
  1. AutoScalingを考えるとコンテンツはNASに置いておきたい

## 作業の流れ
  1. **[前回]** Cluster作成
  1. **[前回]** aws-load-balancer-controllerのインストール
  1. **[前回]** EFSドライバーのインストール
  1. **[今回]** 各種設定ファイルの作成
  1. **[今回]** サービスの起動
  1. **[今回]** DNS登録と動作確認

## 各種サービス用の設定ファイルを作成する
  1. EFS用の設定ファイルを作成
  
    ```bash
    $ mkdir php74-apache && cd php74-apache
    $ vi php74h-storageclass.yaml \
         php74h-pv.yaml \
         php74h-claim.yaml
    
    ## php74h-storageclass.yaml は、クラスターに割り当てるストレージの定義
    ## php74h-pv.yaml は、永続化ボリュームの設定
    ## php74h-claim.yaml は、上記で設定したもののを使用するための請求
    ```

    ```php74h-storageclass.yaml
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: php74h-sc
    provisioner: efs.csi.aws.com
    ```

    ```php74h-pv.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: php74h-pv
    spec:
      capacity:
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      storageClassName: php74h-sc
      csi:
        driver: efs.csi.aws.com
        volumeHandle: fs-5b708f7b
    ```

    ```php74h-claim.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: php74h-claim
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: php74h-sc
      resources:
        requests:
          storage: 5Gi
    ```

  1. ALB用の設定ファイルを作成

    ```bash
    $ vi php74h-ingress.yaml \
         php74h-service.yaml
    
    ## php74h-ingress.yaml は、ALBとターゲットグループの設定
    ## php74h-service.yaml は、PodとALBを外部と接続する設定
    ```

    ```php74h-ingress.yaml
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: php74h-ingress
      annotations:
        kubernetes.io/ingress.class: alb
        alb.ingress.kubernetes.io/scheme: internet-facing
        alb.ingress.kubernetes.io/tags: CmBillingGroup=Solution
        alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-1:687521589547:certificate/d049801f-89b5-4062-8156-dcaaaaaaaaae ## 証明書のARN
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
        alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
        
    spec:
      rules:
        - host: eks.taterole.jp ## 自分の設定したいドメインを設定する
          http:
            paths:
              - path: /*
                backend:
                  serviceName: php74h-http
                  servicePort: 80
              - path: /*
                backend:
                  serviceName: php74h-https
                  servicePort: 443
    ```

    ```php74h-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: php74h-service
      labels:
        app: php74h
    spec:
      ports:
        - port: 80
          protocol: TCP
      type: NodePort
      selector:
        app: php74h
    ```

  1. Pod用の設定ファイルを作成

    ```bash
    $ vi php74h-pod.yaml
    
    ## php74h-pod.yaml は、Podの設定
    ## volumes:のセクションにEFSをマウントする設定が入っているので要注目
    ```

    ```php74h-pod.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: php74h
    spec:
      selector:
        matchLabels:
          app: php74h
      replicas: 1
      template:
        metadata:
          labels:
            app: php74h
        spec:
          containers:
            - name: php74h-container
              image: php:7.4-apache
              ports:
                - name: php74h-port
                  containerPort: 80
              volumeMounts:
                - name: documentroot
                  mountPath: /var/www/htm
          volumes:
            - name: documentroot
              persistentVolumeClaim:
                claimName: php74h-claim
    ```

## サービスの起動
  1. 起動させる

    ```bash
    $ cd ..
    $ kubectl apply -f ./php74h-apache
    persistentvolumeclaim/php74h-claim created
    ingress.extensions/php74h-ingress created
    deployment.apps/php74h created
    persistentvolume/php74h-pv created
    service/php74h-service created
    storageclass.storage.k8s.io/php74h-sc created
    customresourcedefinition.apiextensions.k8s.io/targetgroupbindings.elbv2.k8s.aws configured
    mutatingwebhookconfiguration.admissionregistration.k8s.io/aws-load-balancer-webhook configured
    role.rbac.authorization.k8s.io/aws-load-balancer-controller-leader-election-role unchanged
    clusterrole.rbac.authorization.k8s.io/aws-load-balancer-controller-role configured
    rolebinding.rbac.authorization.k8s.io/aws-load-balancer-controller-leader-election-rolebinding uncha
    clusterrolebinding.rbac.authorization.k8s.io/aws-load-balancer-controller-rolebinding unchanged
    service/aws-load-balancer-webhook-service unchanged
    deployment.apps/aws-load-balancer-controller unchanged
    certificate.cert-manager.io/aws-load-balancer-serving-cert unchanged
    issuer.cert-manager.io/aws-load-balancer-selfsigned-issuer unchanged
    validatingwebhookconfiguration.admissionregistration.k8s.io/aws-load-balancer-webhook configured
    ```

## ドメインまわりの設定
  1. ALBのhostnameを確認する

    ```bash
    $ kubectl get ingress
    NAME             CLASS    HOSTS              ADDRESS                                                                      PORTS   AGE
    php74h-ingress   <none>   eks.taterole.jp   k8s-default-php74hin-bdcfd7b35a-687748344.ap-northeast-1.elb.amazonaws.com   80      121m
    ```

  1. 管理コンソールでもCLIでもいいので設定
    → eks.taterole.jp に **dualstack.k8s-default-php74hin-aaaaaaaa5a-681111114.ap-northeast-1.elb.amazonaws.com** を結びつける
    **注意：初期設定でphp74h-ingress.yaml 内で指定したドメインとパス以外は404に飛ばすようになっているので、DNS設定しないとコンテンツが見えません**

  1. 適当にコンテンツを配置する
    → EFSにphpinfo的なものを置いておくといいかも

  1. フザウザで確認する
    → HTTPでもHTTPSでもアクセスできることを確認しておく

---

おつかれさまでした。