kubernetes로 wordpress 환경 구축

이전
apache와 php 환경을 kubernetes로 구축
부터 계속됩니다.

디렉토리 구성


$ workspace .
├── app
|   └── wordpressのパッケージ
└── docker
    ├── db
    │   ├── create_schema.sql(新規)
    │   └── Dockerfile(新規)
    ├── apache-php
    │   ├── vhost.conf
    │   └── Dockerfile
    ├── templates
    |   ├── mysql-deploy.yaml(新規)
    |   ├── mysql-pv.yaml(新規)
    |   ├── mysql-pvc-claim.yaml(新規)
    |   ├── mysql-service.yaml(新規)
    |   ├── secret.yaml(新規)
    |   ├── strageclass.yaml(新規)
    |   └── main.yaml
    └── skaffold.yaml

StorageClass



스토리지 유형을 나타내는 객체
kubernetes.io/gce-pd
kubernetes.io/aws-ebs
kubernetes.io/glusterfs



  • Provisioner
  • 클라우드 환경의 API를 호출하는 등 동적으로 PersistentVolume을 준비하는 구조.


  • Dynamic Provisioning이란?
  • Persistent Volume Claim을 만들면 Persistent Volume이 자동으로 생성되고 PVC를 삭제할 때 PV가 자동으로 삭제됩니다.


  • PersistentVolume이란?



    영속화 영역으로 확보되는 Volume

    PersistentVolumeClaim이란?



    PersistentVolume은 PersistentVolumeClaim을 통해 사용되는 형태로 지속성 영역을 요청하는 리소스입니다.



    데이터베이스 작성을 위한 스키마 준비



    create_schema.sql
    create database `wordpress`;
    use `wordpress`;
    

    MySQL Docker 준비



    MySQL Dockerfile 만들기
    FROM mysql:5.7.22
    COPY ./create_schema.sql /docker-entrypoint-initdb.d/
    

    mysql manifest 만들기



    mysql-service.yaml
    apiVersion: v1
    kind: Service # リソースの種類
    metadata:
      name: mysql # Serviceリソース名
      labels:
        app: dev # Serviceリソースmのラベル名
    spec:
      ports:
        - port: 3306 # ServiceのPort
      selector:
        app: dev
        tier: db
      type: NodePort
    

    mysql-deploy.yaml
    apiVersion: apps/v1beta2
    kind: Deployment # リソースの種類
    metadata:
      name: mysql # Deploymentリソース名
      labels:
        app: dev # Deploymentリソースのラベル名
    spec:
      selector:
        matchLabels: # 等価比較
          app: dev # app=devのpodを指定
          tier: db # tire=dbのpodを指定
      strategy: # Podを置き換えるときの戦略
        type: Recreate #一度すべてのPodを削除してから新たなPodを起動
      template: # Pod Templateを指定
        metadata:
          labels:
            app: dev
            tier: db
        spec:
          containers:
          - image: k8sdemo/db:latest # コンテナイメージ
            name: mysql # コンテナ名
            env: # 環境
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef: # 環境変数としてSeacretを取り込む
                  name: mysql-secret # 環境変数として取り込みたい secret の名前
                  key: rootPassword  # 環境変数として取り込みたい値の名前、この場合 rootPassword
            ports:
            - containerPort: 3306 # ContainerのPort番号
              name: mysql
            volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql # Pod内のmount位置
          volumes:
          - name: mysql-persistent-storage
            persistentVolumeClaim:
              claimName: mysql-pvc-claim
    

    mysql 비밀번호 정보를 관리하는 매니페스트 만들기



    secret.yaml
    apiVersion: v1
    kind: Secret # リソースの種類
    metadata:
      name: mysql-secret # リソース名
    type: Opaque # 通常のパスワード管理で指定するtype
    data:
      rootPassword: c29waGlhd2ViZGV2 # password(Base64エンコード)
    

    mysql의 스토리지 정보를 관리하는 manifest 만들기



    strageclass.yaml
    apiVersion: storage.k8s.io/v1
    kind: StorageClass # リソースの種類
    metadata:
      name: ss-db # リソース名
    provisioner: kubernetes.io/no-provisioner # Dynamic Provisioningが非サポートとのため、kubernetes.io/no-provisionerを指定
    

    mysql-pv.yaml
    apiVersion: v1
    kind: PersistentVolume # リソースの種類
    metadata:
      name: demo-local-pv # PersistentVolumeリソース名
      labels:
        type: local # Docker for macを使用しているためlocalを指定
    spec:
      storageClassName: ss-db # storageClassを指定
      capacity:
        storage: 20Gi # strage容量
      accessModes:
        - ReadWriteOnce # 単一Nodeで読み書きが可能
      hostPath:
        path: "/Users/ytada/Documents/k8sdemo/docker/db/data" # ローカルPCの適当なパスを指定
    

    mysql-pvc-claim.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim # リソースの種類
    metadata:
      name: mysql-pvc-claim # リソース名
      labels:
        app: dev
    spec:
      storageClassName: ss-db # 使用するStrageClass
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
    

    skaffold를 편집하여 클러스터에 배포



    skaffold.yaml
    apiVersion: skaffold/v1alpha2
    kind: Config
    build:
      tagPolicy:
        sha256: {} #コンテナのTagをハッシュ
      artifacts:
      - imageName: k8sdemo/php-apache # apache-phpのコンテナ
        workspace: ./docker/apache-php # apache-phpのworkSpace
      - imageName: k8sdemo/db # dbのコンテナ
        workspace: ./docker/db # dbのworkSpace
      local:
    deploy:
      kubectl:
        manifests: # 監視対象のyamlファイルを指定
          - ./templates/main.yaml
          - ./templates/mysql-deploy.yaml
          - ./templates/mysql-pv.yaml
          - ./templates/mysql-pvc-claim.yaml
          - ./templates/mysql-service.yaml
          - ./templates/secret.yaml
          - ./templates/strageclass.yaml
    

    ※skaffold에 대해서는 「 개발 환경의 kubernetes에 skaffold를 사용한 자동 배포 」를 참조해 주십시오.

    WordPress 설치


  • WordPress 다운로드
  • 다운로드한 파일을 app/디렉토리에 저장
  • wp-config.sample.php를 wp-config.php로 이름 바꾸기
  • 각 환경의 설정 변경
  • DB_NAME: wordpress
  • DB_USER:root
  • DB_PASSWORD:password
  • DB_HOST : mysqlpod의 IP 지정


  • 서비스를 확인합니다.



    좋은 웹페이지 즐겨찾기