プライベートKubernetesクラスタへの公共ルーティング


Kubernetesの個人的なプロジェクトとハッキングのために、私は安価なマネージクラスタのファンであるDigital Ocean ). 月に約10ドルほどで、小さなシングルノードクラスタを回転させ、地面を走らせることができます.残念ながら、これらの小さなクラスタを使用すると、使用可能なRAMのギグと最高の単一のCPUを得るだけです.より多くの場合、価格はすぐに登る.
家では、私は12 VCPURyzen !) そして、私が愛情を込めて命名したラムの48 gtomorrowlan . デジタル海の同様の構成は、月におよそ240ドルを走らせます!私は個人的なプロジェクトをめちゃくちゃにしているとき、私は本当に弾力性や生産価値を気にしない.私が既存のハードウェアを使用するのは素晴らしいです、私がより広いインターネット上で他のものと一緒に構築したものを共有する能力を保持している間.
一握りのオープンソースツールのおかげで、私はこの夢を現実にすることができます.With Inlets , Contour , KinD , and external-dns , 私は簡単に新しいクラスタをスピンし、それらを数秒以内に外部にルーティングできます.

コンポーネント



上の図は、これらのコンポーネントのすべてがどのように機能するかを要約した図です.それは正直に実際よりも複雑に見えます.
このアーキテクチャでは、自宅で実行しているハードウェア上で動作するKubernetesクラスタを持っています.ホームルータの背後にあるNAT そして、どんなネットワーキングナンセンスホームISPがしているか.代表的に、このクラスタはルータの特別な構成なしで全く手に入らないでしょう.さらに、あなたはあなたのISPからダイナミックなIPアドレスを発行します.さらに、あなたがこれをすべて設定したとしても、あなたはおそらくあなたのホームネットワークに直接接続しているインターネットから乱暴を望みません.
代わりに、パブリックIPを使用して安価なクラウドVMを使用してエントリポイントとして機能することができます.前に述べたすべてのコンポーネントのおかげで、我々はこのVMから私たちのプライベートクラスタにトラフィックをトンネルできます.今、私はこれらの各コンポーネントが何をやっているかを掘るつもりです.また、どのように彼らは外の世界に簡単なアプリを公開するために使用することができますを示します.私がしようとしていないのは、それらをインストールしたり設定したりする方法について詳しく説明します.彼らはすべてのよく維持され、継続的に更新されるので、それの側面は最高の公式ドキュメントに残っている.

インレット


まず始めにInlets それは間違いなくこれのすべての最も重要な部分です.私たちは、私たちの内部のクラスタに、公的に到達可能な雲のインスタンス(私は$ 5ヶ月のデジタルオーシャンVMを使用します)からトンネル交通にそれを使用します.インレットopen-core ソフトウェアは、レイヤ4ルーティングまたはTLSの終了が必要な場合は、“Pro”バージョンを支払う必要があります.私のような趣味のユースケースの場合は、無料版が提供するもので行うことができます.具体的には、inlets-operator .
インレット演算子は、クラスタにインストールするKubernetes演算子です.それは継続的に新しい時計LoadBalancer サービスと用途inlets あなたの選択の雲と公開IPを公開するためにそれが「出口ノード」VMと呼ぶものを提供することLoadBalancer サービスこの場合、それはLoadBalancer イントラレス制御装置のサービス

インストール


フォローthis tutorial インレット演算子から始めましょう.

外部DNS


この1つは確かに少し“より良い”ということですインレットは、あなたのアプリに到達するために動作するパブリックIPアドレスを与える.しかしながら、生のIPアドレスはかなり扱いにくいです.その代わりに、あなたがドメインを便利にしたならば、あなたのドメインにそのIPを写像するためにDNSを構成することができます.私のクラスタのために、私は使用する傾向があります*.k8s.downey.cloud . これは一般的に手動のプロセスですが、それをする必要はありません!
プロジェクトを使用できますexternal-dns DNSを設定するにはLoadBalancer 自動的にサービス!それはかなり滑らかです.あなたがしなければならないすべてはexternal-dns.alpha.kubernetes.io/hostname とご希望のホスト名.それから、外部DNSコントローラは残りをして、あなたのためにあなたのDNSを構成します!私のinitノードとしてデジタルオーシャンVMを使用しているので、Digital OceanのクラウドDNSを設定するために外部DNSを設定します.

インストール


外部DNSのインストールは、DNSプロバイダの使用にかなり依存します.フォローするsteps in the README あなたが使っている雲のために.デジタルオーシャンI followed these .

輪郭進入制御装置


を使うIngress Controller インレットは絶対に必要ない.あなたはLoadBalancer あなたが公開したいすべての単一のアプリケーションのためのサービス、およびインレットは幸いにそれらのサービスへのルートにVMSを作成します.しかし、そのアプローチでは、コストが迅速に追加されます.
イングルのコントローラを使用すると、単一のプロキシを公開することができますし、内部のすべてのアプリケーションには、プロキシのルートがあります.どんなイングル・コントローラもこの目的のために働くでしょうContour いくつかの理由から
  • それはKubernetesのような雲ネイティブコンピューティング基盤(CNCF)プロジェクトです
  • 用途Envoy proxy , スケールでテストされて、資源消費にかなり明るい
  • 特使プロキシは、再設定を変更することができますので、バックエンドのアプリを追加し、削除するようにダウンタイムはありません
  • これは、ボックスのTLSの終了のための優れたサポートをしています(これはインレットの無料版とのモットーポイントです-インレットProのTCPルーティングサポートを必要とするでしょう-しかし、一般的にこれは良いです)
  • インストール


    フォローするGetting Started docs 迅速に輪郭を取得し、実行してください.輪郭はLoadBalancer インレットが公開するサービスYAML.外部DNSでうまく動作するように、次のように使用します ytt over 1このドメインに注釈を付ける
    #@ load("@ytt:overlay", "overlay")
    
    #@overlay/match by=overlay.subset({"kind": "Service", "metadata":{"name": "envoy", "namespace": "projectcontour"}, "spec":{"type":"LoadBalancer"}}),expects=1
    --------
    metadata:
      #@overlay/match missing_ok=True
      annotations:
        #@overlay/match missing_ok=True
        #@overlay/merge
        external-dns.alpha.kubernetes.io/hostname: "*.k8s.downey.cloud"
    
    例として、インストールコマンドを微調整してytt インラインインライン
    kubectl apply -f <(ytt -f https://projectcontour.io/quickstart/contour.yaml -f /tmp/external-dns-overlay.yaml --ignore-unknown-comments=true)
    
    1 -あなたが聞いたことがないならば ytt 前に、チェックアウトをお勧めします.それはCarvel Kubernetesユーティリティのスイートで、私がコントロールしないYAMLを変えるための私の試みです.この輪郭のインストールのように.

    種類


    私は親切、またはKubernetes in Docker , 私のクラスタを実行するには、それは超便利見つけるので.それが必要なのはkind CLIとDockerデーモンを実行している.彼らがちょうどDockerコンテナとして走っているとき、それは非常に速く回転して、クラスタを破壊します.
    そのような、多くの他の有効なオプションがここにありますmicrok8s , minikube , または直接OS上でkubeadm .

    インストール


    インストールするにはquick start guide .

    デモ


    それで、どのように、これは一緒に働きますか?つのアプリを展開する観点から見てみましょう. httpbin .
    我々は展開することができますhttpbin 以下のクラスタにDeployment :
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: httpbin
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: httpbin
      template:
        metadata:
          labels:
            app: httpbin
        spec:
          containers:
          - image: docker.io/kennethreitz/httpbin
            imagePullPolicy: IfNotPresent
            name: httpbin
            ports:
            - containerPort: 80
    
    次に、それを簡単にクラスタ内のClusterIP サービス
    apiVersion: v1
    kind: Service
    metadata:
      name: httpbin
      labels:
        app: httpbin
    spec:
      ports:
      - name: http
        port: 80
        targetPort: 80
      selector:
        app: httpbin
    
    それはクールです.我々は今ではそれに達することができますhttpbin.default.svc.cluster.local ポート80のクラスタの中から.この次のステップは必要ありませんが、楽しみのために我々はまた、ローカルからそれを使用してkubectl port-forward コマンド.
    tim@tomorrowlan:~/workspace/k8s-yaml$ kubectl port-forward service/httpbin 8000:80
    Forwarding from 127.0.0.1:8000 -> 80
    Forwarding from [::1]:8000 -> 80
    
    それを実行するだけでcurl localhost:8000 そして、httpbin ポッド.これまではとても良い!
    さあ、殺してくださいkubectl port-forward . それは他の皆のために到達可能にする時間です.
    を作成することでこれを行うことができますIngress 輪郭を知るリソースhttpbin サービスとどのようなトラフィックをルーティングする必要があります.
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: httpbin
    spec:
      rules:
      - host: httpbin.k8s.downey.cloud
        http:
          paths:
          - backend:
              serviceName: httpbin
              servicePort: 80
    
    それだ!我々は現在アクセスすることができますhttpbin インターネット上のアプリhttp://httpbin.k8s.downey.cloud ! 😌

    回収する


    それで、すべてはちょうど起こりました?さて、前から図を見てみましょう.
  • 輪郭はLoadBalancer 使節代理人を指すサービスexternal-dns.alpha.kubernetes.io/hostname: "*.k8s.downey.cloud"
  • インレットオペレーターは、我々にAを持っているのを見ましたLoadBalancer IPを持たないサービスで、パブリックIPでクラウドVMを提供しました
  • インレットオペレーターは、雲VMと輪郭の使節に乗っている使節の間でトンネルを掘りました
  • 輪郭からLoadBalancer サービスがexternal-dns.alpha.kubernetes.io/hostname 注釈、外部のDNS設定のDNSは、サービスのパブリックIP
  • 輪郭鋸Ingress 我々が作成したリソースhttpbin そして、直接の要請への使節を構成しましたhttpbin.k8s.downey.cloudhttpbin ClusterIP サービス
  • The httpbin ClusterIP サービスは、トラフィックをhttpbin ポッド
  • このRube Goldberg Machineは、我々のポッドに公的に届くことをもたらしました
  • 何が素晴らしいですかhttpbin アプリケーション自体は実際には使用していない別のDeployment , Service , and Ingress 管理されたKubernetesクラスタで!舞台裏で起こったことはたくさんありました、しかし、一旦それがセットアップされるならば、それは基本的にちょうど働きます.
    我々は今Kubernetesの私の好きな側面のいずれかを見る機会があった-どのように拡張可能です!いくつかのビルディングブロックを組み合わせることで、我々はすぐにLoadBalancer 個人用devマシン上の管理Kubernetesクラスタのサービス経験私は私の処分で12 VCPUと48ギガバイトのRAMを持っているので、私は些細な作業負荷を開発するのに十分なリソースを持っていると私はまだ最終的な結果をオンラインでデモすることができます.すべての月の5ドルのためには、出口出口ノードを実行するコストです.
    少なくとも、それはかなりクールだと思う.
    乾杯!🐢