Docker/K8S実践コンテナ開発入門@16日目
前回の続きです。
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には主に以下の種類がある
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'
この章はここまでです。
若干理解度という点では怪しいところありますが、次の章を進めていきます。