2017年 08月の投稿を表示しています

kubectl port-forward to Service (追記Deployment も可)

kubectl port-forward って pod に対してだけしかできないと思っていたが Service に対してもできたみたい。

$ kubectl port-forward svc/my-service 5000

このとき、ポートフォワードを開始するタイミングでだけ k8s の名前解決が行われて、フォワードする先を決定する。
サービスに対してフォワードしているわけではないので、フォワードしたポートに何度リクエストを送ってもロードバランスされない。

Issue にもコメントがあるが port-forward はもともとがそういう用途ではなく 1 つの pod に対してフォワードするので、サービスに対して完全にフォワードするには pod がいなくなったときに再接続したりバランスするようにしたりなんだり、多くの機能追加になるので、別にしようやという話がある。

kubectl port-forward should allow forwarding to a Service · Issue #15180 · kubernetes/kubernetes · GitHub


追記: Deployment も対象にできたのしらなかった、ドキュメントをみてくれ!!

Use Port Forwarding to Access Applications in a Cluster - Kubernetes

Withなんちゃらなオプション( Functional Option Pattern )

Go 文化なのかわからないけど New とか構造体作れる関数や初期化する関数へのオプションを設定するためのコールバック関数を設定するキメ文句をよく見るような気がする。

func WithInsecure() func(*Config) {
    return func(cfg *Config) {
        cfg.insecure = true
    }
}

func WithUserAgent(ua String) func(*Config) {
    return func(cfg *Config) {
        cfg.userAgent = ua
    }
}

func main() {
    req := NewRequest(
        WithInsecure(),
        WithUserAgent(),
    )
    req.Send()
}

こういう感じのやつ。

オプションを外のパッケージに対して隠せるっていうメリットがあるのかな。
流れに乗っておくと、雰囲気で利用できて便利そうだなーって思った。


追記:2019年3月4日
これは Functional Option Pattern だ、という話をまったく違う流れで社の Slack で知った。

Functional Option Pattern

Config 構造体でがんばって持つのもいいけど、文量増えてきたり、外に公開するような API であった場合にちょっと不便かなあと思っていたので、このデザインはいいなと思った。