👻

minikube x Telepresenceでサクッとinterceptしてローカルイメージを動かす

2023/09/20に公開

1. 背景

Kubernetesのデバッグツールとしてよく挙げられるTelepresence
telepresenceを使うにあたり、検索するとまだlegacy telepresence(swap deploymentなど)の使い方がヒットしたりするので、コピペ、minikubeベースでできるようにまとめる。

2. minikubeとは

minikubeとはローカル向けのKubernetesであり、学習と開発を容易に行うことができます。
minikubeをインストールしてない方は下記からインストール可能です。
minikube start

3. Telepresence Interceptとは

Telepresenceのinterceptは、開発者がローカル環境でサービスを開発し、デバッグするための機能です。Traffic ManagerとTraffic Agentを使用して、クラスタ内のサービスへのトラフィックを開発者のワークステーションにリダイレクトします。これにより、開発者は本番環境と同じ条件でサービスをテストできます。
Telepresenceのインストールしてない方は下記からインストール可能です。
Telepresence Quickstart

4. minikubeでtelepresence intercept

minikubeで動かすアプリケーションの準備する

package main

import (
	"fmt"
	"net/http"
)

func main() {
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "Hello telepresence!")
	})

	http.ListenAndServe(":8080", nil)
}
# 使用するベースイメージを指定
FROM golang:1.20

# ワーキングディレクトリを設定
WORKDIR /app

# 必要なファイルをコピー
COPY main.go .
COPY go.mod .

# ビルド
RUN go build -o main .

# ポート8080を公開
EXPOSE 8080

# アプリケーションを実行
CMD [ "./main" ]

Docker buildして動作確認する

go mod init hello-world

docker build -t golang-hello-world .

docker run -p 8080:8080 golang-hello-world

curl http://localhost:8080
> Hello telepresence!

Kubernetesマニフェストを用意する

以下の内容でmanifest.ymalを作成する。

apiVersion: v1
kind: Service
metadata:
  name: golang-hello-world-service
spec:
  selector:
    app: golang-hello-world
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: NodePort

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: golang-hello-world-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: golang-hello-world
  template:
    metadata:
      labels:
        app: golang-hello-world
    spec:
      containers:
        - name: golang-hello-world-container
          image: golang-hello-world:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 8080

minikubeの起動とマニフェストのデプロイ

minikube start --driver=hyperkit  --cni=bridge

minikube tunnel #ターミナル別タブから叩くこと

minikube image load golang-hello-world:latest # minikubeでローカルビルドしたイメージを参照するために使う。

kubectl apply -f manifest.yaml

kubectl get po # podの確認

kubectl get svc # ClusterIPの確認

curl http://CLUSTER_IP:8080
Hello telepresence!

Telepresenceによるintercept

telepresence connect

> telepresence connect: error: connector.Connect: traffic manager not found, if it is not installed, please run 'telepresence helm install'. If it is installed, try connecting with a --manager-namespace to point telepresence to the namespace it's installed in.

# 上記のエラーが出た場合は下記コマンドを行う。
telepresence helm install
❯ telepresence list
golang-hello-world-deployment: ready to intercept (traffic-agent not yet installed)
# telepresence intercept [telepresene listに表示されたアプリケーション名] --port 8080:8080 --service [Kubernetesサービス名] --docker-run -- --rm -it [ローカルでビルドしたDockerイメージ]

telepresence intercept golang-hello-world-deployment --port 8080:8080 --service golang-hello-world-service --docker-run -- --rm -it golang-hello-world:red

最後にinterceptで置き換えたイメージになっているか確認

curl http://127.0.0.1:8080
> Hello telepresence2

Discussion