【Nutanix KPS IoT】traefik編【使ってみる】
Xi IoT が KPS(Karbon Platform Service)にリブランドされたタイミングで、色々と機能が増えたので試していきまっす
まずは「Traefik」いってみよっと
以前に Kubernetes ロードバランサーの ingress-nginx も勉強してみたけれども
自宅の kubernetes に ingress-nginx を入れてみる - konchangakita
相変わらず Kubernetes は苦手なので、ちょっとづつ触りながら理解していきます
なんとなくのイメージで、Kubernetes 上の pod/service へのアクセスに必要なポート番号の管理を楽にしてくれたりしそう
<やってみたいことイメージ図>
traefik を導入する
そもそも traefik の使い方なんかよく分かってないので、ちょっと調べてみると
https://doc.traefik.io/traefik/
「Traefikの特徴は、多くの機能に加えて、サービスに適した設定を自動的に検出することです。Traefik がインフラストラクチャを検査して関連情報を見つけ、どのサービスがどのリクエストに対応しているかを検出すると、魔法のようなことが起こります。」
ということで、イメージは合ってそうですし、もっと壮大なことができそう?
KPS 管理画面で traefik を有効にする
まずは、KPS上で traefik を有効化してみましょう
プロジェクト単位で使うサービスを選んでいきますので、まずは今回 traefik を利用するプロジェクトに選んで、Project Home から Manage Services を選択します
(プロジェクトを新しく作るときにも選択できます)
そうすると KPS で有効にできるサービス一覧が出てきます
Ingress Controller の Traefik を有効にしてみます
(Nginx-Ingress と Traefik は両方同時に有効にはできません)
プロジェクトのメニューに Traefik があらわれます
ブラウザから http://<ServiceDomain IP>:8081/ へ接続すると、traefik のダッシュボードが表示されます
正直どう見るのかはよくワカラン
Traefik を有効にする手順はこれで完了です。なんの設定項目も無いのは楽で良いです
あとは Kubernetes Apps 側で、Ingress の設定を呼び出しなんやかんややっていきます
これでロードバランス機能はサクッと使えます。また、Traefik 自体もたくさんの API をもっています
・IngressRoutes
・IngressRouteTCPs
・IngressRouteUDPs
・Middlewares
・TraefikServices
・TLSOptions
・TLSStores
これは、詳しい人に教えてもらおう。。。
簡単なアプリでテストする
ingress-nginx を練習したときに試した方法でテストしてみます
自宅の kubernetes に ingress-nginx を入れてみる - konchangakita
ホスト名を表示するだけの Webサイト を 2つ用意して、好きな URL でアクセスできるようにしてみます。 traefik では同じポート番号でいけるらしい
ただただホスト名を表示するけの 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/Service に Ingress の設定を追加してやります
・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アプリを登録します
さきほどの yaml を結合しただけの以下をコピペ
ingress の設定がうまくいっていると、Traefik の設定状況が表示されます
「hello1.com」と「hello2.com」の設定が反映されているようです
Webブラウザでアクセスしてみる
まずは、ホスト名でアクセスするための名前解決に DNS に登録してやる必要があります
きっと kubernetes 的に自動登録的な方法があるのかもですが、検証環境なのでとりあえず、アクセスするPCの hostsファイル を直接いじることにします
記入方法「<ServiceDomain IP> ホスト名」
<記入例>
192.168.199.3 hello1.com 192.168.199.3 hello2.com
hosts を追記した PC から「hello1.com」と「hello2.com」ブラウザアクセスしてみると
それぞれで、違うホスト名が表示されているので、ちゃんとそれぞれ違うWebサイトに接続されているようです
これでサービスごとにポート番号の別にする必要がなくなったので kubernetes 初心者としては、これだけでも使う価値ありって感じですね
Node-REDで試す
では、実際によく使うアプリで試してみたいと思います
KPS でよく使う Node-RED を 「https://nodered.kps.com」で、アクセスできるようにしたい
ingress 設定に HTTPS 接続用の設定を追加してみます
annotation、tls、secret あたりです
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 ファイルにも追加しておきます
ちゃんと設定ができていると、TLS が On になっています
http(http://nodered.kps.com/)だと接続できなく
https(https://nodered.kps.com/)で、ちゃんと Node-RED へ接続できるようになりました