仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

Ambassador Edge Stackをmicrok8sで使ってみる

先日、Kubernetesのブログ記事を見ていて、Ingress ControllerとしてAmbassadorというものがあるのを知りました。 AmbassadorはKubernetesマイクロサービスへのトラフィックを簡単に公開、保護、管理するためのものだそうです。

kubernetes.io

早速使ってみようと思いました。 公式サイトなどのリンクは次のとおりです。

Ambassadorの特徴

Ingress Controllerに選択肢がある中で、Ambassadorの特徴をざっとあげると次のような感じです。

  • 最新のKubernetes Ingress仕様に対応
  • 導入が簡単であること
  • 色々なService Meshと組み合わせて使えること
  • 多くのOAuth IDプロバイダーに対応
  • 可視化と監視に優れている
  • Kubernetesサービスの保護に長けている

それぞれの詳細についてはHowtoのページからリンクを辿ってください。

Ambassadorのインストール

Ambassadorの導入にはYAMLをapplyしていく方法とHelmを使う方法があるのですが、今回はYAMLを使います。 Kubernetesクラスターはどのように構築しても良いみたいですが、今回は手軽に使えるmicrok8sを使ってみます。

IPアドレスの確保

microk8sで type: Loadbalancer を使うためにMetalLBを使うことにします。 今回はベアメタル上にKubernetesクラスターを構築するのを想定しますので、IPアドレスを複数NICに割り当てて対応してみます。

本例を参考にする場合は使用中のIPアドレスを割り当てて重複しないよう気をつけてください。本例はMAASで管理したノードにStatic IP Rangeで確保済みのIPアドレスを使って対応しています。

$ ip a s eno1
inet 172.17.28.71/24 brd 172.17.28.255 scope global eno1

ノードに割り当てられたIPアドレスは上記だったとして、それ以外に使うIPアドレスを ip addr add コマンドで割り当てます。これにより、一つのインターフェイスに複数のIPアドレスを割り当てできます。

$ sudo ip addr add 172.17.28.72/24 dev eno1
$ sudo ip addr add 172.17.28.73/24 dev eno1
$ sudo ip addr add 172.17.28.74/24 dev eno1
$ sudo ip addr add 172.17.28.75/24 dev eno1

他のノードからpingを実行し、アクセスできることを確認します。クラスター側は sudo tcpdump -i eno1 -Q inout icmp コマンドを実行し、外部からpingコマンドでそれぞれのIPアドレスを確認します。それぞれ ICMP echo requestICMP echo reply の応答があることを確認します。

ちなみに今回のような方法でMetalLBを使うのは、シングルクラスターでのみ有効な方法ですのであらかじめご了承ください。

microk8sをインストール

以下のように実行してmicrok8sをデプロイします。

$ sudo snap install microk8s --classic --channel=1.18/stable

グループ追加など

以下実行後、シェルにログインし直します。

$ sudo usermod -a -G microk8s ubuntu
$ sudo chown -f -R ubuntu ~/.kube
$ sudo snap alias microk8s.kubectl kubectl

microk8sアドオンの有効化

microk8sアドオンを有効にします。今回は以下のアドオンのみ有効化していますが、他に必要なものがあれば有効化してください。ただしIngressアドオンはAmbassadorと重複するので有効化しないでください。

$ microk8s enable rbac dns
$ microk8s enable metallb

metallbの方を有効化しようとするとレンジの入力を求められるので、先の手順でNICに割り当てたIPアドレスを範囲で指定します。

(入力例)

172.17.28.71-172.17.28.75

microk8sアドオンの確認

コマンドを実行して、microk8sのアドオンを確認します。

$ microk8s.status
microk8s is running
addons:
dns: enabled
metallb: enabled
rbac: enabled
...

K8sクラスターにAmbassadorを展開

いよいよAmbassadorを展開するわけですが、基本的にQuick Start にあるコマンドを実行するだけでセットアップできます。 まず、次のコマンドでAmbassadorをデプロイします。

$ kubectl apply -f https://www.getambassador.io/yaml/aes-crds.yaml && kubectl wait --for condition=established --timeout=90s crd -lproduct=aes && kubectl apply -f https://www.getambassador.io/yaml/aes.yaml && kubectl -n ambassador wait --for condition=available --timeout=90s deploy -lproduct=aes

次のコマンドでサービスIPアドレスを確認します。

$ kubectl get -n ambassador service ambassador -o "go-template={{range .status.loadBalancer.ingress}}{{or .ip .hostname}}{{end}}"

WebブラウザーでサービスIPアドレスにアクセスしてみましょう。すると、次のような画面が表示されるはずです。

f:id:virtualtech:20200610164249p:plain
CONFIGRATULATIONS! - You've installed the Ambassador Edge Stack

リンクをクリックすると、次のようなAdmin Dashboardにアクセスできるはずです。指示に従ってegdectlコマンドラインツールを導入します。

f:id:virtualtech:20200610164514p:plain
Ambassador Welcome

以上でmicrok8sにAmbassador Edge Stackを導入できたわけです。 ドキュメントを見るとAmbassador Edge Stackには様々な使いかたがあるようですが、次はIngress ControllerとしてAmbassadorを使ってみます。

Ambassador Ingress Controllerを使う

参考にしたのはブログ記事「Deploying the Ambassador Edge Stack as an Ingress Controller for Kubernetes with TLS」です。

基本的には書かれているとおりです。

---
apiVersion: v1
kind: Service
metadata:
  name: quote
  namespace: ambassador
spec:
  ports:
  - name: http
    port: 80
    targetPort: 8080
  selector:
    app: quote
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: quote
  namespace: ambassador
spec:
  replicas: 1
  selector:
    matchLabels:
      app: quote
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: quote
    spec:
      containers:
      - name: backend
        image: quay.io/datawire/quote:0.2.7
        ports:
        - name: http
          containerPort: 8080

のようなYAMLと

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: ambassador
  name: quote-ingress
  namespace: ambassador
spec:
  rules:
   - http:
       paths:
       - path: /quote/
         backend:
           serviceName: quote
           servicePort: 80

のようなYAMLを作って、 kubectl apply -f 〜 します(もちろん一つのYAMLにまとめて実行でも良いです)。 次を実行して、IngressサービスのIPアドレスを確認します。

$ kubectl get -n ambassador service ambassador -o 'go-template={{range .status.loadBalancer.ingress}}{{print .ip "\n"}}{{end}}'

curlコマンドでアクセスしてみましょう。ポイントとしてはhttpsでサービスが公開されている点です。証明書をきちんと設定すれば不要ですが、今回の手順では適切な証明書の設定を行っていないため、自己証明書が使われます。 -k オプションをつけて実行します。

$ curl -k https://YOUR_IP_ADDRESS/quote/

すると、次のような応答があるはずです。quoteの後の出力はランダムな文章が出力されます。

{
    "server": "lumbering-passionfruit-90tjwh2b",
    "quote": "The light at the end of the tunnel is interdependent on the relatedness of motivation, subcultures, and management.",
    "time": "2020-06-10T07:54:39.645097057Z"

以上で、Ambassador Edge StackをKubernetesクラスターにインストールし、Ambassador Ingressコントローラーの動作確認が取れました。 割と簡単にIngressコントローラーを使えるようになりました。

うまく動いたので、これで次のステップに進むことができます。

www.getambassador.io