👻
minikube x Telepresenceでサクッとinterceptしてローカルイメージを動かす
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