Skip to content

Commit 4e7fb02

Browse files
authored
Merge pull request #51049 from paulofponciano/issue-50949
[pt-br] Add /tasks/run-application/run-single-instance-stateful-application.md
2 parents 962c579 + 4e15fb1 commit 4e7fb02

File tree

4 files changed

+255
-0
lines changed

4 files changed

+255
-0
lines changed
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
---
2+
title: Executar uma Aplicação Com Estado e 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 e de instância única no Kubernetes utilizando um PersistentVolume e um Deployment.
10+
O aplicativo utilizado é o MySQL.
11+
12+
## {{% heading "objectives" %}}
13+
14+
- Crie um PersistentVolume referenciando um disco no seu ambiente.
15+
- Crie um Deployment do MySQL.
16+
- Exponha o MySQL para outros pods no cluster em um nome DNS conhecido.
17+
18+
## {{% heading "prerequisites" %}}
19+
20+
- {{< include "task-tutorial-prereqs.md" >}} {{< version-check >}}
21+
22+
- {{< include "default-storage-class-prereqs.md" >}}
23+
24+
<!-- lessoncontent -->
25+
26+
## Fazer o deploy do MySQL
27+
28+
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.
29+
30+
Note: A senha é definida no arquivo de configuração yaml, e isso não é seguro. Veja
31+
[Secrets do Kubernetes](/docs/concepts/configuration/secret/) para uma solução segura.
32+
33+
{{% code_sample file="application/mysql/mysql-deployment.yaml" %}}
34+
{{% code_sample file="application/mysql/mysql-pv.yaml" %}}
35+
36+
1. Faça o deploy do PV e do PVC do arquivo YAML:
37+
38+
```shell
39+
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml
40+
```
41+
42+
1. Faça o deploy do conteúdo do arquivo YAML:
43+
44+
```shell
45+
kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml
46+
```
47+
48+
1. Exiba informações sobre o Deployment:
49+
50+
```shell
51+
kubectl describe deployment mysql
52+
```
53+
54+
A saída é semelhante a esta:
55+
56+
```
57+
Name: mysql
58+
Namespace: default
59+
CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700
60+
Labels: app=mysql
61+
Annotations: deployment.kubernetes.io/revision=1
62+
Selector: app=mysql
63+
Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable
64+
StrategyType: Recreate
65+
MinReadySeconds: 0
66+
Pod Template:
67+
Labels: app=mysql
68+
Containers:
69+
mysql:
70+
Image: mysql:9
71+
Port: 3306/TCP
72+
Environment:
73+
MYSQL_ROOT_PASSWORD: password
74+
Mounts:
75+
/var/lib/mysql from mysql-persistent-storage (rw)
76+
Volumes:
77+
mysql-persistent-storage:
78+
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
79+
ClaimName: mysql-pv-claim
80+
ReadOnly: false
81+
Conditions:
82+
Type Status Reason
83+
---- ------ ------
84+
Available False MinimumReplicasUnavailable
85+
Progressing True ReplicaSetUpdated
86+
OldReplicaSets: <none>
87+
NewReplicaSet: mysql-63082529 (1/1 replicas created)
88+
Events:
89+
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
90+
--------- -------- ----- ---- ------------- -------- ------ -------
91+
33s 33s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set mysql-63082529 to 1
92+
```
93+
94+
1. Liste os pods criados pelo Deployment:
95+
96+
```shell
97+
kubectl get pods -l app=mysql
98+
```
99+
100+
A saída é semelhante a esta:
101+
102+
```
103+
NAME READY STATUS RESTARTS AGE
104+
mysql-63082529-2z3ki 1/1 Running 0 3m
105+
```
106+
107+
1. Inspecione o PersistentVolumeClaim:
108+
109+
```shell
110+
kubectl describe pvc mysql-pv-claim
111+
```
112+
113+
A saída é semelhante a esta:
114+
115+
```
116+
Name: mysql-pv-claim
117+
Namespace: default
118+
StorageClass:
119+
Status: Bound
120+
Volume: mysql-pv-volume
121+
Labels: <none>
122+
Annotations: pv.kubernetes.io/bind-completed=yes
123+
pv.kubernetes.io/bound-by-controller=yes
124+
Capacity: 20Gi
125+
Access Modes: RWO
126+
Events: <none>
127+
```
128+
129+
## Acessando a instância do MySQL
130+
131+
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.
132+
133+
Execute um cliente MySQL para se conectar ao servidor:
134+
135+
```shell
136+
kubectl run -it --rm --image=mysql:9 --restart=Never mysql-client -- mysql -h mysql -ppassword
137+
```
138+
139+
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.
140+
141+
```
142+
Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: false
143+
If you don't see a command prompt, try pressing enter.
144+
145+
mysql>
146+
```
147+
148+
## Atualizando
149+
150+
A imagem ou qualquer outra parte do Deployment pode ser atualizada normalmente
151+
com o comando `kubectl apply`. Aqui estão algumas precauções específicas para aplicativos com estado:
152+
153+
- Não faça o escalonamento do aplicativo. Esta configuração é apenas para aplicativos de instância única.
154+
O PersistentVolume subjacente só pode ser montado em um Pod. Para aplicativos com estado em cluster, consulte a
155+
[documentação do StatefulSet](/docs/concepts/workloads/controllers/statefulset/).
156+
- Use `strategy:` `type: Recreate` no arquivo YAML de configuração do Deployment.
157+
Isso instrui o Kubernetes a _não_ usar atualizações graduais. Atualizações graduais 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.
158+
159+
## Excluindo um deployment
160+
161+
Exclua os objetos implantados pelo nome:
162+
163+
```shell
164+
kubectl delete deployment,svc mysql
165+
kubectl delete pvc mysql-pv-claim
166+
kubectl delete pv mysql-pv-volume
167+
```
168+
169+
Se você provisionou manualmente um PersistentVolume, também precisará excluí-lo manualmente, assim como liberar o recurso subjacente.
170+
Se você usou um provisionador dinâmico, ele exclui automaticamente o PersistentVolume ao detectar que você excluiu o PersistentVolumeClaim.
171+
Alguns provisionadores dinâmicos (como os de EBS e PD) também liberam o recurso subjacente ao excluir o PersistentVolume.
172+
173+
## {{% heading "whatsnext" %}}
174+
175+
- Saiba mais sobre [objetos Deployment](/docs/concepts/workloads/controllers/deployment/).
176+
177+
- Saiba mais sobre [implantação de aplicativos](/docs/tasks/run-application/run-stateless-application-deployment/)
178+
179+
- [Documentação do kubectl run](/docs/reference/generated/kubectl/kubectl-commands/#run)
180+
181+
- [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)