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
みえますね。
今日はここまで〜