kubernetesチュートリアルをやってみる 第四回:アプリ公開

LINEで送る
Pocket

はじめに

 

kubernetes_logo

 

前回の記事では、「kubernetesチュートリアルをやってみる 第三回:アプリ探索」について書いて行きましたが、今回はアプリの公開について書いて行きたいと思います。

 

チュートリアルの内容

  1. kubernetesクラスタを作成する
  2. アプリケーションをクラスタにデプロイする
  3. アプリケーションを探索する
  4. ★アプリケーションを公開
  5. アプリケーションをスケールアップする
  6. アプリケーションを更新する

今回は、上記の内の★印部分を実施します。

環境

OS:CentOS Linux release 7.5.1804 (Core)
Kernel:3.10.0-862.2.3.el7.x86_64
minikube:v0.32.0

実施内容

今回は、kubernetesのServiceとラベルの概要を確認します。
また、minikubeを使用し、kuberntes公式のチュートリアルに従って、kubernetesクラスタにデプロイしたアプリケーションを公開したり、ラベルを使用してオブジェクトを参照するところまでを実施したい思います。

kubernetesのServiceの概要

 

kubernetes_04_services

 

  • kubernetesのPodは個別のIPアドレスを持つが、これはkubernetesクラスタの内部でのみ参照可能
  • これを外部からアクセス可能にするには、Serviceの作成が必要となる
  • Serviceは各Podへ接続をルーティングする
  • PodがNode障害などにより別Nodeに移動しても、Seviceはこれに合わせて新たなルーティングを実行する
  • Serviceには複数のタイプがある
    • ClusterIP (既定値):クラスタ内の内部IPを使用(外部には公開しない)
    • NodePort:クラスタ内の各Nodeのポートを使用する(NAT)
    • LoadBalancer:ロードバランサを作成し、外部IPを割り当てる
    • ExternalName:任意の名前を使用してServiceを公開する(CNAME)

 

 

kubernetesのラベルの概要

 

kubernetes_04_labels

 

  • Seviceは、ラベルとラベルセレクタを使用してPodを参照する
  • SeviceとPodに同じラベルを設定する事で、ServiceがPodを参照できるようになる
  • ラベルはkey/valueのペアである
  • 使用方法はさまざまな用途に使用できる
    • アプリケーションのバージョンタグを埋め込む
    • 開発・テスト・本番などの環境情報を指定する

 

手順

 

Serviceの作成

 

Podの確認

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubernetes-bootcamp-6bf84cb898-nt7h7 1/1 Running 0 6m57s
$

現状では、kubernetes-bootcamp と言うPodが動作しています。

Serviceの確認

$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 10m
$

kubernetesクラスタ起動時、デフォルトでkubernetesと言うSeviceが作成されます。

Serviceの作成

$ kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080
service/kubernetes-bootcamp exposed
$
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 11m
kubernetes-bootcamp NodePort 10.101.247.167 8080:31970/TCP 10s
$

kubectl exposeコマンドを使用し、kubernetes-bootcampと言うServiceをNodePortタイプで作成します。
このServiceが持つIPアドレスとポートを確認できました。

Serviceの詳細確認

$ kubectl describe services/kubernetes-bootcamp
Name: kubernetes-bootcamp
Namespace: default
Labels: run=kubernetes-bootcamp
Annotations:
Selector: run=kubernetes-bootcamp
Type: NodePort
IP: 10.101.247.167
Port: 8080/TCP
TargetPort: 8080/TCP
NodePort: 31970/TCP
Endpoints: 172.18.0.4:8080
Session Affinity: None
External Traffic Policy: Cluster
Events:
$

Podの8080ポートを、Nodeの31970ポートで公開しています。

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=31970
$

割り当てられたNodePortを変数に定義します。

外部公開されたポートでのアプリ接続確認

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

curlでNodeIP:NODE_PORTに接続し、アプリが外部に公開されている事が確認できました。

 

ラベルの使用

ラベルの確認

$ kubectl describe deployment
Name: kubernetes-bootcamp
Namespace: default
CreationTimestamp: Sat, 22 Jun 2019 03:02:41 +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
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
Labels: run=kubernetes-bootcamp
Containers:
kubernetes-bootcamp:
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Port: 8080/TCP
Host Port: 0/TCP
Environment:
Mounts:
Volumes:
Conditions:
Type Status Reason
---- ------ ------
Available True MinimumReplicasAvailable
Progressing True NewReplicaSetAvailable
OldReplicaSets:
NewReplicaSet: kubernetes-bootcamp-6bf84cb898 (1/1 replicas created)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 24m deployment-controller Scaled upreplica set kubernetes-bootcamp-6bf84cb898 to 1
$

deployment作成時、ラベルは自動的に作成されます。
ここでは Labels: に 「run=kubernetes-bootcamp」と言うラベルがある事が確認できます。

ラベルを使用してのPod参照

$ kubectl get pods -l run=kubernetes-bootcamp
NAME READY STATUS RESTARTSAGE
kubernetes-bootcamp-6bf84cb898-nt7h7 1/1 Running 031m
$

kubectl get podsコマンドに、-l パラメータを指定する事で、指定したラベルが設定されているPodの情報を参照できます。

ラベルを使用してのService参照

$ kubectl get services -l run=kubernetes-bootcamp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes-bootcamp NodePort 10.101.247.167 8080:31970/TCP 22m
$

Serviceに対しても、ラベルを使用する事ができます。

POD_NAME変数の定義

$ 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-nt7h7
$

kubernetes-bootcamp Podの名前を、POD_NAME変数に定義します。

新たなラベルの設定

$ kubectl label pod $POD_NAME app=v1
pod/kubernetes-bootcamp-6bf84cb898-nt7h7 labeled
$

kubectl labelコマンドの後に、オブジェクトタイプ、オブジェクト名、ラベル名を指定し、新たなラベルを設定します。

ラベルの設定確認

$ kubectl describe pods $POD_NAME
Name: kubernetes-bootcamp-6bf84cb898-nt7h7
Namespace: default
Priority: 0
PriorityClassName:
Node: minikube/172.17.0.13
Start Time: Sat, 22 Jun 2019 03:02:47 +0000
Labels: app=v1
pod-template-hash=6bf84cb898
run=kubernetes-bootcamp
Annotations:
Status: Running
IP: 172.18.0.4
Controlled By: ReplicaSet/kubernetes-bootcamp-6bf84cb898
Containers:
kubernetes-bootcamp:
Container ID: docker://b9de392c5d57eb4032b53a4b15eba57524a802add969b8443bd67ed86bef153e
Image: gcr.io/google-samples/kubernetes-bootcamp:v1
Image ID: docker-pullable://jocatalin/kubernetes-bootcamp@sha256:0d6b8ee63bb57c5f5b6156f446b3bc3b3c143d233037f3a2f00e279c8fcc64af
Port: 8080/TCP
Host Port: 0/TCP
State: Running
Started: Sat, 22 Jun 2019 03:02:49 +0000
Ready: True
Restart Count: 0
Environment:
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-k2vn9 (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-k2vn9:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-k2vn9
Optional: false
QoS Class: BestEffort
Node-Selectors:
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 40m (x2 over 40m) default-scheduler 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.
Normal Scheduled 40m default-scheduler Successfully assigned default/kubernetes-bootcamp-6bf84cb898-nt7h7 to minikube
Normal Pulled 40m kubelet, minikube Container image "gcr.io/google-samples/kubernetes-bootcamp:v1" already present on machine
Normal Created 40m kubelet, minikube Created container
Normal Started 40m kubelet, minikube Started container
$

Labels: に app=v1 が設定された事が確認できました。

新たなラベルを使用してのPod参照

$ kubectl get pods -l app=v1
NAME READY STATUS RESTARTSAGE
kubernetes-bootcamp-6bf84cb898-nt7h7 1/1 Running 041m
$

app=v1 ラベルを指定して、Pod情報を参照できました。

 

Serviceの削除

 

Serviceの削除

 

$ kubectl delete service -l run=kubernetes-bootcamp
service "kubernetes-bootcamp" deleted
$

kubectl deleteコマンドでServiceを削除します。

Serviceの削除確認

$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 43m
$

Serive一覧から、"kubernetes-bootcamp"が表示されなくなった事が確認できました。

Serviceを使用してのアプリ接続確認

$ curl $(minikube ip):$NODE_PORT
curl: (7) Failed to connect to 172.17.0.10 port 31445: Connection refused
$

Serviceを指定してcurlコマンドでアプリへの接続確認をしても、接続が出来なくなっている事が確認できました。

アプリの動作確認

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

アプリのPod内部から、curlコマンドで接続し、アプリとしては動作を続けている事が確認できました。

 

まとめ

今回は、Serviceを使用して、アプリケーションを公開する方法と、ラベルの使用方法について書いていきました。
ラベルを使用して、名前(key/value)で各オブジェクトを管理出来るのは、便利ですね。

次回は、アプリケーションのスケールアップについて書いて行きたいと思います。

LINEで送る
Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

5 × 1 =