In this tutorial, you store an image in Artifact Registry and deploy it from the registry. For this quickstart, you'll create a repository named hello-repo
.
Set the PROJECT_ID
environment variable to your Google Cloud project ID (PROJECT_ID
). You'll use this environment variable when you build the container image and push it to your repository.
export PROJECT_ID=PROJECT_ID
Confirm that the PROJECT_ID
environment variable has the correct value:
echo $PROJECT_ID
Set your project ID for the Google Cloud CLI:
gcloud config set project $PROJECT_ID
Output:
Updated property [core/project].
Note: Your gcloud CLI might already be set to your $PROJECT_ID
—you will still see the Updated property
output.Create the hello-repo
repository with the following command:
gcloud artifacts repositories create hello-repo \
--repository-format=docker \
--location=REGION \
--description="Docker repository"
Replace REGION
with the a region for the repository, such as us-west1
. To see a list of available locations, run the command:
gcloud artifacts locations list
hello-app
Docker image
In this tutorial, you deploy a sample web application called hello-app
, a web server written in Go that responds to all requests with the message Hello, World!
on port 8080.
GKE accepts Docker images as the application deployment format. Before deploying hello-app
to GKE, you must package the hello-app
source code as a Docker image.
To build a Docker image, you need source code and a Dockerfile. A Dockerfile contains instructions on how the image is built.
Download the hello-app
source code and Dockerfile by running the following commands:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
cd kubernetes-engine-samples/quickstarts/hello-app
Build and tag the Docker image for hello-app
:
docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1 .
This command instructs Docker to build the image using the Dockerfile
in the current directory, save it to your local environment, and tag it with a name, such as us-west1-docker.pkg.dev/my-project/hello-repo/hello-app:v1
. The image is pushed to Artifact Registry in the next section.
PROJECT_ID
variable associates the container image with the hello-repo
repository in your Google Cloud project.us-west1-docker.pkg.dev
prefix refers to Artifact Registry, regional host for your repository.Run the docker images
command to verify that the build was successful:
docker images
Output:
REPOSITORY TAG IMAGE ID CREATED SIZE
us-west1-docker.pkg.dev/my-project/hello-repo/hello-app v1 25cfadb1bf28 10 seconds ago 54 MB
Note: You might also see additional images that represent intermediate image layers.Add IAM policy bindings to your service account:
gcloud artifacts repositories add-iam-policy-binding hello-repo \
--location=REGION \
--member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--role="roles/artifactregistry.reader"
Replace PROJECT_NUMBER
with the project number of your project.
Test your container image using your local Docker engine:
docker run --rm -p 8080:8080 REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
Click the Web Preview button and then select the 8080
port number. GKE opens the preview URL on its proxy service in a new browser window.
You must upload the container image to a registry so that your GKE cluster can download and run the container image. In this tutorial, you will store your container in Artifact Registry.
Configure the Docker command-line tool to authenticate to Artifact Registry:
gcloud auth configure-docker REGION-docker.pkg.dev
Note: You can ignore any warnings about having a long list of credential helpers.Push the Docker image that you just built to the repository:
docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
Now that the Docker image is stored in Artifact Registry, create a GKE cluster to run hello-app
. A GKE cluster consists of a pool of Compute Engine VM instances running Kubernetes, the open source cluster orchestration system that powers GKE.
Set your Compute Engine region:
gcloud config set compute/region REGION
For Standard zonal clusters, set a Compute Engine zone nearest to the Artifact Registry repository.
Create a cluster named hello-cluster
:
gcloud container clusters create-auto hello-cluster
It takes a few minutes for your GKE cluster to be created and health-checked. To run this tutorial on a GKE Standard cluster, use the gcloud container clusters create
command instead.
In the Google Cloud console, go to the Create an Autopilot cluster page.
In the Name field, enter the name hello-cluster
.
Select a Compute Engine region from the Region drop-down list, such as us-west1
.
Click Create.
Wait for the cluster to be created. When the cluster is ready, a checkmark appears next to the cluster name.
hello-app
to GKE
You are now ready to deploy the Docker image you built to your GKE cluster.
Kubernetes represents applications as Pods, which are scalable units holding one or more containers. The Pod is the smallest deployable unit in Kubernetes. Usually, you deploy Pods as a set of replicas that can be scaled and distributed together across your cluster. One way to deploy a set of replicas is through a Kubernetes Deployment.
In this section, you create a Kubernetes Deployment to run hello-app
on your cluster. This Deployment has replicas (Pods). One Deployment Pod contains only one container: the hello-app
Docker image. You also create a HorizontalPodAutoscaler resource that scales the number of Pods from 3 to a number between 1 and 5, based on CPU load.
Ensure that you are connected to your GKE cluster.
gcloud container clusters get-credentials hello-cluster
Create a Kubernetes Deployment for your hello-app
Docker image.
kubectl create deployment hello-app --image=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v1
Set the baseline number of Deployment replicas to 3.
kubectl scale deployment hello-app --replicas=3
Create a HorizontalPodAutoscaler
resource for your Deployment.
kubectl autoscale deployment hello-app --cpu-percent=80 --min=1 --max=5
To see the Pods created, run the following command:
kubectl get pods
Output:
NAME READY STATUS RESTARTS AGE
hello-app-784d7569bc-hgmpx 1/1 Running 0 90s
hello-app-784d7569bc-jfkz5 1/1 Running 0 90s
hello-app-784d7569bc-mnrrl 1/1 Running 0 95s
Note: The Pods might take up to two minutes to start running. Until they start, the Status
column displays Pending
.Go to the Workloads page in the Google Cloud console.
Click add_box Deploy.
In the Specify container section, select Existing container image.
In the Image path field, click Select.
In the Select container image pane, select the hello-app
image you pushed to Artifact Registry and click Select.
In the Container section, click Done, then click Continue.
In the Configuration section, under Labels, enter app
for Key and hello-app
for Value.
Under Configuration YAML, click View YAML. This opens a YAML configuration file representing the two Kubernetes API resources about to be deployed into your cluster: one Deployment, and one HorizontalPodAutoscaler
for that Deployment.
Click Close, then click Deploy.
When the Deployment Pods are ready, the Deployment details page opens.
Under Managed pods, note the three running Pods for the hello-app
Deployment.
While Pods do have individually-assigned IP addresses, those IPs can only be reached from inside your cluster. Also, GKE Pods are designed to be ephemeral, starting or stopping based on scaling needs. And when a Pod crashes due to an error, GKE automatically redeploys that Pod, assigning a new Pod IP address each time.
What this means is that for any Deployment, the set of IP addresses corresponding to the active set of Pods is dynamic. We need a way to 1) group Pods together into one static hostname, and 2) expose a group of Pods outside the cluster, to the internet.
Kubernetes Services solve for both of these problems. Services group Pods into one static IP address, reachable from any Pod inside the cluster. GKE also assigns a DNS hostname to that static IP. For example, hello-app.default.svc.cluster.local
.
The default Service type in GKE is called ClusterIP, where the Service gets an IP address reachable only from inside the cluster. To expose a Kubernetes Service outside the cluster, create a Service of type LoadBalancer
. This type of Service spawns an External Load Balancer IP for a set of Pods, reachable through the internet.
In this section, you expose the hello-app
Deployment to the internet using a Service of type LoadBalancer
.
Use the kubectl expose
command to generate a Kubernetes Service for the hello-app
deployment:
kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080
Here, the --port
flag specifies the port number configured on the Load Balancer, and the --target-port
flag specifies the port number that the hello-app
container is listening on.
Run the following command to get the Service details for hello-app-service
:
kubectl get service
Output:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-app-service 10.3.251.122 203.0.113.0 80:30877/TCP 10s
Copy the EXTERNAL_IP
address to the clipboard (for instance: 203.0.113.0
).
<pending>
IP address.Go to the Workloads page in the Google Cloud console.
Click hello-app.
From the Deployment details page, click list Actions > Expose.
In the Expose dialog, set the Target port to 8080
. This is the port the hello-app
container listens on.
From the Service type drop-down list, select Load balancer.
Click Expose to create a Kubernetes Service for hello-app
.
When the Load Balancer is ready, the Service details page opens.
Scroll down to the External endpoints field, and copy the IP address.
Now that the hello-app
Pods are exposed to the internet through a Kubernetes Service, you can open a new browser tab, and navigate to the Service IP address you copied to the clipboard. A Hello, World!
message appears, along with a Hostname
field. The Hostname
corresponds to one of the three hello-app
Pods serving your HTTP request to your browser.
hello-app
In this section, you upgrade hello-app
to a new version by building and deploying a new Docker image to your GKE cluster.
Kubernetes rolling update lets you update your Deployments without downtime. During a rolling update, your GKE cluster incrementally replaces the existing hello-app
Pods with Pods containing the Docker image for the new version. During the update, your load balancer service routes traffic only into available Pods.
Return to Cloud Shell, where you have cloned the hello app source code and Dockerfile. Update the function hello()
in the main.go
file to report the new version 2.0.0
.
Build and tag a new hello-app
Docker image.
docker build -t REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2 .
Push the image to Artifact Registry.
docker push REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
Now you're ready to update your hello-app
Kubernetes Deployment to use a new Docker image.
HorizontalPodAutoscaler
earlier, the number of hello-app
Pods running in this section might be fewer than the three Pods initially deployed. Your GKE cluster might have scaled down the number of Pods based on low CPU usage. Cloud Shell
Apply a rolling update to the existing hello-app
Deployment with an image update using the kubectl set image
command:
kubectl set image deployment/hello-app hello-app=REGION-docker.pkg.dev/${PROJECT_ID}/hello-repo/hello-app:v2
Watch the running Pods running the v1
image stop, and new Pods running the v2
image start.
watch kubectl get pods
Output:
NAME READY STATUS RESTARTS AGE
hello-app-89dc45f48-5bzqp 1/1 Running 0 2m42s
hello-app-89dc45f48-scm66 1/1 Running 0 2m40s
In a separate tab, navigate again to the hello-app-service
External IP. You should now see the Version
set to 2.0.0.
Go to the Workloads page in the Google Cloud console.
Click hello-app.
On the Deployment details page, click list Actions > Rolling update.
In the Rolling update dialog, set the Image of hello-app field to REGION-docker.pkg.dev/PROJECT_ID/hello-repo/hello-app:v2
.
Click Update.
On the Deployment details page, inspect the Active Revisions section. You should now see two Revisions, 1 and 2. Revision 1 corresponds to the initial Deployment you created earlier. Revision 2 is the rolling update you just started.
After a few moments, refresh the page. Under Managed pods, all of the replicas of hello-app
now correspond to Revision 2.
In a separate tab, navigate again to the Service IP address you copied. The Version
should be 2.0.0.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4