先日、Kubernetesのブログ記事を見ていて、Ingress ControllerとしてAmbassadorというものがあるのを知りました。 AmbassadorはKubernetesマイクロサービスへのトラフィックを簡単に公開、保護、管理するためのものだそうです。
早速使ってみようと思いました。 公式サイトなどのリンクは次のとおりです。
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 request
と ICMP 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アドレスにアクセスしてみましょう。すると、次のような画面が表示されるはずです。
リンクをクリックすると、次のようなAdmin Dashboardにアクセスできるはずです。指示に従ってegdectlコマンドラインツールを導入します。
以上で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コントローラーを使えるようになりました。
うまく動いたので、これで次のステップに進むことができます。