You can only connect to your Redis instance from Google Kubernetes Engine clusters that use the same authorized network as the Redis instance.
Setup
If you have already installed the Google Cloud CLI and have created a Redis instance, you can skip these steps.
Install the gcloud CLI and initialize:
gcloud initFollow the Quickstart Guide to create a Redis instance. Take note of the zone, IP address, and port of the Redis instance.
Preparing your GKE cluster
If you have not created a GKE cluster, create one using the following commands for the Google Cloud CLI:
Designate the project for this sample application in
gcloud.gcloud config set project PROJECT_ID
Set the Compute Engine zone configuration variable in
gcloud.gcloud config set compute/zone ZONE
Create a GKE cluster called
visitcount-cluster.gcloud container clusters create visitcount-cluster --num-nodes=3 --enable-ip-alias
If you didn't create the cluster using
gcloud, then use the following command to retrieve the cluster credentials:gcloud container clusters get-credentials CLUSTER_NAME --zone CLUSTER_ZONE --project PROJECT_ID
- CLUSTER_NAME is the name of your GKE cluster.
- CLUSTER_ZONE is the zone your cluster is in.
- PROJECT_ID is the project where your cluster and your Redis instances exist.
If your cluster is version 1.8 or higher and has IP aliases enabled, skip this step. If your cluster is version 1.7 or lower, or your version 1.8 or higher cluster doesn't have IP aliases enabled, follow these workaround steps before trying to connect to your instance.
Run these commands, replacing RESERVED_IP_RANGE with the reserved IP range of your instance:
git clone https://github.com/bowei/k8s-custom-iptables.git cd k8s-custom-iptables/ TARGETS="RESERVED_IP_RANGE" ./install.sh cd ..If you don't know the reserved IP range of your instance, then find out either by using the console (advanced options) or the following command:
gcloud redis instances describe INSTANCE_ID --region=REGION
For more information about IP aliases, including how to create a cluster with this setting enabled, see the IP aliases documentation.
Sample application
This sample HTTP server application establishes a connection to a Redis instance from a Google Kubernetes Engine cluster.
Clone the repository for your chosen programming language and navigate to the folder that contains the sample code:
Go
git clone https://github.com/GoogleCloudPlatform/golang-samples
cd golang-samples/memorystore/redis
Java
git clone https://github.com/GoogleCloudPlatform/java-docs-samples
cd java-docs-samples/memorystore/redis
Node.js
git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd nodejs-docs-samples/memorystore/redis
Python
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/memorystore/redis
This sample application increments a Redis counter every time the / endpoint
is accessed.
Go
This application uses the
github.com/gomodule/redigo/redis
client. Install it by running the following command:
go get github.com/gomodule/redigo/redis@latest
Example application:
Java
This application is Jetty 3.1 servlet-based.
It uses the Jedis library:
The AppServletContextListener class is used to create a long-lived
Redis connection pool:
The VisitCounterServlet class is a web servlet that increments
a Redis counter:
Node.js
This application uses the redis
module.
Python
This application uses Flask
for web serving and the redis-py
package to communicate with the Redis instance.
Building the container image
Build and push the container image to Container Registry:
gcloud artifacts repositories create --location REPO_REGION --repository-format=docker REPO_ID
cp gke_deployment/Dockerfile .
docker build -t REPO_REGION-docker.pkg.dev/PROJECT_ID/REPO_ID/visit-counter:v1 .
gcloud docker -- push REPO_REGION-docker.pkg.dev/PROJECT_ID/REPO_ID/visit-counter:v1
Deploying your application to Google Kubernetes Engine
To avoid hard-coding the Redis instance IP, you can create a redishost ConfigMap:
export REDISHOST_IP=REDISHOST_IP
kubectl create configmap redishost --from-literal=REDISHOST=${REDISHOST_IP}
Verify that the configuration using the following command:
kubectl get configmaps redishost -o yaml
Update gke_deployment/visit-counter.yaml, replacing <REPO_REGION>, <PROJECT_ID>, and <REPO_ID> with the values from your container image created in Building the container image. This file contains the configuration for the deployment and service.
apiVersion: apps/v1
kind: Deployment
metadata:
name: visit-counter
labels:
app: visit-counter
spec:
replicas: 1
selector:
matchLabels:
app: visit-counter
template:
metadata:
labels:
app: visit-counter
spec:
containers:
- name: visit-counter
image: "<REPO_REGION>-docker.pkg.dev/<PROJECT_ID>/<REPO_ID>/visit-counter:v1"
env:
- name: REDISHOST
valueFrom:
configMapKeyRef:
name: redishost
key: REDISHOST
ports:
- name: http
containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: visit-counter
spec:
type: LoadBalancer
selector:
app: visit-counter
ports:
- port: 80
targetPort: 8080
protocol: TCP
Apply the configuration to your cluster:
kubectl apply -f gke_deployment/visit-counter.yaml
Determine the external IP address for this sample app by running the following command:
kubectl get service visit-counter
Verify that your app hosted at the external IP by using your browser, or send a GET request using curl or your browser:
curl http://EXTERNAL_IP
Removing the IP tables entry for the Redis instance
If you followed step three of the section of this walkthrough of
Preparing your GKE cluster,
then you installed the reserved IP range of your Redis instance to your
GKE instance's IP tables. If you want to remove this Redis
IP range entry from the IP tables of your GKE instance, run
the following command from the k8s-custom-iptables/ directory:
./uninstall.sh