Add GKE Sandbox to Kubernetes section

This commit is contained in:
Fabricio Voznika
2019-09-24 08:20:31 +09:00
committed by Ian Lewis
parent b9b719dcb6
commit 0261626482
6 changed files with 327 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
+++
title = "Tutorials"
weight = 0
+++
Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

+73
View File
@@ -0,0 +1,73 @@
+++
title = "WordPress with Docker"
weight = 10
+++
## Deploy a WordPress site with Docker
This page shows you how to deploy a sample [WordPress][wordpress] site using
[Docker][docker].
### Before you begin
[Follow these instructions][docker-install] to install runsc with Docker.
This document assumes that the runtime name chosen is `runsc`.
### Running WordPress
Now, let's deploy a WordPress site using Docker. WordPress site requires
two containers: web server in the frontend, MySQL database in the backend.
First, let's define a few environment variables that are shared between both
containers:
```bash
export MYSQL_PASSWORD=${YOUR_SECRET_PASSWORD_HERE?}
export MYSQL_DB=wordpress
export MYSQL_USER=wordpress
```
Next, let's start the database container running MySQL and wait until the
database is initialized:
```bash
docker run --runtime=runsc --name mysql -d \
-e MYSQL_RANDOM_ROOT_PASSWORD=1 \
-e MYSQL_PASSWORD="${MYSQL_PASSWORD}" \
-e MYSQL_DATABASE="${MYSQL_DB}" \
-e MYSQL_USER="${MYSQL_USER}" \
mysql:5.7
# Wait until this message appears in the log.
docker logs mysql |& grep 'port: 3306 MySQL Community Server (GPL)'
```
Once the database is running, you can start the WordPress frontend. We use the
`--link` option to connect the frontend to the database, and expose the
WordPress to port 8080 on the localhost.
```bash
docker run --runtime=runsc --name wordpress -d \
--link mysql:mysql \
-p 8080:80 \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_USER="${MYSQL_USER}" \
-e WORDPRESS_DB_PASSWORD="${MYSQL_PASSWORD}" \
-e WORDPRESS_DB_NAME="${MYSQL_DB}" \
-e WORDPRESS_TABLE_PREFIX=wp_ \
wordpress
```
Now, you can access the WordPress website pointing your favorite browser to
http://localhost:8080.
Congratulations! You have just deployed a WordPress site using Docker.
### What's next
[Learn how to deploy WordPress with Kubernetes][wordpress-k8s].
[docker]: https://www.docker.com/
[docker-install]: /docs/user_guide/docker/
[wordpress]: https://wordpress.com/
[wordpress-k8s]: /docs/tutorials/kubernetes/
+238
View File
@@ -0,0 +1,238 @@
+++
title = "WordPress with Kubernetes"
+++
## Deploy a WordPress site using GKE Sandbox
This page shows you how to deploy a sample [WordPress][wordpress] site using
[GKE Sandbox][gke-sandbox].
### Before you begin
Take the following steps to enable the Kubernetes Engine API:
1. Visit the [Kubernetes Engine page][project-selector] in the Google Cloud
Platform Console.
1. Create or select a project.
### Creating a node pool with gVisor enabled
Create a node pool inside your cluster with option `--sandbox type=gvisor` added
to the command, like below:
```bash
gcloud beta container node-pools create sandbox-pool --cluster=${CLUSTER_NAME} --image-type=cos_containerd --sandbox type=gvisor
```
If you prefer to use the console, select your cluster and select the **ADD NODE
POOL** button:
![+ ADD NODE POOL](/docs/tutorials/node-pool-button.png)
Then select the **Image type** with **Containerd** and select **Enable sandbox
with gVisor** option. Select other options as you like:
![+ NODE POOL](/docs/tutorials/add-node-pool.png)
### Check that gVisor is enabled
The gvisor RuntimeClass is instantiated during node creation. You can check for
the existence of the gvisor RuntimeClass using the following command:
```bash
kubectl get runtimeclasses
```
### Wordpress deployment
Now, let's deploy a WordPress site using GKE Sandbox. WordPress site requires
two pods: web server in the frontend, MySQL database in the backend. Both
applications use PersistentVolumes to store the site data data.
In addition, they use secret store to share MySQL password between them.
First, let's download the deployment configuration files to add the runtime
class annotation to them:
```bash
curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
```
Add a **spec.template.spec.runtimeClassName** set to **gvisor** to both files,
as shown below:
**wordpress-deployment.yaml:**
```yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
runtimeClassName: gvisor # ADD THIS LINE
containers:
- image: wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
```
**mysql-deployment.yaml:**
```yaml
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
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:
runtimeClassName: gvisor # ADD THIS LINE
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
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
```
Note that apart from `runtimeClassName: gvisor`, nothing else about the
Deployment has is changed.
You are now ready to deploy the entire application. Just create a secret to
store MySQL's password and *apply* both deployments:
```bash
kubectl create secret generic mysql-pass --from-literal=password=${YOUR_SECRET_PASSWORD_HERE?}
kubectl apply -f mysql-deployment.yaml
kubectl apply -f wordpress-deployment.yaml
```
Wait for the deployments to be ready and an external IP to be assigned to the
Wordpress service:
```bash
watch kubectl get service wordpress
```
Now, copy the service `EXTERNAL-IP` from above to your favorite browser to view
and configure your new WordPress site.
Congratulations! You have just deployed a WordPress site using GKE Sandbox.
### What's next
To learn more about GKE Sandbox and how to run your deployment securely, take
a look at the [documentation][gke-sandbox-docs].
[gke-sandbox-docs]: https://cloud.google.com/kubernetes-engine/docs/how-to/sandbox-pods
[gke-sandbox]: https://cloud.google.com/kubernetes-engine/sandbox/
[project-selector]: https://console.cloud.google.com/projectselector/kubernetes
[wordpress]: https://wordpress.com/
Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

+12
View File
@@ -20,7 +20,19 @@ use either the `io.kubernetes.cri.untrusted-workload` annotation or
[RuntimeClass][runtimeclass] to run Pods with `runsc`. You can find
instructions [here][gvisor-containerd-shim].
## Using GKE Sandbox
[GKE Sandbox][gke-sandbox] is available in [Google Kubernetes Engine][gke]. You
just need to deploy a node pool with gVisor enabled in your cluster, and it will
run pods annotated with `runtimeClassName: gvisor` inside a gVisor sandbox for
you. [Here][wordpress-quick] is a quick example showing how to deploy a
WordPress site. You can view the full documentation [here][gke-sandbox-docs].
[containerd]: https://containerd.io/
[minikube]: https://github.com/kubernetes/minikube/blob/master/deploy/addons/gvisor/README.md
[gke]: https://cloud.google.com/kubernetes-engine/
[gke-sandbox]: https://cloud.google.com/kubernetes-engine/sandbox/
[gke-sandbox-docs]: https://cloud.google.com/kubernetes-engine/docs/how-to/sandbox-pods
[gvisor-containerd-shim]: https://github.com/google/gvisor-containerd-shim
[runtimeclass]: https://kubernetes.io/docs/concepts/containers/runtime-class/
[wordpress-quick]: /docs/tutorials/kubernetes/