Skip to content

Commit 607e544

Browse files
[pt-br] Add /tasks/run-application/run-single-instance-stateful-application.md
1 parent fdf65c8 commit 607e544

File tree

4 files changed

+254
-0
lines changed

4 files changed

+254
-0
lines changed
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
---
2+
title: Executar uma Aplicação Com Estado de Instância Única
3+
content_type: tutorial
4+
weight: 20
5+
---
6+
7+
<!-- overview -->
8+
9+
Esta página mostra como executar um aplicativo com estado de instância única no Kubernetes utilizando um PersistentVolume e um Deployment. O aplicativo utilizado é o MySQL.
10+
11+
## {{% heading "objectives" %}}
12+
13+
- Crie um PersistentVolume referenciando um disco no seu ambiente.
14+
- Crie um Deployment do MySQL.
15+
- Exponha o MySQL para outros pods no cluster em um nome DNS conhecido.
16+
17+
## {{% heading "prerequisites" %}}
18+
19+
- {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
20+
21+
- {{< include "default-storage-class-prereqs.md" >}}
22+
23+
<!-- lessoncontent -->
24+
25+
## Fazer o deploy do MySQL
26+
27+
Você pode executar um aplicativo com estado criando um Deployment do Kubernetes e conectando-o a um PersistentVolume existente usando um PersistentVolumeClaim. Por exemplo, este arquivo YAML descreve um Deployment que executa o MySQL e faz referência ao PersistentVolumeClaim. O arquivo define um volume mount para /var/lib/mysql e, em seguida, cria um PersistentVolumeClaim que procura por um volume de 20G. Essa requisição é atendida por qualquer volume existente que atenda aos requisitos ou por um provisionador dinâmico.
28+
29+
Note: A senha é definida no arquivo de configuração yaml, e isso não é seguro. Veja
30+
[Secrets do Kubernetes](/docs/concepts/configuration/secret/) para uma solução segura.
31+
32+
{{% code_sample file="application/mysql/mysql-deployment.yaml" %}}
33+
{{% code_sample file="application/mysql/mysql-pv.yaml" %}}
34+
35+
1. Faça o deploy do PV e do PVC do arquivo YAML:
36+
37+
```shell
38+
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml
39+
```
40+
41+
1. Faça o deploy do conteúdo do arquivo YAML:
42+
43+
```shell
44+
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml
45+
```
46+
47+
1. Exiba informações sobre o Deployment:
48+
49+
```shell
50+
kubectl describe deployment mysql
51+
```
52+
53+
A saída é semelhante a esta:
54+
55+
```
56+
Name: mysql
57+
Namespace: default
58+
CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700
59+
Labels: app=mysql
60+
Annotations: deployment.kubernetes.io/revision=1
61+
Selector: app=mysql
62+
Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable
63+
StrategyType: Recreate
64+
MinReadySeconds: 0
65+
Pod Template:
66+
Labels: app=mysql
67+
Containers:
68+
mysql:
69+
Image: mysql:9
70+
Port: 3306/TCP
71+
Environment:
72+
MYSQL_ROOT_PASSWORD: password
73+
Mounts:
74+
/var/lib/mysql from mysql-persistent-storage (rw)
75+
Volumes:
76+
mysql-persistent-storage:
77+
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
78+
ClaimName: mysql-pv-claim
79+
ReadOnly: false
80+
Conditions:
81+
Type Status Reason
82+
---- ------ ------
83+
Available False MinimumReplicasUnavailable
84+
Progressing True ReplicaSetUpdated
85+
OldReplicaSets: <none>
86+
NewReplicaSet: mysql-63082529 (1/1 replicas created)
87+
Events:
88+
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
89+
--------- -------- ----- ---- ------------- -------- ------ -------
90+
33s 33s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set mysql-63082529 to 1
91+
```
92+
93+
1. Liste os pods criados pelo Deployment:
94+
95+
```shell
96+
kubectl get pods -l app=mysql
97+
```
98+
99+
A saída é semelhante a esta:
100+
101+
```
102+
NAME READY STATUS RESTARTS AGE
103+
mysql-63082529-2z3ki 1/1 Running 0 3m
104+
```
105+
106+
1. Inspecione o PersistentVolumeClaim:
107+
108+
```shell
109+
kubectl describe pvc mysql-pv-claim
110+
```
111+
112+
A saída é semelhante a esta:
113+
114+
```
115+
Name: mysql-pv-claim
116+
Namespace: default
117+
StorageClass:
118+
Status: Bound
119+
Volume: mysql-pv-volume
120+
Labels: <none>
121+
Annotations: pv.kubernetes.io/bind-completed=yes
122+
pv.kubernetes.io/bound-by-controller=yes
123+
Capacity: 20Gi
124+
Access Modes: RWO
125+
Events: <none>
126+
```
127+
128+
## Acessando a instância do MySQL
129+
130+
O arquivo YAML anterior cria um Service que permite que outros Pods no cluster acessem o banco de dados. A opção `clusterIP: None` faz com que o nome DNS do Service resolva diretamente para o endereço IP do Pod. Isso é ideal quando você tem apenas um Pod por trás do Service e não pretende aumentar o número de Pods.
131+
132+
Execute um cliente MySQL para se conectar ao servidor:
133+
134+
```shell
135+
kubectl run -it --rm --image=mysql:9 --restart=Never mysql-client -- mysql -h mysql -ppassword
136+
```
137+
138+
Este comando cria um novo Pod no cluster executando um cliente MySQL e o conecta ao servidor por meio do Service. Se a conexão for bem-sucedida, você saberá que seu banco de dados MySQL com estado está em funcionamento.
139+
140+
```
141+
Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: false
142+
If you don't see a command prompt, try pressing enter.
143+
144+
mysql>
145+
```
146+
147+
## Atualizando
148+
149+
A imagem ou qualquer outra parte do Deployment pode ser atualizada normalmente
150+
com o comando `kubectl apply`. Aqui estão algumas precauções específicas para aplicativos com estado:
151+
152+
- Não faça o escalonamento do aplicativo. Esta configuração é apenas para aplicativos de instância única.
153+
O PersistentVolume subjacente só pode ser montado em um Pod. Para aplicativos com estado em cluster, consulte a
154+
[documentação do StatefulSet](/docs/concepts/workloads/controllers/statefulset/).
155+
- Use `strategy:` `type: Recreate` no arquivo YAML de configuração do Deployment.
156+
Isso instrui o Kubernetes a _não_ usar atualizações rolling. Atualizações rolling não funcionarão, pois não é possível ter mais de um Pod em execução ao mesmo tempo. A estratégia `Recreate` irá parar o primeiro pod antes de criar um novo com a configuração atualizada.
157+
158+
## Excluindo um deployment
159+
160+
Exclua os objetos implantados pelo nome:
161+
162+
```shell
163+
kubectl delete deployment,svc mysql
164+
kubectl delete pvc mysql-pv-claim
165+
kubectl delete pv mysql-pv-volume
166+
```
167+
168+
Se você provisionou manualmente um PersistentVolume, também precisará excluí-lo manualmente, assim como liberar o recurso subjacente.
169+
Se você usou um provisionador dinâmico, ele exclui automaticamente o PersistentVolume ao detectar que você excluiu o PersistentVolumeClaim.
170+
Alguns provisionadores dinâmicos (como os de EBS e PD) também liberam o recurso subjacente ao excluir o PersistentVolume.
171+
172+
## {{% heading "whatsnext" %}}
173+
174+
- Saiba mais sobre [objetos Deployment](/docs/concepts/workloads/controllers/deployment/).
175+
176+
- Saiba mais sobre [implantação de aplicativos](/docs/tasks/run-application/run-stateless-application-deployment/)
177+
178+
- [Documentação do kubectl run](/docs/reference/generated/kubectl/kubectl-commands/#run)
179+
180+
- [Volumes](/docs/concepts/storage/volumes/) e [Persistent Volumes](/docs/concepts/storage/persistent-volumes/)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: mysql
5+
spec:
6+
ports:
7+
- port: 3306
8+
selector:
9+
app: mysql
10+
clusterIP: None
11+
---
12+
apiVersion: apps/v1
13+
kind: Deployment
14+
metadata:
15+
name: mysql
16+
spec:
17+
selector:
18+
matchLabels:
19+
app: mysql
20+
strategy:
21+
type: Recreate
22+
template:
23+
metadata:
24+
labels:
25+
app: mysql
26+
spec:
27+
containers:
28+
- image: mysql:9
29+
name: mysql
30+
env:
31+
# Em cenários reais, utilize um Secret
32+
- name: MYSQL_ROOT_PASSWORD
33+
value: password
34+
ports:
35+
- containerPort: 3306
36+
name: mysql
37+
volumeMounts:
38+
- name: mysql-persistent-storage
39+
mountPath: /var/lib/mysql
40+
volumes:
41+
- name: mysql-persistent-storage
42+
persistentVolumeClaim:
43+
claimName: mysql-pv-claim
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
apiVersion: v1
2+
kind: PersistentVolume
3+
metadata:
4+
name: mysql-pv-volume
5+
labels:
6+
type: local
7+
spec:
8+
storageClassName: manual
9+
capacity:
10+
storage: 20Gi
11+
accessModes:
12+
- ReadWriteOnce
13+
hostPath:
14+
path: "/mnt/data"
15+
---
16+
apiVersion: v1
17+
kind: PersistentVolumeClaim
18+
metadata:
19+
name: mysql-pv-claim
20+
spec:
21+
storageClassName: manual
22+
accessModes:
23+
- ReadWriteOnce
24+
resources:
25+
requests:
26+
storage: 20Gi
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Você precisa ter um [provisionador dinâmico de PersistentVolume](/docs/concepts/storage/dynamic-provisioning/) com uma
2+
[StorageClass](/docs/concepts/storage/storage-classes/) padrão,
3+
ou [provisionar PersistentVolumes estaticamente](/docs/concepts/storage/persistent-volumes/#provisioning)
4+
por conta própria para atender aos [PersistentVolumeClaims](/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims)
5+
utilizados aqui.

0 commit comments

Comments
 (0)