ヘッドレスサービス
- 対象となる個々のPodのIPアドレスが直接帰ってくるService
- DNSラウンドロビンのイメージ
- ロードバランシングするためのIPアドレスは不要
- StatefulSetがHeadlessServiceを利用している場合、Pod名でIPアドレスを引くことができる(Kubernetesの設計的に、StatefulSet内の各Podを直接指定するのはナンセンス)
セットアップ
HeadlessServiceのデプロイ
sample-headless.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<span class="na">apiVersion </span><span class="pi">:</span> <span class="s">v1の</span> <span class="na">種類</span><span class="pi">:</span> <span class="s">サービス</span> <span class="na">メタデータ</span><span class="pi">:</span> <span class="na">名前</span><span class="pi">:</span> <span class="s">サンプル・ヘッドレス</span> <span class="na">仕様</span><span class="pi">:</span> <span class="na">タイプ</span><span class="pi">:</span> <span class="s">CLUSTERIP </span> <span class="na">CLUSTERIP </span><span class="pi">:</span> <span class="s">なし</span> <span class="na">ポート</span><span class="pi">:</span> <span class="pi">- </span> <span class="na">名前</span><span class="pi">:</span> <span class="s2">" </span><span class="s">HTTPポート" </span> <span class="na">プロトコル</span><span class="pi">:</span> <span class="s2">" </span><span class="s">TCP" </span> <span class="na">ポート</span><span class="pi">:</span> <span class="m">80 </span> <span class="na">targetPort </span><span class="pi">:</span> <span class="m">80 </span> <span class="na">セレクター</span><span class="pi">:</span> <span class="na">アプリ</span><span class="pi">:</span> <span class="s">サンプルアプリ</span> |
展開
1 |
kubectl apply -f sample-headless.yaml |
状態確認
1 |
kubectl get service sample-headless |
出力結果
1 2 |
名前タイプクラスターIP外部IPポート年齢 sample-headless ClusterIPなし<なし> 80 / TCP 8分9秒 |
StatefullSetのデプロイ
- ReplicaSetの亜種
- PersistentVolumeを使っている場合、Pod再起動時には同じディスクを利用して再作成される
- ポッド名が変わらない
sample-statefulset-headless.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<span class="na">apiVersion </span><span class="pi">:</span> <span class="s">apps / v1 </span> <span class="na">種類</span><span class="pi">:</span> <span class="s">StatefulSet </span> <span class="na">メタデータ</span><span class="pi">:</span> <span class="na">名前</span><span class="pi">:</span> <span class="s">sample-statefulset- </span> <span class="na">headless </span><span class="na">仕様</span><span class="pi">:</span> <span class="na">serviceName </span><span class="pi">:</span> <span class="s">サンプルヘッドレス</span> <span class="na">レプリカ</span><span class="pi">:</span> <span class="m">3 </span> <span class="na">セレクター</span><span class="pi">:</span> <span class="na">matchLabels </span><span class="pi">:</span> <span class="na">app </span><span class="pi">:</span> <span class="s">sample-app </span> <span class="na">テンプレート</span><span class="pi">:</span> <span class="na">メタデータ</span><span class="pi">:</span> <span class="na">ラベル</span><span class="pi">:</span> <span class="na">app </span><span class="pi">:</span> <span class="s">サンプルアプリ</span> <span class="na">仕様</span><span class="pi">:</span> <span class="na">コンテナー</span><span class="pi">:</span> <span class="pi">- </span> <span class="na">名前</span><span class="pi">:</span> <span class="s">nginx-container </span> <span class="na">イメージ</span><span class="pi">:</span> <span class="s">nginx:1.12</span> |
展開
1 |
kubectl apply -f sample-statefulset-headless.yaml |
状態確認
1 |
kubectl get statefulsets sample-statefulset-headless |
出力結果
1 2 |
名前対応年齢 sample-statefulset-headless 3/3 7分11秒 |
動作確認
別PodよりHeadlessServiceを名前解決できるかを確認
1 2 |
kubectl run --image = centos:6 --restart = Never --rm -i testpod-dig sample-headless.default.svc.cluster.local |
出力結果
3のIPアドレスが返されていることがわかる
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
; << >> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.1 << >> sample-headless.default.svc.cluster.local ;; グローバルオプション:+ cmd ;; 答えを得ました: ;; ->> HEADER <<-opcode:QUERY、status:NOERROR、id:33653 ;; フラグ:qr aa rd ra; クエリ:1、回答:3、権限:0、追加:0 ;; 質問セクション: ; sample-headless.default.svc.cluster.local。で ;; 回答セクション: sample-headless.default.svc.cluster.local。5 IN A 10.42.0.11 sample-headless.default.svc.cluster.local。5 IN A 10.42.2.8 sample-headless.default.svc.cluster.local。5 IN A 10.42.1.8 ;; クエリ時間:1ミリ秒 ;; サーバー:10.43.0.10#53(10.43.0.10) ;; いつ:2019年10月6日05:19:56 ;; MSGサイズrcvd:230 ポッド「testpod」が削除されました |
StatefulSet内のポッドを直接名前解決できることを確認
1 2 3 |
kubectl run --image = centos:6 --restart = Never --rm -i testpod-dig sample-statefulset-headless-0.sample-headless.default.svc.cluster. local |
出力結果
IP アドレスが返ってきている
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
; << >> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.1 << >> sample-statefulset-headless-0.sample-headless.default.svc.cluster. local ;; グローバルオプション:+ cmd ;; 答えを得ました: ;; ->> HEADER <<-opcode:QUERY、status:NOERROR、id:39140 ;; フラグ:qr aa rd ra; クエリ:1、回答:1、権限:0、追加:0 ;; 質問セクション: ; sample-statefulset-headless-0.sample-headless.default.svc.cluster. local。で ;; 回答セクション: sample-statefulset-headless-0.sample-headless.default.svc.cluster. local。5 IN A 10.42.1.8 ;; クエリ時間:1ミリ秒 ;; サーバー:10.43.0.10#53(10.43.0.10) ;; いつ:2019年10月6日05:22:03 ;; MSGサイズrcvd:176 ポッド「testpod」が削除されました |