BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース HashiCorptがConsulサービスメッシュのKubernetes統合を改善

HashiCorptがConsulサービスメッシュのKubernetes統合を改善

原文(投稿日:2018/11/30)へのリンク

Hashicorpは、サービスメッシュとKVストアであるConsulとKubernetesとの統合性を向上するための新機能をリリースした。公式のHelm Chartを使ったKubernetesへのインストールのサポート、Kubernetesサービスとの自動同期、外部ConsulエージェントをKubernetesクラスタに参加させるためのauto-join、Envoyのサポート、PodをConnectで接続するためのインジェクタなどが含まれている。これらの新機能を使うことで、Kubernetesクラスタ間、あるいは異種ワークロードと環境内におけるクラスタ間通信が容易になる。

この統合の一環として、Hashicorpは、Kuberneteのリプレースではなく拡張に重点を置いている。ServicesやConfigMaps、SecretsといったKubernetesの中核的なワークフローコンポーネント上に構築することで、これらのコアプリミティブを活用しているのだ。これにより、Consulカタログ同期などの機能から、外部サービスをKubernetesサービスのファーストクラスサービスに変換することが可能になった。

Kubernetesにインストールするために、公式のHelm ChartがConsulに用意され、完全なConsulセットアップを数分で行えるようになった。このセットアップは、サービスクラスタ、クライアントエージェント、あるいはその両方に実行することができる。

クローンを実行し、最新のタグが振られたリリースをチェックアウトすれば、次のコマンドを使ってチャートをインストールできるようになる。

$ helm install .

これにより、3つのノードで構成されて、各Kubernetesノード上でConsulエージェントが動作する、ブートストラップの完成したサーバクラスタがインストールされる。サーバPodから8550ポートをフォワードすれば、Consul UIを表示することも可能だ。

$ kubectl port-forward consul-server-0 8500:8500

Helm Chartは完全にコンフィギュレーション可能で、コンポーネントの無効化やイメージの変更、UIサービスの公開、リソースやストレージクラスの設定を行うことができる。詳細については、設定可能なオプションの一覧を参照して頂きたい。コンフィギュレーションを調整すれば、クライアントのみのクラスタをデプロイすることができる。以下の設定例のように、ConsulサーバがKubernetesクラスタの外で動作している場合に有効だ。

global:
  enabled: false

client:
  enabled: true
  join:
    - "provider=aws tag_key=... tag_value=..."

join設定はクラウドのauto-joinを使用して、既存のConsulサーバエージェントを検出し参加させるためのものだ。

auto-join機能は、Consulエージェントを実行しているポッドの発見にKubernetes APIを使用するように拡張されている。これは、静的なIPアドレスやDNSを使用する方法に代わるものだ。

Consulは、kubectlの認証に使用される標準的なkubeconfigファイルを使って、Kubernetesの認証を行う。このファイルは標準的な位置から検索される。Consulに接続すれば、タグに基づいたauto-joinを行うように指示することが可能だ。

$ consul agent -retry-join 'provider=k8s label_selector="app=consul,component=server"'

このコマンドはエージェントに対して、app=consulおよびcomponent=serverというタグを使ってKubernetesにPodを問い合わせるように指示する。Podが見つからなければ、Consulが定期的にこのコマンドを再試行する。このコマンドは、Kubernetesクラスタ外で実行されているエージェントで使用可能だ。

KubernetesサービスにConsulカタログの自動同期機能が追加された。対象となるサービスは、Consul DNSあるいはHTTP APIを介して検索できる。サービスの登録にはKubernetesの標準ツールが使用される。従って別のPodに移動したり、スケールアップされた場合でも、Consulカタログは最新の状態に保たれる。これにより、Kubernetes以外のワークロードも、Consul経由でKubernetesサービスに接続できるようになる。

現時点では、この同期プロセスに含まれるのはNodePortサービス、LoadBalancerサービス、および外部IPセットを持ったサービスに限定されている。標準的なLoadBalancerサービス設定は次のようになる。

apiVersion: v1
kind: Service
metadata:
  name: consul-ui
spec:
  ports:
  - name: http
    port: 80
    targetPort: 8500
  selector
    app: consul
    component: server
    release: consul
  type: LoadBalancer

これを実行すれば、Kubernetes外からサービスの問合せが可能になる。

# From outside of Kubernetes
$ dig consul-ui.service.consul.

;; QUESTION SECTION:
;consul-ui.service.consul. IN A

;; ANSWER SECTION:
consul-ui.service.consul. 0 IN A 35.225.88.75

;; ADDITIONAL SECTION:
consul-ui.service.consul. 0 IN TXT "external-source=kubernetes"

Consul UI内でこれらを識別しやすくするために、外部登録されたサービスにはKubernetesアイコンが付けられる。

最後に、ConsulサービスをファーストクラスのKuberneteサービスに登録することができる。これにより、Kubernetes API経由でConsulサービスに接続することが可能になる。ただしそれには、KubernetesでConsul DNSを設定することが必要だ。この同期プロセスはHelm Chart経由で実行できる。

syncCatalog:
  enabled: true

より詳細な設定を行うために、さらにオプションが用意されている。この機能もオープンソース公開されており、consul-k8sプロジェクトの一部となっている。Kubernetesネイティブなインジェクタが用意されており、ConnectでPodを接続することができる。Connectは自動TLS暗号化とIDベースの認証を使用して、安全なサービス間通信を可能にする。これにより、Envoy(Connectのプロキシ)を実行するConnectサイドカーをPodに対して自動的にインジェクションして、Kubernetes設定を自動化することができる。Podに適切なアノテーションが付けられていれば、Envoyは自動的に設定され、自動的に起動し、Connetを介した「接続の受け入れと確立を行う。Connectをインバウンドトラフィック用に設定したReditサーバの例を以下に示す。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
      annotations:
        "consul.hashicorp.com/connect-inject": "true"
    spec:
      containers:
        - name: redis
          image: "redis:4.0-alpine3.8"
          args: [ "--port", "6379" ]
          ports:
            - containerPort: 6379
              name: tcp

これにより、Redis UIがConnect経由でRedisと通信するように設定できる。UIは、プロキシ経由で接続するために、ローカルホストポートと通信するように設定される。さらにインジェクタも、必要な環境変数をコンテナにインジェクションする。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis-ui
  template:
    metadata:
      labels:
        app: redis-ui
      annotations:
        "consul.hashicorp.com/connect-inject": "true"
        "consul.hashicorp.com/connect-service-upstreams": "redis:1234"
    spec:
      containers:
      - name: redis-ui
        image: rediscommander/redis-commander
        env:
        - name: REDIS_HOSTS
          value: "local:127.0.0.1:1234"
        - name: K8S_SIGTERM
          value: "1"
        ports:
        - name: http
          containerPort: 8081

Kubernetes Connectインジェクタは、Helm Chartを使って実行することができる。各クライアントエージェントでは、Envoyプロキシ用にgRPCを有効にする必要がある。

connectInject:
  enabled: true

client:
  grpc: true

これらの新機能により、Kubernetes上でConsulを実行するためのプロセスが簡単になる。さらに、auto-joinや同期機能によって、Kubernetesワークロード以外と統合する環境での実行も簡単になる、とHashicorpでは考えている。今回の新機能に加えて、TerraformやVaultをKubernetesに統合する作業も進められており、今後数ヶ月でリリースされる予定である。

 
 

この記事を評価

採用ステージ
スタイル
 
 

この記事に星をつける

おすすめ度
スタイル

特集コンテンツ一覧

BT