Redis インスタンスには、Redis インスタンスと同じ承認済みネットワークを使用する Google Kubernetes Engine クラスタからのみ接続できます。
設定
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 エイリアスの詳細については 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 サーブレット ベースです。
Jedis ライブラリを使用します。
AppServletContextListener クラスは、長期間有効な Redis 接続プールを作成するために使用されます。
VisitCounterServlet クラスは、Redis カウンタをインクリメントするウェブ サーブレットです。
Node.js
このアプリケーションでは、redis モジュールを使用します。
Python
このアプリケーションでは、ウェブサービスに Flask を使用し、redis-py パッケージを使用して Redis インスタンスと通信します。
コンテナ イメージのビルド
次のように入力し、コンテナ イメージを構築して Container Registry に push します。
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 テーブルにインストールされています。この Redis IP 範囲エントリを GKE インスタンスの IP テーブルから削除する場合は、k8s-custom-iptables/ ディレクトリから次のコマンドを実行します。
./uninstall.sh