이 예제 자습서에서는 vSphere IaaS control plane 환경에서 vSphere 포드를 사용하여 WordPress 애플리케이션을 배포하는 방법을 설명합니다.

WordPress 배포에는 WordPress 프런트 엔드 및 MySQL 백엔드용 컨테이너와 둘 다에 대한 서비스가 포함됩니다. 비밀 개체도 필요합니다.

이 자습서에서는 배포 개체를 사용합니다. 운영 환경에서는 일반적으로 WordPress 및 MySQL 컨테이너 모두에 대해 StatefulSets를 사용합니다.

사전 요구 사항

WordPress 배포

이 워크플로를 사용하면 vSphere 포드를 사용하여 WordPress 애플리케이션을 배포합니다.

1부. 네임스페이스 액세스

다음 단계를 사용하여 네임스페이스에 액세스합니다.

프로시저

  1. 감독자에 로그인합니다.
     kubectl vsphere login --server=SVC-IP-ADDRESS --vsphere-username [email protected] 
  2. vSphere 네임스페이스로 전환합니다.
     kubectl config use-context VSPHERE-PODS-NAMESPACE
  3. 생성한 스토리지 정책(vwt-storage-policy)을 네임스페이스에서 스토리지 클래스로 사용할 수 있는지 확인합니다.

2부. WordPress PVC 생성

다음 명령을 사용하여 WordPress PVC를 생성합니다.

프로시저

  1. MySQL PVC를 생성합니다.
     kubectl apply -f mysql-pvc.yaml
  2. WordPress PVC를 생성합니다.
     kubectl apply -f wordpress-pvc.yaml
  3. PVC를 확인합니다.
     kubectl get pvc,pv

3부. 비밀 생성

공용 Docker Hub는 Kubernetes의 기본 컨테이너 레지스트리입니다. 이제 Docker Hub에서 이미지 끌어오기가 제한됩니다. 유료 계정이 있어야 하고 계정 키를 data.dockerconfigjson 필드의 비밀 YAML에 추가해야 합니다.

프로시저

  1. Docker Hub 레지스트리 비밀을 생성합니다.
     kubectl apply -f regcred.yaml
  2. mysql 암호 비밀을 생성합니다.
    MySQL DB 암호는 필수입니다. 비밀 내에서 암호는 base64로 인코딩되어야 합니다.
    kubectl apply -f mysql-pass.yaml
  3. 비밀을 확인합니다.
    kubectl get secrets

4부. 서비스 생성

다음 단계에 따라 서비스를 생성합니다.

프로시저

  1. MySQL 서비스를 생성합니다.
    kubectl apply -f mysql-service.yaml
  2. WordPress 서비스를 생성합니다.
    kubectl apply -f wordpress-service.yaml
  3. 서비스를 확인합니다.
    kubectl get services

5부. 포드 배포 생성

이 작업을 사용하여 포드 배포를 생성합니다.

이 자습서에서는 배포 개체를 사용합니다. 운영 환경에서는 WordPress 및 MySQL 컨테이너 모두에 대해 StatefulSets를 사용해야 합니다.

프로시저

  1. MySQL 배포를 생성합니다.
    kubectl apply -f mysql-deployment-vsphere-pod.yaml
    참고: vSphere 포드가 생성되면 시스템은 포드에 컨테이너에 대한 VM을 생성합니다. 기본적으로 VM의 RAM 제한은 512MB입니다. MySQL 컨테이너에는 더 많은 메모리가 필요합니다. 포드 배포 규격 mysql-deployment-vsphere-pod.yaml에는 vSphere 포드 VM에 제공된 메모리를 늘리는 섹션이 포함되어 있습니다. 이 섹션을 포함하지 않으면 포드 배포가 실패하고 OOM(메모리 부족) 예외가 발생합니다. MySQL 포드를 TKG 클러스터에 배포할 때는 RAM을 늘릴 필요가 없습니다.
  2. WordPress 배포를 생성합니다.
    kubectl apply -f wordpress-deployment.yaml
  3. 배포를 확인합니다.
    kubectl get deployments	

6부. WordPress 테스트

다음 단계에 따라 WordPress 배포를 테스트합니다.

프로시저

  1. 모든 개체가 생성되어 실행 중인지 확인합니다.
    kubectl get pv,pvc,secrets,rolebinding,services,deployments,pods
  2. WordPress 서비스에서 EXTERNAL-IP 주소를 가져옵니다.
    kubectl get service wordpress
    
    NAME        TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
    wordpress   LoadBalancer   10.96.9.180   10.197.154.73   80:30941/TCP   87s
  3. EXTERNAL-IP 주소를 찾습니다.
  4. WordPress 인스턴스를 구성합니다.
    사용자 이름: administrator
    암호: 제공된 강력한 암호 사용

WordPress 배포를 위한 예제 YAML 파일

다음 예제 YAML 파일은 vSphere 포드와 함께 WordPress 애플리케이션을 배포할 때 사용합니다.

mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: vwt-storage-policy
  resources:
    requests:
      storage: 20Gi

wordpress-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: vwt-storage-policy  
  resources:
    requests:
      storage: 20Gi

regcred.yaml

apiVersion: v1
kind: Secret
metadata:
  name: regcred
data:
  .dockerconfigjson: ewoJImF1dGhzIjog....zZG1KcE5WUmtXRUozWpc
type: kubernetes.io/dockerconfigjson

mysql-pass.yaml

apiVersion: v1
data:
  password: YWRtaW4=  #admin base64 encoded
kind: Secret
metadata:
  name: mysql-pass

mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None

wordpress-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer

mysql-deployment-vsphere-pod.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        #increased resource limits required for this pod vm
        #default pod VM RAM is 512MB; MySQL container needs more 
        #without extra RAM OOM error prevents deployment
        #extra RAM not required for Kuberentes cluster
        resources:
          limits:
            memory: 1024Mi
            cpu: 1
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
      imagePullSecrets:
      - name: regcred  

wordpress-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wordpress-pvc
      imagePullSecrets:
      - name: regcred