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に統合する作業も進められており、今後数ヶ月でリリースされる予定である。
この記事を評価
- 編集者評
- 編集長アクション