From ea70890543607d5e3ccefdef8ae8c36c91dc186f Mon Sep 17 00:00:00 2001 From: Lucas Barbosa Date: Sun, 19 Jul 2020 19:31:18 -0300 Subject: [PATCH 1/7] Commit inicial --- README.md | 31 ++++++++ nginx/ingress.yaml | 17 +++++ nginx/values.yaml | 8 ++ wp-php-chart/.helmignore | 23 ++++++ wp-php-chart/Chart.yaml | 23 ++++++ wp-php-chart/templates/_helpers.tpl | 63 ++++++++++++++++ wp-php-chart/templates/app/deployment.yaml | 50 +++++++++++++ wp-php-chart/templates/app/pvc.yaml | 12 +++ wp-php-chart/templates/app/service.yaml | 13 ++++ wp-php-chart/templates/mysql/deployment.yaml | 79 ++++++++++++++++++++ wp-php-chart/values.yaml | 71 ++++++++++++++++++ 11 files changed, 390 insertions(+) create mode 100644 nginx/ingress.yaml create mode 100644 nginx/values.yaml create mode 100644 wp-php-chart/.helmignore create mode 100644 wp-php-chart/Chart.yaml create mode 100644 wp-php-chart/templates/_helpers.tpl create mode 100644 wp-php-chart/templates/app/deployment.yaml create mode 100644 wp-php-chart/templates/app/pvc.yaml create mode 100644 wp-php-chart/templates/app/service.yaml create mode 100644 wp-php-chart/templates/mysql/deployment.yaml create mode 100644 wp-php-chart/values.yaml diff --git a/README.md b/README.md index ab9caef..062b279 100644 --- a/README.md +++ b/README.md @@ -50,3 +50,34 @@ Você também pode usar como **Diferencial**: * Será executado os precessos de instalação e configuração de acordo com a orientação da documentação em um servidor interno da Apiki. * Será avaliado o processo de automação para criação do ambiente em cloud, tempo de execução e a configuração no server na AWS com os dados fornecidos pelo candidato. * Deverar constar pelo menos 2 containers. + +--- + +## Documentação - Resultado + +### Pré-requisitos + + - [Helm](https://helm.sh/docs/intro/install/) + - [Docker](https://www.docker.com/) + - [Cluster Kubernetes](https://kubernetes.io/) + - [RDS AWS](https://aws.amazon.com/pt/rds/) + +--- + +## Database + +1. O projeto utiliza o serviço de banco de dados Amazon RDS. +2. É necessário criar uma instância e salvar as credenciais de acesso: master username, master password e o endpoint. Essas informações serão utilizadas depois. + +--- + +## Criar cluster + +1. + + + + +## Implantação balanceador de carga com Ingress Nginx +helm repo add stable https://kubernetes-charts.storage.googleapis.com/ +helm install nginx stable/nginx-ingress -f nginx\values.yaml \ No newline at end of file diff --git a/nginx/ingress.yaml b/nginx/ingress.yaml new file mode 100644 index 0000000..b0a11e3 --- /dev/null +++ b/nginx/ingress.yaml @@ -0,0 +1,17 @@ +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: ingress + annotations: + nginx.ingress.kubernetes.io/ssl-redirect: "false" + nginx.ingress.kubernetes.io/force-ssl-redirect: "false" + nginx.ingress.kubernetes.io/rewrite-target: / +spec: + rules: + - host: a15cc09994be04ba58e39a5097f3a2a5-796552887.us-east-2.elb.amazonaws.com + http: + paths: + - path: / + backend: + serviceName: wordpress + servicePort: 80 \ No newline at end of file diff --git a/nginx/values.yaml b/nginx/values.yaml new file mode 100644 index 0000000..050541c --- /dev/null +++ b/nginx/values.yaml @@ -0,0 +1,8 @@ +controller: + extraArgs: + v: 2 + proxySetHeaders: + # Host: $host + X-Forwarded-For: $proxy_add_x_forwarded_for +#defaultBackend: +# port: 80 \ No newline at end of file diff --git a/wp-php-chart/.helmignore b/wp-php-chart/.helmignore new file mode 100644 index 0000000..0e8a0eb --- /dev/null +++ b/wp-php-chart/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/wp-php-chart/Chart.yaml b/wp-php-chart/Chart.yaml new file mode 100644 index 0000000..998f666 --- /dev/null +++ b/wp-php-chart/Chart.yaml @@ -0,0 +1,23 @@ +apiVersion: v2 +name: wp-php-chart +description: A Helm chart for Wordpress application running on Kubernetes + +# A chart can be either an 'application' or a 'library' chart. +# +# Application charts are a collection of templates that can be packaged into versioned archives +# to be deployed. +# +# Library charts provide useful utilities or functions for the chart developer. They're included as +# a dependency of application charts to inject those utilities and functions into the rendering +# pipeline. Library charts do not define any templates and therefore cannot be deployed. +type: application + +# This is the chart version. This version number should be incremented each time you make changes +# to the chart and its templates, including the app version. +# Versions are expected to follow Semantic Versioning (https://semver.org/) +version: 0.1.0 + +# This is the version number of the application being deployed. This version number should be +# incremented each time you make changes to the application. Versions are not expected to +# follow Semantic Versioning. They should reflect the version the application is using. +appVersion: 1.16.0 diff --git a/wp-php-chart/templates/_helpers.tpl b/wp-php-chart/templates/_helpers.tpl new file mode 100644 index 0000000..651d5cc --- /dev/null +++ b/wp-php-chart/templates/_helpers.tpl @@ -0,0 +1,63 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "wp-php-chart.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "wp-php-chart.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "wp-php-chart.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "wp-php-chart.labels" -}} +helm.sh/chart: {{ include "wp-php-chart.chart" . }} +{{ include "wp-php-chart.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "wp-php-chart.selectorLabels" -}} +app.kubernetes.io/name: {{ include "wp-php-chart.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "wp-php-chart.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "wp-php-chart.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} diff --git a/wp-php-chart/templates/app/deployment.yaml b/wp-php-chart/templates/app/deployment.yaml new file mode 100644 index 0000000..50b3e3f --- /dev/null +++ b/wp-php-chart/templates/app/deployment.yaml @@ -0,0 +1,50 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ .Values.image.deployment }} + labels: + app: {{ .Values.image.deployment }} +spec: + replicas: {{ .Values.replicaCount }} + selector: + matchLabels: + app: {{ .Values.image.deployment }} + tier: backend + strategy: + type: Recreate + template: + metadata: + labels: + app: {{ .Values.image.deployment }} + tier: backend + spec: + containers: + - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + name: {{ .Values.image.deployment }} + env: + - name: WORDPRESS_DB_HOST + value: {{ .Values.db.host }} + - name: WORDPRESS_DB_NAME + value: {{ .Values.db.name }} + - name: WORDPRESS_DB_USER + valueFrom: + secretKeyRef: + name: {{ .Values.db.secretName }} + key: username + - name: WORDPRESS_DB_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.db.secretName }} + key: password + - name: WORDPRESS_DEBUG + value: "TRUE" + ports: + - containerPort: {{ .Values.service.port }} + name: {{ .Values.image.deployment }} + volumeMounts: + - name: wordpress-persistent-storage + mountPath: /var/www/html + volumes: + - name: wordpress-persistent-storage + persistentVolumeClaim: + claimName: wp-pv-claim \ No newline at end of file diff --git a/wp-php-chart/templates/app/pvc.yaml b/wp-php-chart/templates/app/pvc.yaml new file mode 100644 index 0000000..9c7f3c6 --- /dev/null +++ b/wp-php-chart/templates/app/pvc.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: wp-pv-claim + labels: + app: {{ .Values.image.deployment }} +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 20Gi \ No newline at end of file diff --git a/wp-php-chart/templates/app/service.yaml b/wp-php-chart/templates/app/service.yaml new file mode 100644 index 0000000..4de50c6 --- /dev/null +++ b/wp-php-chart/templates/app/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ .Values.image.deployment }} + labels: + app: {{ .Values.image.deployment }} +spec: + selector: + app: {{ .Values.image.deployment }} + tier: backend + ports: + - protocol: TCP + port: {{ .Values.service.port }} \ No newline at end of file diff --git a/wp-php-chart/templates/mysql/deployment.yaml b/wp-php-chart/templates/mysql/deployment.yaml new file mode 100644 index 0000000..5176d97 --- /dev/null +++ b/wp-php-chart/templates/mysql/deployment.yaml @@ -0,0 +1,79 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: wordpress-mysql + labels: + app: wordpress +spec: + ports: + - port: 3306 + selector: + app: wordpress + tier: mysql + clusterIP: None +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mysql-pv-claim + labels: + app: wordpress +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 20Gi +--- +apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 +kind: Deployment +metadata: + name: wordpress-mysql + labels: + app: wordpress +spec: + selector: + matchLabels: + app: wordpress + tier: mysql + strategy: + type: Recreate + template: + metadata: + labels: + app: wordpress + tier: mysql + spec: + containers: + - image: mysql:5.6 + restart: always + name: mysql + env: + - name: MYSQL_DATABASE + value: {{ .Values.db.name }} + - name: MYSQL_USER + valueFrom: + secretKeyRef: + name: {{ .Values.db.secretName }} + key: username + - name: MYSQL_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.db.secretName }} + key: password + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: {{ .Values.db.secretName }} + key: password + ports: + - containerPort: 3306 + name: mysql + volumeMounts: + - name: mysql-persistent-storage + mountPath: /var/lib/mysql + volumes: + - name: mysql-persistent-storage + persistentVolumeClaim: + claimName: mysql-pv-claim \ No newline at end of file diff --git a/wp-php-chart/values.yaml b/wp-php-chart/values.yaml new file mode 100644 index 0000000..35cdd05 --- /dev/null +++ b/wp-php-chart/values.yaml @@ -0,0 +1,71 @@ +# Default values for wp-php-chart. +# This is a YAML-formatted file. +# Declare variables to be passed into your templates. + +replicaCount: 1 + +image: + repository: wordpress + deployment: wordpress + pullPolicy: IfNotPresent + # Overrides the image tag whose default is the chart appVersion. + tag: 5.4.2-php7.4-apache + +db: + host: wordpress.c9nj6ewjaqpn.us-east-2.rds.amazonaws.com + name: wordpress + secretName: db-credentials + +imagePullSecrets: [] +nameOverride: "" +fullnameOverride: "" + +serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: "" + +podAnnotations: {} + +podSecurityContext: {} + # fsGroup: 2000 + +securityContext: {} + # capabilities: + # drop: + # - ALL + # readOnlyRootFilesystem: true + # runAsNonRoot: true + # runAsUser: 1000 + +service: + port: 80 + +resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + +autoscaling: + enabled: false + minReplicas: 1 + maxReplicas: 100 + targetCPUUtilizationPercentage: 80 + # targetMemoryUtilizationPercentage: 80 + +nodeSelector: {} + +tolerations: [] + +affinity: {} From 435ab786a08a6c5fd1c38aaff2073eb0636e7b36 Mon Sep 17 00:00:00 2001 From: Lucas Barbosa Date: Mon, 20 Jul 2020 02:07:12 -0300 Subject: [PATCH 2/7] Nginx ingress, imagem customizada PHP, e chart --- README.md | 151 ++++++++++++------- nginx/ingress.yaml | 2 +- nginx/values.yaml | 3 - php/Dockerfile | 70 +++++++++ php/php-entrypoint.sh | 29 ++++ wp-php-chart/templates/app/deployment.yaml | 7 +- wp-php-chart/templates/app/pvc.yaml | 4 +- wp-php-chart/templates/mysql/deployment.yaml | 7 +- wp-php-chart/values.yaml | 4 +- 9 files changed, 213 insertions(+), 64 deletions(-) create mode 100644 php/Dockerfile create mode 100644 php/php-entrypoint.sh diff --git a/README.md b/README.md index 062b279..938a60e 100644 --- a/README.md +++ b/README.md @@ -1,83 +1,132 @@ -# Desafio DevOps Apiki. +## Documentação - Resultado +Esse projeto tem como objetivo rodar uma aplicação Wordpress em um cluster Kubernetes hospedado em instâncias Amazon EC2. Segue abaixo a stack utilizada: + + * PHP 7.4.2 + * Wordpress 5.4.2 + * Apache/2.4.38 + * Nginx Ingress como proxy + * McRouter para cacheamento (protocolo Memcached) + +### Tecnologias utilizadas + + - [Kubernetes](https://kubernetes.io/) + - [Helm](https://helm.sh/docs/intro/install/) + - [Kops e Kubectl](https://github.com/kubernetes/kops/blob/master/docs/install.md) + - [Docker](https://www.docker.com/) + - [Amazon EC2](https://aws.amazon.com/pt/ec2/) + - [Amazon S3](https://aws.amazon.com/pt/s3/) -Objetivo é criar um processo automatizado para construção de um servidor web para [WordPress](https://wordpress.org/) em sua última versão. +--- -O candidato deve seguir os seguintes **Requisitos**; +## Criar cluster - - O projeto dever ser configurado na [AWS](https://aws.amazon.com/free/), crie uma conta Free. - - A máquina configurada deverar ter às portas 80, 443 e 22 abertas. - - Uso de Shell Script **Linux**. - - [Docker](https://www.docker.com/) + 1. Criar uma função do IAM na AWS, com as seguintes permissões: -### Arquitertura! + * AmazonEC2FullAccess + * IAMFullAccess + * AmazonS3FullAccess + * AmazonVPCFullAccess - - [Nginx](https://www.nginx.com/) configurado como proxy para o Apache. - - [Apache](https://www.apache.org/) servidor para o WordPress. - - [PHP](https://php.net/) a última versão. - - [MySql](https://www.mysql.com/) Versão mínima requirida 5.7. - - [WordPress](https://wordpress.org) última versão configurada no servidor Apache. + 2. Crie uma nova instância para usar como seu CI host. Este nó lidará com o provisionamento e o desmembramento do cluster. + 1. Essa instância pode ser pequena (t2.micro por exemplo). + 2. Ao criá-lo, atribua a função IAM criada na primeira etapa. + 3. Uma vez criada, faça o download das chaves ssh ou adicione a sua própria chave pública do seu computador local na instância. - **Modelo conceitual** + 3. Acesse via SSH o CI host. + 4. Instale o kops e o kubectl no CI host. Siga as instruções [aqui](https://github.com/kubernetes/kops/blob/master/docs/install.md). + 5. Configure um par de chaves ssh para usar com o cluster + 6. Crie as seguintes variáveis pelo terminal + 1. Como não estamos usando DNS pré-configurado, usaremos o sufixo “.k8s.local”. De acordo com a documentação do k8s, se o nome DNS terminar em .k8s.local, o cluster usará o DNS hospedado interno. + + `export NAME=.k8s.local` -[![N|Solid](https://apiki.com/wp-content/uploads/2019/05/Screenshot_20190515_174205.png)](https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/) + 2. Crie um bucket S3 para armazenar sua configuração de cluster. É recomendável ativar o controle de versão no bucket S3. Não precisamos passar isso para os comandos do KOPS. Ele detecta automaticamente pela ferramenta kops como uma variável env. ---- + `export KOPS_STATE_STORE=s3://` + + 3. Defina a mesma região utilizada na instância CI host. + + `export REGION=us-east-2` -### Se liga! + 4. É recomendável configurar essas variáveis no arquivo `/etc/profiles`. As variáveis definidas neste arquivo são carregadas sempre que um shell de login do bash é iniciado. Ao declarar variáveis de ambiente neste arquivo, você precisa usar o comando export também. Igual nos exemplos anteriores. -Você também pode usar como **Diferencial**: + `sudo nano /etc/profiles` - - [Docker Compose](https://docs.docker.com/compose/). - - [Kubernetes](https://kubernetes.io/). - - [Ansible](https://www.ansible.com/). - - [RDS AWS](https://aws.amazon.com/pt/rds/). - - Outras tecnologias para somar no projeto. + 7. Instale a CLI da AWS: ---- + `sudo apt-get update` + `sudo apt-get install awscli` -### Entrega + 8. Crie o cluster -1. Efetue o fork deste repositório e crie um branch com o seu nome e sobrenome. (exemplo: fulano-dasilva) -2. Após finalizar o desafio, crie um Pull Request. -3. Aguarde algum contribuidor realizar o code review. -4. Deverá conter a documentação para instalação e configuração README.md. -5. Enviar para o email wphost@apiki.com os dados de acesso SSH com permissão root, da máquina configurada na AWS. + `kops create cluster $NAME --zones us-east-2c --authorization RBAC --master-size t2.micro --master-volume-size 10 --node-size t2.medium --node-volume-size 10 --yes` ---- + 9. Aguarde a inicialização do cluster. + 1. A execução do comando 'kops validate cluster' nos dirá qual é o estado atual da instalação. Se você vir "não é possível obter nós" inicialmente, apenas seja paciente, pois o cluster não pode relatar até que alguns serviços básicos estejam em funcionamento. -### Validação + `time until kops validate cluster; do sleep 15 ; done` + + 10. Confirme se kubectl está conectado ao seu cluster Kubernetes. -* Será executado os precessos de instalação e configuração de acordo com a orientação da documentação em um servidor interno da Apiki. -* Será avaliado o processo de automação para criação do ambiente em cloud, tempo de execução e a configuração no server na AWS com os dados fornecidos pelo candidato. -* Deverar constar pelo menos 2 containers. + `kubectl get nodes` ---- + 11. (Opcional) Se você deseja usar o kubectl e o helm na sua máquina local. Siga esses passos: + 1. Execute o seguinte comando no CI host: + + `kops export kubecfg` -## Documentação - Resultado + 2. Copie o conteúdo do arquivo `~/.kube/config` para o mesmo local no sistema local. -### Pré-requisitos + 3. Com isso você poderá orquestrar o seu cluster através da sua máquina local, ao invés de ter que entrar via ssh no CI host. - - [Helm](https://helm.sh/docs/intro/install/) - - [Docker](https://www.docker.com/) - - [Cluster Kubernetes](https://kubernetes.io/) - - [RDS AWS](https://aws.amazon.com/pt/rds/) --- -## Database +## Criar os containers e pods +Depois de criar o cluster, você já pode criar todas as implantações necessárias que rodarão nos pods. + 1. Caso tenha feito o passo 11, a primeira coisa a se fazer é clonar esse repositório na sua máquina local. + 2. Caso tenha pulado o passo 11, é necessário clonar esse repositório no CI host. -1. O projeto utiliza o serviço de banco de dados Amazon RDS. -2. É necessário criar uma instância e salvar as credenciais de acesso: master username, master password e o endpoint. Essas informações serão utilizadas depois. ---- +### Implantação Wordpress e MySQL +Para implantar o Wordpress, Apache e MySQL vai ser necessário usar o Helm Chart que está no diretório `wp-php-chart` desse repositório. -## Criar cluster +`helm install wp-php-chart wp-phpchart\` + + +### Implantação balanceador de carga com Ingress Nginx +Para implantar o Nginx que terá uma função de proxy, siga os passos abaixo: + 1. Adicione o repositório abaixo para conseguir utilizar o chart. Caso queira, pode conferir a [documentação](https://hub.kubeapps.com/charts/stable/nginx-ingress) do respectivo chart. + + `helm repo add stable https://kubernetes-charts.storage.googleapis.com/` + + 2. Instale o Helm Chart do nginx ingress. Caso queria definir alguma configuração personalizada, mude no arquivo `nginx\values.yaml`. É nesse passo que o balanceador de carga será criado, junto com as implantações do Nginx. + + `helm install nginx stable/nginx-ingress -f nginx\values.yaml` -1. + 3. Descubra o ip externo do controlador nginx. + `kubectl get services` + 4. Altere a entrada spec.rules.host do arquivo `nginx\ingress.yaml` e coloque o ip externo que você descobriu no passo anterior. + + 5. Implante o ingress + + `kubectl apply -f nginx\ingress.yaml` + + +### Implantação do McRouter - Opcional +O Mcrouter (pronuncia-se "mick router"), um proxy Memcached de código aberto eficiente, permite o agrupamento de conexões. A integração do Mcrouter é perfeita porque ele usa o protocolo padrão Memcached ASCII. Para um cliente do Memcached, o Mcrouter se comporta como um servidor do Memcached normal. Para um servidor do Memcached, o Mcrouter se comporta como um cliente do Memcached normal. + +Uma maneira simples de implantar um serviço do Memcached no cluster é usar um gráfico do Helm. + +`helm install cache stable/mcrouter --set memcached.replicaCount=2` + +Depois de implantar o McRouter, recomendo utilizar o plugin W3 Total Cache para realizar as configurações para começar a utilizar o memcached. + +--- +## Deletar o cluster +1. Se em algum momento você desejar destruir seu cluster, execute: -## Implantação balanceador de carga com Ingress Nginx -helm repo add stable https://kubernetes-charts.storage.googleapis.com/ -helm install nginx stable/nginx-ingress -f nginx\values.yaml \ No newline at end of file +`kops delete cluster $NAME --yes` \ No newline at end of file diff --git a/nginx/ingress.yaml b/nginx/ingress.yaml index b0a11e3..3c64715 100644 --- a/nginx/ingress.yaml +++ b/nginx/ingress.yaml @@ -8,7 +8,7 @@ metadata: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - - host: a15cc09994be04ba58e39a5097f3a2a5-796552887.us-east-2.elb.amazonaws.com + - host: nginx-external-ip-aqui http: paths: - path: / diff --git a/nginx/values.yaml b/nginx/values.yaml index 050541c..0f12964 100644 --- a/nginx/values.yaml +++ b/nginx/values.yaml @@ -2,7 +2,4 @@ controller: extraArgs: v: 2 proxySetHeaders: - # Host: $host X-Forwarded-For: $proxy_add_x_forwarded_for -#defaultBackend: -# port: 80 \ No newline at end of file diff --git a/php/Dockerfile b/php/Dockerfile new file mode 100644 index 0000000..4d6ea13 --- /dev/null +++ b/php/Dockerfile @@ -0,0 +1,70 @@ +FROM wordpress:5.4.2-php7.4-apache + +ENV TZ=America/Sao_Paulo +RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone + +RUN apt-get update && apt-get install -y \ + libtidy-dev \ + zlib1g-dev \ + libicu-dev \ + libpq-dev \ + libmemcached-dev \ + locales \ + gettext-base \ + vim \ + gnupg gnupg2 gnupg1 + +RUN localedef -i pt_BR -c -f UTF-8 -A /usr/share/locale/locale.alias pt_BR.UTF-8 + +ENV LANG pt_BR.UTF-8 +ENV LC_ALL pt_BR.UTF-8 + +RUN pecl install apcu \ + pecl install msgpack \ + pecl install igbinary + +RUN docker-php-ext-install pdo_mysql \ + && docker-php-ext-install tidy \ + && docker-php-ext-enable apcu \ + && docker-php-ext-enable msgpack \ + && docker-php-ext-enable igbinary + +# Instalação da extensão memcached +RUN curl -kL -o /tmp/memcached.tar.gz "https://github.com/php-memcached-dev/php-memcached/archive/v3.1.3.tar.gz" \ + && mkdir -p /usr/src/php/ext/memcached \ + && tar -C /usr/src/php/ext/memcached -zxvf /tmp/memcached.tar.gz --strip 1 \ + && docker-php-ext-configure memcached --enable-memcached-igbinary --enable-memcached-json --enable-memcached-msgpack + +RUN docker-php-ext-install memcached + +RUN apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/* + +RUN { \ + echo 'memory_limit = 256M'; \ + echo 'post_max_size = 50M'; \ + echo 'upload_max_filesize = 50M'; \ + echo 'max_execution_time = 300'; \ + echo 'date.timezone = "America/Fortaleza"'; \ + echo 'max_input_vars = 4000'; \ + echo 'realpath_cache_size = 1M'; \ + echo 'realpath_cache_ttl = 300'; \ + echo 'output_buffering = 4096'; \ + echo 'short_open_tag = "off"'; \ + echo 'expose_php = "off"'; \ + echo 'apc.shm_size = 256M'; \ + echo 'apc.ttl = 7200'; \ + echo 'apc.user_ttl = 7200'; \ + echo 'apc.gc_ttl = 3600'; \ + echo 'memcached.sess_binary_protocol = "Off"'; \ + echo 'session.save_handler = "memcached"'; \ + echo 'session.save_path = "memcached-memcached-svc:11211"'; \ +} > /usr/local/etc/php/conf.d/extra-conf.ini + +COPY php-entrypoint.sh /usr/local/bin/ +RUN chmod +x /usr/local/bin/php-entrypoint.sh + +WORKDIR /var/www/html + +ENTRYPOINT ["php-entrypoint.sh"] +CMD ["apache2-foreground"] diff --git a/php/php-entrypoint.sh b/php/php-entrypoint.sh new file mode 100644 index 0000000..0292725 --- /dev/null +++ b/php/php-entrypoint.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +if [ ! -z "$NODE_NAME" ]; then + envsubst '$NODE_NAME' < /var/www/html/wp-content/w3tc-config/master.php > /var/www/html/wp-content/w3tc-config/master.template + mv /var/www/html/wp-content/w3tc-config/master.template /var/www/html/wp-content/w3tc-config/master.php + # configuração para ter um código php imutavél, por causa do cache do opcache. Viável em prod + #echo 'opcache.validate_timestamps = 0' >> /usr/local/etc/php/conf.d/extra-conf.ini + + # Replace session.save_path and memcached session config + sed -i -e "s/memcached-memcached-svc:11211/$NODE_NAME:5000/g" /usr/local/etc/php/conf.d/extra-conf.ini + + # Check if newrelic should be installed + if [ ! -z "$NR_INSTALL_KEY" ]; then + # Install new relic + newrelic-install install + + # Replace PHP Application with our custom name. + sed -i -e "s/PHP Application/$NR_APP_NAME/g" /usr/local/etc/php/conf.d/newrelic.ini + fi +fi + +# dev environment +if [ ! -z "$MEMCACHED_SERVER" ]; then + NODE_NAME=$MEMCACHED_SERVER + envsubst '$NODE_NAME' < /var/www/html/wp-content/w3tc-config/master.php > /var/www/html/wp-content/w3tc-config/master.template + mv /var/www/html/wp-content/w3tc-config/master.template /var/www/html/wp-content/w3tc-config/master.php +fi + +exec /usr/local/bin/docker-entrypoint.sh "$@" \ No newline at end of file diff --git a/wp-php-chart/templates/app/deployment.yaml b/wp-php-chart/templates/app/deployment.yaml index 50b3e3f..e14dbab 100644 --- a/wp-php-chart/templates/app/deployment.yaml +++ b/wp-php-chart/templates/app/deployment.yaml @@ -10,8 +10,6 @@ spec: matchLabels: app: {{ .Values.image.deployment }} tier: backend - strategy: - type: Recreate template: metadata: labels: @@ -20,8 +18,13 @@ spec: spec: containers: - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" + imagePullPolicy: Always name: {{ .Values.image.deployment }} env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName - name: WORDPRESS_DB_HOST value: {{ .Values.db.host }} - name: WORDPRESS_DB_NAME diff --git a/wp-php-chart/templates/app/pvc.yaml b/wp-php-chart/templates/app/pvc.yaml index 9c7f3c6..f060cbf 100644 --- a/wp-php-chart/templates/app/pvc.yaml +++ b/wp-php-chart/templates/app/pvc.yaml @@ -3,10 +3,10 @@ kind: PersistentVolumeClaim metadata: name: wp-pv-claim labels: - app: {{ .Values.image.deployment }} + app: {{ .Values.image.deployment }} spec: accessModes: - ReadWriteOnce resources: requests: - storage: 20Gi \ No newline at end of file + storage: 5Gi \ No newline at end of file diff --git a/wp-php-chart/templates/mysql/deployment.yaml b/wp-php-chart/templates/mysql/deployment.yaml index 5176d97..7f0ef3a 100644 --- a/wp-php-chart/templates/mysql/deployment.yaml +++ b/wp-php-chart/templates/mysql/deployment.yaml @@ -24,7 +24,7 @@ spec: - ReadWriteOnce resources: requests: - storage: 20Gi + storage: 5Gi --- apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment @@ -46,8 +46,9 @@ spec: tier: mysql spec: containers: - - image: mysql:5.6 - restart: always + - image: mysql:5.7 + args: + - "--ignore-db-dir=lost+found" name: mysql env: - name: MYSQL_DATABASE diff --git a/wp-php-chart/values.yaml b/wp-php-chart/values.yaml index 35cdd05..272e0bb 100644 --- a/wp-php-chart/values.yaml +++ b/wp-php-chart/values.yaml @@ -5,14 +5,14 @@ replicaCount: 1 image: - repository: wordpress + repository: lucasbg0/wordpress deployment: wordpress pullPolicy: IfNotPresent # Overrides the image tag whose default is the chart appVersion. tag: 5.4.2-php7.4-apache db: - host: wordpress.c9nj6ewjaqpn.us-east-2.rds.amazonaws.com + host: wordpress-mysql name: wordpress secretName: db-credentials From 95e89adb1be95c3def79093e5437027b9fd73658 Mon Sep 17 00:00:00 2001 From: Lucas Barbosa Date: Mon, 20 Jul 2020 02:16:38 -0300 Subject: [PATCH 3/7] Atualizando doc --- README.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 938a60e..307d7ed 100644 --- a/README.md +++ b/README.md @@ -36,20 +36,20 @@ Esse projeto tem como objetivo rodar uma aplicação Wordpress em um cluster Kub 4. Instale o kops e o kubectl no CI host. Siga as instruções [aqui](https://github.com/kubernetes/kops/blob/master/docs/install.md). 5. Configure um par de chaves ssh para usar com o cluster 6. Crie as seguintes variáveis pelo terminal - 1. Como não estamos usando DNS pré-configurado, usaremos o sufixo “.k8s.local”. De acordo com a documentação do k8s, se o nome DNS terminar em .k8s.local, o cluster usará o DNS hospedado interno. - + * Como não estamos usando DNS pré-configurado, usaremos o sufixo “.k8s.local”. De acordo com a documentação do k8s, se o nome DNS terminar em .k8s.local, o cluster usará o DNS hospedado interno. + `export NAME=.k8s.local` - - 2. Crie um bucket S3 para armazenar sua configuração de cluster. É recomendável ativar o controle de versão no bucket S3. Não precisamos passar isso para os comandos do KOPS. Ele detecta automaticamente pela ferramenta kops como uma variável env. - + + * Crie um bucket S3 para armazenar sua configuração de cluster. É recomendável ativar o controle de versão no bucket S3. Não precisamos passar isso para os comandos do KOPS. Ele detecta automaticamente pela ferramenta kops como uma variável env. + `export KOPS_STATE_STORE=s3://` - - 3. Defina a mesma região utilizada na instância CI host. - + + * Defina a mesma região utilizada na instância CI host. + `export REGION=us-east-2` - - 4. É recomendável configurar essas variáveis no arquivo `/etc/profiles`. As variáveis definidas neste arquivo são carregadas sempre que um shell de login do bash é iniciado. Ao declarar variáveis de ambiente neste arquivo, você precisa usar o comando export também. Igual nos exemplos anteriores. - + + * É recomendável configurar essas variáveis no arquivo `/etc/profiles`. As variáveis definidas neste arquivo são carregadas sempre que um shell de login do bash é iniciado. Ao declarar variáveis de ambiente neste arquivo, você precisa usar o comando export também. Igual nos exemplos anteriores. + `sudo nano /etc/profiles` 7. Instale a CLI da AWS: @@ -62,7 +62,7 @@ Esse projeto tem como objetivo rodar uma aplicação Wordpress em um cluster Kub `kops create cluster $NAME --zones us-east-2c --authorization RBAC --master-size t2.micro --master-volume-size 10 --node-size t2.medium --node-volume-size 10 --yes` 9. Aguarde a inicialização do cluster. - 1. A execução do comando 'kops validate cluster' nos dirá qual é o estado atual da instalação. Se você vir "não é possível obter nós" inicialmente, apenas seja paciente, pois o cluster não pode relatar até que alguns serviços básicos estejam em funcionamento. + * A execução do comando 'kops validate cluster' nos dirá qual é o estado atual da instalação. Se você vir "não é possível obter nós" inicialmente, apenas seja paciente, pois o cluster não pode relatar até que alguns serviços básicos estejam em funcionamento. `time until kops validate cluster; do sleep 15 ; done` @@ -71,13 +71,13 @@ Esse projeto tem como objetivo rodar uma aplicação Wordpress em um cluster Kub `kubectl get nodes` 11. (Opcional) Se você deseja usar o kubectl e o helm na sua máquina local. Siga esses passos: - 1. Execute o seguinte comando no CI host: + * Execute o seguinte comando no CI host: - `kops export kubecfg` + `kops export kubecfg` - 2. Copie o conteúdo do arquivo `~/.kube/config` para o mesmo local no sistema local. + * Copie o conteúdo do arquivo `~/.kube/config` para o mesmo local no sistema local. - 3. Com isso você poderá orquestrar o seu cluster através da sua máquina local, ao invés de ter que entrar via ssh no CI host. + * Com isso você poderá orquestrar o seu cluster através da sua máquina local, ao invés de ter que entrar via ssh no CI host. --- From 089b360ff49303a8e0fee88729d8382650f104d8 Mon Sep 17 00:00:00 2001 From: Lucas Barbosa Date: Mon, 20 Jul 2020 02:19:43 -0300 Subject: [PATCH 4/7] =?UTF-8?q?Adicionando=20vers=C3=A3o=20do=20linux=20no?= =?UTF-8?q?=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 307d7ed..756245b 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ Esse projeto tem como objetivo rodar uma aplicação Wordpress em um cluster Kub * AmazonVPCFullAccess 2. Crie uma nova instância para usar como seu CI host. Este nó lidará com o provisionamento e o desmembramento do cluster. - 1. Essa instância pode ser pequena (t2.micro por exemplo). + 1. Essa instância (Ubuntu 16.04) pode ser pequena (t2.micro por exemplo). 2. Ao criá-lo, atribua a função IAM criada na primeira etapa. 3. Uma vez criada, faça o download das chaves ssh ou adicione a sua própria chave pública do seu computador local na instância. From 23407af9465bbde24f7a405422a9100fdf9febd0 Mon Sep 17 00:00:00 2001 From: Lucas Barbosa Date: Mon, 20 Jul 2020 04:21:28 -0300 Subject: [PATCH 5/7] Adicionando secret no readme --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 756245b..36e2b77 100644 --- a/README.md +++ b/README.md @@ -89,6 +89,12 @@ Depois de criar o cluster, você já pode criar todas as implantações necessá ### Implantação Wordpress e MySQL +Antes da criação dos containers principais, e obrigatório a criação de um secret para o usuário e senha do banco de dados. + +Crie a chave secreta db-credentiais usando o nome e a senha do usuário do banco de dados de sua escolha: + +`kubectl create secret generic credenciais-db-cloudsql --from-literal=username= --from-literal=password=` + Para implantar o Wordpress, Apache e MySQL vai ser necessário usar o Helm Chart que está no diretório `wp-php-chart` desse repositório. `helm install wp-php-chart wp-phpchart\` From fcf7cbf10c7cea8a190158316a91d6a9e20506aa Mon Sep 17 00:00:00 2001 From: Lucas Barbosa Date: Mon, 20 Jul 2020 04:24:38 -0300 Subject: [PATCH 6/7] Wp debug false --- README.md | 4 ++-- wp-php-chart/templates/app/deployment.yaml | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 36e2b77..6fb804b 100644 --- a/README.md +++ b/README.md @@ -91,9 +91,9 @@ Depois de criar o cluster, você já pode criar todas as implantações necessá ### Implantação Wordpress e MySQL Antes da criação dos containers principais, e obrigatório a criação de um secret para o usuário e senha do banco de dados. -Crie a chave secreta db-credentiais usando o nome e a senha do usuário do banco de dados de sua escolha: +Crie a chave secreta db-credentials usando o nome e a senha do usuário do banco de dados de sua escolha: -`kubectl create secret generic credenciais-db-cloudsql --from-literal=username= --from-literal=password=` +`kubectl create secret generic db-credentials --from-literal=username= --from-literal=password=` Para implantar o Wordpress, Apache e MySQL vai ser necessário usar o Helm Chart que está no diretório `wp-php-chart` desse repositório. diff --git a/wp-php-chart/templates/app/deployment.yaml b/wp-php-chart/templates/app/deployment.yaml index e14dbab..8c90f50 100644 --- a/wp-php-chart/templates/app/deployment.yaml +++ b/wp-php-chart/templates/app/deployment.yaml @@ -38,9 +38,7 @@ spec: valueFrom: secretKeyRef: name: {{ .Values.db.secretName }} - key: password - - name: WORDPRESS_DEBUG - value: "TRUE" + key: password ports: - containerPort: {{ .Values.service.port }} name: {{ .Values.image.deployment }} From 4c6623ef1376bd6aac9543df3d2f6faf2175dd9d Mon Sep 17 00:00:00 2001 From: Lucas Barbosa Date: Mon, 20 Jul 2020 12:43:13 -0300 Subject: [PATCH 7/7] =?UTF-8?q?Adicionando=20refer=C3=AAncias=20utilizadas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6fb804b..15f1c28 100644 --- a/README.md +++ b/README.md @@ -135,4 +135,16 @@ Depois de implantar o McRouter, recomendo utilizar o plugin W3 Total Cache para ## Deletar o cluster 1. Se em algum momento você desejar destruir seu cluster, execute: -`kops delete cluster $NAME --yes` \ No newline at end of file +`kops delete cluster $NAME --yes` + +--- + +## Referências + + - [Mcrouter](https://github.com/helm/charts/tree/master/stable/mcrouter) + - [Nginx Ingress](https://hub.kubeapps.com/charts/stable/nginx-ingress) + - [Wordpress Image](https://hub.docker.com/_/wordpress/) + - [Kops](https://kubernetes.io/docs/setup/production-environment/tools/kops/) + - [Kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/) + - [Kubernetes na AWS](https://kubernetes.io/docs/setup/production-environment/turnkey/aws/) + - [Helm](https://helm.sh/docs/intro/) \ No newline at end of file