-
Notifications
You must be signed in to change notification settings - Fork 14.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add stateful application tutorial. #1599
Merged
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
apiVersion: v1 | ||
kind: PersistentVolume | ||
metadata: | ||
name: mysql-pv | ||
spec: | ||
capacity: | ||
storage: 20Gi | ||
accessModes: | ||
- ReadWriteOnce | ||
gcePersistentDisk: | ||
pdName: mysql-disk | ||
fsType: ext4 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
apiVersion: v1 | ||
kind: Service | ||
metadata: | ||
name: mysql | ||
spec: | ||
ports: | ||
- port: 3306 | ||
selector: | ||
app: mysql | ||
clusterIP: None | ||
--- | ||
apiVersion: v1 | ||
kind: PersistentVolumeClaim | ||
metadata: | ||
name: mysql-pv-claim | ||
spec: | ||
accessModes: | ||
- ReadWriteOnce | ||
resources: | ||
requests: | ||
storage: 20Gi | ||
--- | ||
apiVersion: extensions/v1beta1 | ||
kind: Deployment | ||
metadata: | ||
name: mysql | ||
spec: | ||
strategy: | ||
type: Recreate | ||
template: | ||
metadata: | ||
labels: | ||
app: mysql | ||
spec: | ||
containers: | ||
- image: mysql:5.6 | ||
name: mysql | ||
env: | ||
# Use secret in real usage | ||
- name: MYSQL_ROOT_PASSWORD | ||
value: 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 |
220 changes: 220 additions & 0 deletions
220
docs/tutorials/stateful-application/run-stateful-application.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,220 @@ | ||
--- | ||
--- | ||
|
||
{% capture overview %} | ||
|
||
This page shows you how to run a single-instance stateful application | ||
in Kubernetes using a PersistentVolume and a Deployment. The | ||
application is MySQL. | ||
|
||
{% endcapture %} | ||
|
||
|
||
{% capture objectives %} | ||
|
||
* Create a PersistentVolume referencing a disk in your environment. | ||
* Create a MySQL Deployment. | ||
* Expose MySQL to other pods in the cluster at a known DNS name. | ||
|
||
{% endcapture %} | ||
|
||
|
||
{% capture prerequisites %} | ||
|
||
* {% include task-tutorial-prereqs.md %} | ||
|
||
* For data persistence we will create a Persistent Volume that | ||
references a disk in your | ||
environment. See | ||
[here](/docs/user-guide/persistent-volumes/#types-of-persistent-volumes) for | ||
the types of environments supported. This Tutorial will demonstrate | ||
`GCEPersistentDisk` but any type will work. `GCEPersistentDisk` | ||
volumes only work on Google Compute Engine. | ||
|
||
{% endcapture %} | ||
|
||
|
||
{% capture lessoncontent %} | ||
|
||
### Set up a disk in your environment | ||
|
||
You can use any type of persistent volume for your stateful app. See | ||
[Types of Persistent Volumes](/docs/user-guide/persistent-volumes/#types-of-persistent-volumes) | ||
for a list of supported environment disks. For Google Compute Engine, run: | ||
|
||
``` | ||
gcloud compute disks create --size=20GB mysql-disk | ||
``` | ||
|
||
Next create a PersistentVolume that points to the `mysql-disk` | ||
disk just created. Here is a configuration file for a PersistentVolume | ||
that points to the Compute Engine disk above: | ||
|
||
{% include code.html language="yaml" file="gce-volume.yaml" ghlink="/docs/tutorials/stateful-application/gce-volume.yaml" %} | ||
|
||
Notice that the `pdName: mysql-disk` line matches the name of the disk | ||
in the Compute Engine environment. See the | ||
[Persistent Volumes](/docs/user-guide/persistent-volumes/) | ||
for details on writing a PersistentVolume configuration file for other | ||
environments. | ||
|
||
Create the persistent volume: | ||
|
||
``` | ||
kubectl create -f http://k8s.io/docs/tutorials/stateful-application/gce-volume.yaml | ||
``` | ||
|
||
|
||
### Deploy MySQL | ||
|
||
You can run a stateful application by creating a Kubernetes Deployment | ||
and connecting it to an existing PersistentVolume using a | ||
PersistentVolumeClaim. For example, this YAML file describes a | ||
Deployment that runs MySQL and references the PersistentVolumeClaim. The file | ||
defines a volume mount for /var/lib/mysql, and then creates a | ||
PersistentVolumeClaim that looks for a 20G volume. This claim is | ||
satisfied by any volume that meets the requirements, in this case, the | ||
volume created above. | ||
|
||
Note: The password is defined in the config yaml, and this is insecure. See | ||
[Kubernetes Secrets](/docs/user-guide/secrets/) | ||
for a secure solution. | ||
|
||
{% include code.html language="yaml" file="mysql-deployment.yaml" ghlink="/docs/tutorials/stateful-application/mysql-deployment.yaml" %} | ||
|
||
1. Deploy the contents of the YAML file: | ||
|
||
kubectl create -f http://k8s.io/docs/tutorials/stateful-application/mysql-deployment.yaml | ||
|
||
1. Display information about the Deployment: | ||
|
||
kubectl describe deployment mysql | ||
|
||
Name: mysql | ||
Namespace: default | ||
CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700 | ||
Labels: app=mysql | ||
Selector: app=mysql | ||
Replicas: 1 updated | 1 total | 0 available | 1 unavailable | ||
StrategyType: Recreate | ||
MinReadySeconds: 0 | ||
OldReplicaSets: <none> | ||
NewReplicaSet: mysql-63082529 (1/1 replicas created) | ||
Events: | ||
FirstSeen LastSeen Count From SubobjectPath Type Reason Message | ||
--------- -------- ----- ---- ------------- -------- ------ ------- | ||
33s 33s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set mysql-63082529 to 1 | ||
|
||
1. List the pods created by the Deployment: | ||
|
||
kubectl get pods -l app=mysql | ||
|
||
NAME READY STATUS RESTARTS AGE | ||
mysql-63082529-2z3ki 1/1 Running 0 3m | ||
|
||
1. Inspect the Persistent Volume: | ||
|
||
kubectl describe pv mysql-pv | ||
|
||
Name: mysql-pv | ||
Labels: <none> | ||
Status: Bound | ||
Claim: default/mysql-pv-claim | ||
Reclaim Policy: Retain | ||
Access Modes: RWO | ||
Capacity: 20Gi | ||
Message: | ||
Source: | ||
Type: GCEPersistentDisk (a Persistent Disk resource in Google Compute Engine) | ||
PDName: mysql-disk | ||
FSType: ext4 | ||
Partition: 0 | ||
ReadOnly: false | ||
No events. | ||
|
||
1. Inspect the PersistentVolumeClaim: | ||
|
||
kubectl describe pvc mysql-pv-claim | ||
|
||
Name: mysql-pv-claim | ||
Namespace: default | ||
Status: Bound | ||
Volume: mysql-pv | ||
Labels: <none> | ||
Capacity: 20Gi | ||
Access Modes: RWO | ||
No events. | ||
|
||
### Accessing the MySQL instance | ||
|
||
The preceding YAML file creates a service that | ||
allows other Pods in the cluster to access the database. The Service option | ||
`clusterIP: None` lets the Service DNS name resolve directly to the | ||
Pod's IP address. This is optimal when you have only one Pod | ||
behind a Service and you don't intend to increase the number of Pods. | ||
|
||
Run a MySQL client to connect to the server: | ||
|
||
``` | ||
kubectl run -it --rm --image=mysql:5.6 mysql-client -- mysql -h mysql -ppassword | ||
``` | ||
|
||
This command creates a new Pod in the cluster running a mysql client | ||
and connects it to the server through the Service. If it connects, you | ||
know your stateful MySQL database is up and running. | ||
|
||
``` | ||
Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: false | ||
If you don't see a command prompt, try pressing enter. | ||
|
||
mysql> | ||
``` | ||
|
||
### Updating | ||
|
||
The image or any other part of the Deployment can be updated as usual | ||
with the `kubectl apply` command. Here are some precautions that are | ||
specific to stateful apps: | ||
|
||
* Don't scale the app. This setup is for single-instance apps | ||
only. The underlying PersistentVolume can only be mounted to one | ||
Pod. For clustered stateful apps, see the | ||
[StatefulSet documentation](/docs/user-guide/petset/). | ||
* Use `strategy:` `type: Recreate` in the Deployment configuration | ||
YAML file. This instructs Kubernetes to _not_ use rolling | ||
updates. Rolling updates will not work, as you cannot have more than | ||
one Pod running at a time. The `Recreate` strategy will stop the | ||
first pod before creating a new one with the updated configuration. | ||
|
||
### Deleting a deployment | ||
|
||
Delete the deployed objects by name: | ||
|
||
``` | ||
kubectl delete deployment,svc mysql | ||
kubectl delete pvc mysql-pv-claim | ||
kubectl delete pv mysql-pv | ||
``` | ||
|
||
Also, if you are using Compute Engine disks: | ||
|
||
``` | ||
gcloud compute disks delete mysql-disk | ||
``` | ||
|
||
{% endcapture %} | ||
|
||
|
||
{% capture whatsnext %} | ||
|
||
* Learn more about [Deployment objects](/docs/user-guide/deployments/). | ||
|
||
* Learn more about [Deploying applications](/docs/user-guide/deploying-applications/) | ||
|
||
* [kubectl run documentation](/docs/user-guide/kubectl/kubectl_run/) | ||
|
||
* [Volumes](/docs/user-guide/volumes/) and [Persistent Volumes](/docs/user-guide/persistent-volumes/) | ||
|
||
{% endcapture %} | ||
|
||
{% include templates/tutorial.md %} |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Steve, The last bullet is important for this sample, I know it is covered in the first step of the tutorial, but I think it is important to call out in the prereqs.