您只能从与 Redis 实例使用相同授权网络的 Google Kubernetes Engine 集群连接到该 Redis 实例。
设置
如果您已安装 Google Cloud CLI 且已创建 Redis 实例,则可以跳过这些步骤。
安装 gcloud CLI 并初始化:
gcloud init按照快速入门指南创建一个 Redis 实例。记下该 Redis 实例的地区、IP 地址和端口。
准备 GKE 集群
如果您尚未创建 GKE 集群,请使用以下命令对 Google Cloud CLI 创建一个:
在
gcloud中为此示例应用指定项目。gcloud config set project PROJECT_ID
在
gcloud中设置 Compute Engine 地区配置变量。gcloud config set compute/zone ZONE
创建一个名为
visitcount-cluster的 GKE 集群。gcloud container clusters create visitcount-cluster --num-nodes=3 --enable-ip-alias
如果您未使用
gcloud创建集群,请使用以下命令检索集群凭据:gcloud container clusters get-credentials CLUSTER_NAME --zone CLUSTER_ZONE --project PROJECT_ID
- CLUSTER_NAME 是 GKE 集群的名称。
- CLUSTER_ZONE 是集群所在的地区。
- PROJECT_ID 是集群和 Redis 实例所在的项目。
如果您的集群是版本 1.8 或更高版本且启用了 IP 别名,请跳过此步骤。如果您的集群是版本 1.7 或更低版本,或者集群为版本 1.8 或更高版本但未启用 IP 别名,请在尝试连接到实例之前,按照以下解决方法步骤操作:
运行以下命令,将 RESERVED_IP_RANGE 替换为实例的预留 IP 范围:
git clone https://github.com/bowei/k8s-custom-iptables.git cd k8s-custom-iptables/ TARGETS="RESERVED_IP_RANGE" ./install.sh cd ..如果您不知道实例的预留 IP 范围,可通过控制台(高级选项)或以下命令找到:
gcloud redis instances describe INSTANCE_ID --region=REGION
如需详细了解 IP 别名(包括如何创建启用了此设置的集群),请参阅 IP 别名文档。
示例应用
此示例 HTTP 服务器应用通过 Google Kubernetes Engine 集群建立与 Redis 实例的连接。
克隆所选编程语言的代码库,并转到包含示例代码的文件夹:
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
每次访问 / 端点时,此示例应用都会增加一个 Redis 计数器。
Go
此应用使用 github.com/gomodule/redigo/redis 客户端。通过运行以下命令进行安装:
go get github.com/gomodule/redigo/redis@latest
应用示例:
Java
此应用基于 Jetty 3.1 servlet。
它使用 Jedis 库:
AppServletContextListener 类用于创建长效 Redis 连接池:
VisitCounterServlet 类是一个网络 Servlet,用于增加 Redis 计数器。
Node.js
此应用使用 redis 模块。
Python
构建容器映像
构建容器映像并将其推送到 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
将应用部署到 Google Kubernetes Engine
为避免对 Redis 实例 IP 进行硬编码,您可以创建 redishost ConfigMap:
export REDISHOST_IP=REDISHOST_IP
kubectl create configmap redishost --from-literal=REDISHOST=${REDISHOST_IP}
使用以下命令验证配置:
kubectl get configmaps redishost -o yaml
更新 gke_deployment/visit-counter.yaml,将 <REPO_REGION>、<PROJECT_ID> 和 <REPO_ID> 替换为在构建容器映像中创建的容器映像中的值。此文件包含部署和服务的配置。
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
将配置应用到您的集群:
kubectl apply -f gke_deployment/visit-counter.yaml
通过运行以下命令,确定此示例应用的外部 IP 地址:
kubectl get service visit-counter
使用浏览器验证您的应用是否托管在外部 IP 地址处,或者使用 curl 或浏览器发送 GET 请求:
curl http://EXTERNAL_IP
删除 Redis 实例的 IP 表条目
如果您按照本演示中准备 GKE 集群部分的步骤 3 进行了操作,则您已将 Redis 实例的预留 IP 范围安装到了 GKE 实例的 IP 表中。如果要从 GKE 实例的 IP 表中移除此 Redis IP 范围条目,请从 k8s-custom-iptables/ 目录运行以下命令:
./uninstall.sh