⎈ k8s knowledge compiler

Run a Single-Instance Stateful Application [page]deterministic

tasksschedulingstorage

This page shows you how to run a single-instance stateful application in Kubernetes using a PersistentVolume and a Deployment. The application is MySQL.

##

  • 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.

##

-

-

## 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 existing volume that meets the requirements, or by a dynamic provisioner.

Note: The password is defined in the config yaml, and this is insecure. See [Kubernetes Secrets](/docs/concepts/configuration/secret/) for a secure solution.

1. Deploy the PV and PVC of the YAML file:

```shell kubectl apply -f https://k8s.io/examples/application/mysql/mysql-pv.yaml ```

1. Deploy the contents of the YAML file:

```shell kubectl apply -f https://k8s.io/examples/application/mysql/mysql-deployment.yaml ```

1. Display information about the Deployment:

```shell kubectl describe deployment mysql ```

The output is similar to this:

``` Name: mysql Namespace: default CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700 Labels: app=mysql Annotations: deployment.kubernetes.io/revision=1 Selector: app=mysql Replicas: 1 desired | 1 updated | 1 total | 0 available | 1 unavailable StrategyType: Recreate MinReadySeconds: 0 Pod Template: Labels: app=mysql Containers: mysql: Image: mysql:9 Port: 3306/TCP Environment: MYSQL_ROOT_PASSWORD: password Mounts: /var/lib/mysql from mysql-persistent-storage (rw) Volumes: mysql-persistent-storage: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: mysql-pv-claim ReadOnly: false Conditions: Type Status Reason ---- ------ ------ Available False MinimumReplicasUnavailable Progressing True ReplicaSetUpdated 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:

```shell kubectl get pods -l app=mysql ```

The output is similar to this:

``` NAME READY STATUS RESTARTS AGE mysql-63082529-2z3ki 1/1 Running 0 3m ```

1. Inspect the PersistentVolumeClaim:

```shell kubectl describe pvc mysql-pv-claim ```

The output is similar to this:

``` Name: mysql-pv-claim Namespace: default StorageClass: Status: Bound Volume: mysql-pv-volume Labels: <none> Annotations: pv.kubernetes.io/bind-completed=yes pv.kubernetes.io/bound-by-controller=yes Capacity: 20Gi Access Modes: RWO Events: <none> ```

## 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 optima …(trimmed)

Sources

tasks/run-application/run-single-instance-stateful-application.md · docRun a Single-Instance Stateful Application

Related (7)

part_of {{% heading "objectives" %}}describes conf=1
part_of {{% heading "prerequisites" %}}describes conf=1
part_of Deploy MySQLdescribes conf=1
part_of Accessing the MySQL instancedescribes conf=1
part_of Updatingdescribes conf=1
part_of Deleting a deploymentdescribes conf=1
part_of {{% heading "whatsnext" %}}describes conf=1

← all Docs