Container

kubernetes-bootcampを試す(アプリ公開編)

Kubernetisお勉強の続き。

Kubernetes Service

Podの論理セットとPodたちにアクセスするためのポリシーを定義する抽象概念。

 

概要

  • Podにはライフサイクルがある。
  • ワーカーのNodeがとまると、Podも消滅。
  • 消えちゃったら、クラスタの状態を戻すために、レプリケーションコントローラーが新しいPodを作成してくれる
  • Pod間の結合をしてくれる
  • YAMLかJsonで定義する(YAML推奨)
  • ServiceがないとPodのIPは外部に公開されない
  • 公開方法はいろいろある
  • Serviceは一連のPodにトラフィックをルーティング(アプリケーションのフロントエンド、バックエンドコンポーネントなどの依存Pod間の検出など)
ClusterIP(既定値)
  • クラスタ内部のIPでServiceを公開する

 

NodePort-NAT
  • ClasuterIPのスーパーセット
  • クラスタ内の選択された各Nodeの同じポートにServiceを公開する
  • <NodeIP>:<NodePort> でクラスタ外部からアクセス可能

 

LaodBalancer
  • NodePortのスーパーセット
  • クラウド外部にロードバランサーを作成
  • Serviceに固有のIPを割り当てる

 

ExternalName
  • 任意の名前を使用してServiceを公開できる
  • proxyは使用しない
  • kube-dnsが必要

 

ServiceとLabel

Serviceはラベルとセレクタを使用して一連のPodを照合する。

ラベルはkey/valueのペアで、いろんな使われ方をする。

 

Labelを使用する

Podを表示。

$ kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-6bf84cb898-k7htp   1/1     Running   0          3s

 

Serviceを表示。

$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   73s

 

外部に公開用にNodePortを指定し、新しいServiceを作成する。(minikubeはロードバランサーサポートしてない)

$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed

 

Serviceをもう一度表示する。

$ kubectl get services
NAME                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes            ClusterIP   10.96.0.1      <none>        443/TCP          4m35s
kubernetes-bootcamp   NodePort    10.96.28.134   <none>        8080:32014/TCP   2m19s

増えてる。

kubernatesってのがデフォルトのサービスで、Kubernetes-bootcampが今追加&公開したやつ。

 

kubectl describe

ポートを確認

$ kubectl describe services/kubernetes-bootcamp
Name:                     kubernetes-bootcamp
Namespace:                default
Labels:                   run=kubernetes-bootcamp
Annotations:              <none>
Selector:                 run=kubernetes-bootcamp
Type:                     NodePort
IP:                       10.96.28.134
Port:                     <unset>  8080/TCP
TargetPort:               8080/TCP
NodePort:                 <unset>  32014/TCP
Endpoints:                172.18.0.3:8080
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

 

変数 NODE_PORT を作成する。

$ export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index.spec.ports 0).nodePort}}')
$ echo NODE_PORT=$NODE_PORT
NODE_PORT=32014

 

テスト。

$ curl $(minikube ip):$NODE_PORT
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6bf84cb898-vttfq | v=1

絶賛公開中。

 

Labelは勝手に貼られるっぽいです。 describeコマンドで確認。

$ kubectl describe deployment
Name:                   kubernetes-bootcamp
Namespace:              default
CreationTimestamp:      Sun, 07 Apr 2019 10:07:45 +0000
Labels:                 run=kubernetes-bootcamp
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               run=kubernetes-bootcamp
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
:
:
(いろいろ、たくさん表示される)

 

Label(kubernatis-bootcamp)を使ってPodにリクエストしてみる。

$ kubectl get pods -l run=kubernetes-bootcamp
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-6bf84cb898-vttfq   1/1     Running   0          20m

これでも良い。

$ kubectl get services -l run=kubernetes-bootcamp
NAME                  TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes-bootcamp   NodePort   10.96.28.134   <none>        8080:32014/TCP   19m

 

Pod名を変数に入れる。

$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
$ echo Name of the Pod: $POD_NAME
Name of the Pod: kubernetes-bootcamp-6bf84cb898-vttfq

 

新しいLabelをつけて、確認。

$ kubectl label pod $POD_NAME app=v1
pod/kubernetes-bootcamp-6bf84cb898-vttfq labeled
$ kubectl label pod $POD_NAME app=v1
pod/kubernetes-bootcamp-6bf84cb898-vttfq labeled
$ kubectl describe pods $POD_NAME
Name:               kubernetes-bootcamp-6bf84cb898-vttfq
Namespace:          default
Priority:           0
PriorityClassName:  <none>
Node:               minikube/172.17.0.18
Start Time:         Sun, 07 Apr 2019 10:07:52 +0000
Labels:             app=v1
                    pod-template-hash=6bf84cb898
                    run=kubernetes-bootcamp
Annotations:        <none>

app=v1 になってる。

 

新しいLabelでPodを表示してみる。

$ kubectl get pods -l app=v1
NAME                                   READY   STATUS    RESTARTS   AGE
kubernetes-bootcamp-6bf84cb898-vttfq   1/1     Running   0          26m
$

 

 

Serviceを削除する。

$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   29m

 

クラスタ外部から見えないことを確認する。

$ curl $(minikube ip):$NODE_PORT
curl: (7) Failed to connect to 172.17.0.18 port 32014: Connection refused

 

内部から見えるか確認する。

$ kubectl exec -ti $POD_NAME curl localhost:8080
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-6bf84cb898-vttfq | v=1

みえますね。

 

 

今日はここまで〜

 

 

-Container