Docker/K8S実践コンテナ開発入門@16日目

前回の続きです。

lawrence-twin.hateblo.jp

Service

Serviceとは

  • Podの集合(主にReplicaset)に対してサービスディスカバリを提供
  • サービスディスカバリはAPIの接続先がクライアントから一貫して同じ名前で接続できる仕組みであること
  • Serviceのターゲットはラベルセレクタによって決定される

手順に従って、「simple-replicaset-with-label.yaml」というマニフェストファイルを作成する
マニフェスト内ではほぼ同じでラベルが別名のReplicasetを作成する。
マニフェストファイル内で二つ以上のReplicasetなど設定を行う場合は セパレータとして「---」を使う。

ただショックなのは以下サイトではセパレータに対応していませんでした。
普段からお世話になっているのですが、
今回のようなyamlをチェックする場合はセパレータ「---」なしで定義を別々に分ける必要があります。
yaml-online-parser.appspot.com

作成できたら、以下のコマンドを実行してapplyします。
※この前に実行したReplicasetを「kubectl delete」コマンドで消しておかないとapplyできない。

■Replicasetを作成する。

kubectl apply -f simple-replicaset-with-label.yaml 

■各ラベルごとのReplicasetを確認

// springラベルを確認
kubectl get pod -l app=echo -l release=spring

//summerラベルを確認
kubectl get pod -l app=echo -l release=summer

次にServiceを作成する。「simple-service.yaml」を作成する。
作成後はapplyする

■Service apply

kubectl apply -f simple-service.yaml 

■Serviceの確認

kubectl get svc echo

この後、デバッグコンテナを一時的にデプロイ、curlコマンドでHTTPリクエストを送って確認を行う。

デバッグコンテナをデプロイしてリクエスト確認

lawrence@Chocolate echo3 % kubectl run -i --rm --tty debug --image=gihyodocker/fundamental:0.1.0 --restart=Never -- bash -il
If you don't see a command prompt, try pressing enter.
debug:/# curl http://echo/
Hello Docker!!debug:/# 
debug:/# exit
logout
pod "debug" deleted

その後、以下のコマンドで指定したラベルにSummerにのみ出力されている
■確認コマンド

lawrence@Chocolate echo3 % kubectl logs -f echo-summer-67nn9 -c echo
2020/05/12 13:51:32 start server
2020/05/12 14:25:22 received request

lawrence@Chocolate echo3 % kubectl logs -f echo-spring-5cddm -c echo
2020/05/12 13:51:25 start server

ServiceではSummerというラベルのPodのみを指定しているのでこうなるみたいです。


他Serviceには主に以下の種類がある

  • ClusterIP Service・・・デフォルト設定
  • NodePort Service・・・クラスタ外からアクセスできる(グローバルポートを開ける)
  • LoadBalancer Service・・・ロードバランサ と連携するためのもの、GCP, AWSなど様々
  • ExternalName Service・・・selectorもPod定義も持たない、K8Sクラスタ内から外部のホスト解決のためのエイリアスを提供するらしい

Ingress

Swarmの章でもやりましたが、Serviceを外部に公開するためにL7階層の処理が行えるのがIngressというものだそうです
以下のyamlを利用して、HTTPリクエストをServiceにルーティングするためのnginx_ingress_controllerを次のようにデプロイします。

■apply

kubectl apply -f \
https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.16.2/deploy/mandatory.yaml
kubectl apply -f \
https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.16.2/deploy/provider/cloud-generic.yaml


以下のコマンドでIngress resourceを確認します。※上記コマンドを実行してから5分くらい待ちます。

■確認コマンド

kubectl -n ingress-nginx get service,pod

Ingressを通じたアクセス

Serviceで試したときの「simple-service.yaml」を書籍に従って修正
修正完了後はマニフェストファイルの更新を行う

■更新コマンド

kubectl apply -f simple-service.yaml 

Ingressを定義した「simple-ingress.yaml」を書籍に従って作成し、以下のコマンドで確認します。

■apply, 確認コマンド

//apply
kubectl apply -f simple-ingress.yaml

//確認
kubectl get ingress

これによって、以下のようにHTTPリクエストでも結果が帰ってくるようになりました。

■コマンド
curl http://localhost -H 'Host: ch05.gihyo.local'

最後に、「simple-ingress.yaml」を修正してmobile Agentというhttpリクエストがきたら別のURLにリダイレクトしてくれます。

■確認コマンド
url http://localhost \
> -H 'HOST: ch05.gihyo.local' \
> -H 'User-Agent: Mozilla/5.0 (Iphone; CPU iPhone OS 11_0 like Mac OS X)a
quote> AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'


この章はここまでです。
若干理解度という点では怪しいところありますが、次の章を進めていきます。