konchangakita

KPSを一番楽しんでいたブログ 会社の看板を背負いません 転載はご自由にどうぞ

【Nutanix KPS IoT】traefik編【使ってみる】

Xi IoT が KPS(Karbon Platform Service)にリブランドされたタイミングで、色々と機能が増えたので試していきまっす
まずは「Traefik」いってみよっと

以前に Kubernetes ロードバランサーingress-nginx も勉強してみたけれども
自宅の kubernetes に ingress-nginx を入れてみる - konchangakita
相変わらず Kubernetes は苦手なので、ちょっとづつ触りながら理解していきます

なんとなくのイメージで、Kubernetes 上の pod/service へのアクセスに必要なポート番号の管理を楽にしてくれたりしそう

<やってみたいことイメージ図>
f:id:konchangakita:20201220002516p:plain

traefik を導入する

そもそも traefik の使い方なんかよく分かってないので、ちょっと調べてみると

https://doc.traefik.io/traefik/
「Traefikの特徴は、多くの機能に加えて、サービスに適した設定を自動的に検出することです。Traefik がインフラストラクチャを検査して関連情報を見つけ、どのサービスがどのリクエストに対応しているかを検出すると、魔法のようなことが起こります。」

ということで、イメージは合ってそうですし、もっと壮大なことができそう?
f:id:konchangakita:20201219232150p:plain


KPS 管理画面で traefik を有効にする

まずは、KPS上で traefik を有効化してみましょう
プロジェクト単位で使うサービスを選んでいきますので、まずは今回 traefik を利用するプロジェクトに選んで、Project Home から Manage Services を選択します 
(プロジェクトを新しく作るときにも選択できます)
f:id:konchangakita:20201220151504p:plain

そうすると KPS で有効にできるサービス一覧が出てきます
Ingress ControllerTraefik を有効にしてみます
(Nginx-Ingress と Traefik は両方同時に有効にはできません
f:id:konchangakita:20201220153222p:plain

プロジェクトのメニューに Traefik があらわれます
f:id:konchangakita:20201220161636p:plain

ブラウザから http://<ServiceDomain IP>:8081/ へ接続すると、traefik のダッシュボードが表示されます
正直どう見るのかはよくワカラン
f:id:konchangakita:20201220164109p:plain


Traefik を有効にする手順はこれで完了です。なんの設定項目も無いのは楽で良いです
あとは Kubernetes Apps 側で、Ingress の設定を呼び出しなんやかんややっていきます
これでロードバランス機能はサクッと使えます。また、Traefik 自体もたくさんの API をもっています
 ・IngressRoutes
 ・IngressRouteTCPs
 ・IngressRouteUDPs
 ・Middlewares
 ・TraefikServices
 ・TLSOptions
 ・TLSStores
これは、詳しい人に教えてもらおう。。。


簡単なアプリでテストする

ingress-nginx を練習したときに試した方法でテストしてみます
自宅の kubernetes に ingress-nginx を入れてみる - konchangakita

ホスト名を表示するだけの Webサイト を 2つ用意して、好きな URL でアクセスできるようにしてみます。 traefik では同じポート番号でいけるらしい
f:id:konchangakita:20201220173828p:plain


ただただホスト名を表示するけの Webサイトアプリを 2つを用意

apiVersion: v1
kind: Service
metadata:
  name: hello-world-svc1
spec:
  ports:
     -  port: 8082
        protocol: TCP
        targetPort: 80
  selector:
    app: hello-world1
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-deployment1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-world1
  template:
    metadata:
      labels:
        app: hello-world1
    spec:
      containers:
        - image: "strm/helloworld-http"
          imagePullPolicy: Always
          name: hello-world-container
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: hello-world-svc2
spec:
  ports:
     -  port: 8082
        protocol: TCP
        targetPort: 80
  selector:
    app: hello-world2
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world-deployment2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hello-world2
  template:
    metadata:
      labels:
        app: hello-world2
    spec:
      containers:
        - image: "strm/helloworld-http"
          imagePullPolicy: Always
          name: hello-world-container
          ports:
            - containerPort: 80


この Deployment/ServiceIngress の設定を追加してやります
 ・metadata.annotations: annotations は必須設定の模様
 ・spec.rules: ここに Webサイトごとのアクセスルールを追加していく

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: hello-world
  annotations:
    traefik.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
    - host: hello1.com
      http:
        paths:
          - path: /
            backend:
              serviceName: hello-world-svc1
              servicePort: 8082
    - host: hello2.com
      http:
        paths:
          - path: /
            backend:
              serviceName: hello-world-svc2
              servicePort: 8082


KPS Kubernetes Apps に登録

いつもの Kubernetes Apps に 上記のwebアプリを登録します
f:id:konchangakita:20201220182134p:plain

さきほどの yaml を結合しただけの以下をコピペ


ingress の設定がうまくいっていると、Traefik の設定状況が表示されます
「hello1.com」と「hello2.com」の設定が反映されているようです
f:id:konchangakita:20201220180004p:plain

Webブラウザでアクセスしてみる

まずは、ホスト名でアクセスするための名前解決に DNS に登録してやる必要があります
きっと kubernetes 的に自動登録的な方法があるのかもですが、検証環境なのでとりあえず、アクセスするPCの hostsファイル を直接いじることにします

Windows環境C:\Windows\System32\drivers\etc\hosts

MAC/Linux 環境/etc/hosts

記入方法「<ServiceDomain IP> ホスト名」

<記入例>

192.168.199.3 hello1.com
192.168.199.3 hello2.com

hosts を追記した PC から「hello1.com」と「hello2.com」ブラウザアクセスしてみると
f:id:konchangakita:20201220180345p:plain
それぞれで、違うホスト名が表示されているので、ちゃんとそれぞれ違うWebサイトに接続されているようです
これでサービスごとにポート番号の別にする必要がなくなったので kubernetes 初心者としては、これだけでも使う価値ありって感じですね

Node-REDで試す

では、実際によく使うアプリで試してみたいと思います
KPS でよく使う Node-RED を 「https://nodered.kps.com」で、アクセスできるようにしたい

ingress 設定に HTTPS 接続用の設定を追加してみます
annotationtlssecret あたりです

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: nodered
  labels:
    app: nodered
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: https
    traefik.ingress.kubernetes.io/router.tls: "true"
spec:
  rules:
    - host: nodered.kps.com
      http:
        paths:
          - path: /
            backend:
              serviceName: nodered-svc
              servicePort: http
  tls:
  - hosts:
      - nodered.kps.com
    secretName: tls-cert
---
apiVersion: v1
kind: Secret
metadata:
  name: tls-cert
type: kubernetes.io/tls
data:
  tls.crt: xxxxx
  tls.key: xxxxx

KPS Kubernetes Apps に登録し、hosts ファイルにも追加しておきます



ちゃんと設定ができていると、TLSOn になっています
f:id:konchangakita:20201221205705p:plain

httphttp://nodered.kps.com/)だと接続できなく
f:id:konchangakita:20201220231442p:plain

httpshttps://nodered.kps.com/)で、ちゃんと Node-RED へ接続できるようになりました
f:id:konchangakita:20201220230331p:plain


感想

なんだか思った以上に簡単にできてしまいました。
あとはなんらかの方法で DNS 登録が自動的にできれば、めちゃ簡単?

traefik のダッシュボードも反映されてますが、イマイチよく分かってない
f:id:konchangakita:20201220231941p:plain

もっと色々な機能を使いこなしたら必要になるのかな?
バックエンドへのフォワードとかきっと色々できそう
てか、それこそが真価なんだろう