はじめに
kubenetesの勉強メモ
Kubenetes
- kubernetesはコンテナのお世話係、指令係
- コンテナがちゃんと生きているか監視する
- もしコンテナが死んだら、回復させる。
- 仕事をnodeさんに割り振る
- nodeさんの能力によってコンテナを振り分ける
Kubenetes = kubenetes master + kubenetes node
masterの役割
- APIエンドポイントの提供→だから、kubectlが使える
- コンテナのスケジューリング、スケーリング(アクセスに応じてコンテナを増やしたりヘラいたりする)
nodeの役割
- そもそもなんでnodeという名前なのか?dockerhostみたいな名前でよかったのでは?
- それは、kubenetesがdocker以外のコンテナランタイムをホストにできるから
- nodeないで実際にコンテナが起動している
kubenetesには大きく五つのリソースに分かれている
- Workloads ・・コンテナの実行に関するリソース
- Discovery&LB・・コンテナを外部に公開するためのリソース
- Config&Storage・・設定、永続化ボリュームなどに関するリソース
- Cluter ・・セキュリティなどに関するリソース
- medadataリソース・・・リソースを操作する系統のリソース
特に上三つはアプリ開発でよく使うリソース
workloadsリソース
クラスタ上にコンテナを起動するために利用するリソース
俺らが直接利用するのは全部で8個ある。
- pod
- Replication controller
- replicaset
- deployment
- daemonset
- statefulset
- job
- cronjob
Discovery&LBリソース
コンテナを外部からアクセスできるようにするために利用するリソース
俺らが利用するものは全部で2個ある。(servicesはエンドポイントの提供方法が異なる奴が複数ある)
- services
- clusterIP
- Nodeport
- LoadBalancer
- ExternalIP
- ExternalName
- Headless
- Ingress
Config&Storageリソース
設定や機密データをコンテナに設定したり、永続ボリュームを提供するリソース。
- secret・・・設定を埋め込むのに適している
- configmap・・・機密情報などを埋め込むのに適している
- Persistentvolumeclaim・・コンテナから永続ボリュームを利用するために使う
Clusterリソース
クラスター自体の振る舞いを定義するリソース。
いろんなリソースがある。その中でもセキュリティや利便性に関する設定、ポリシーなどのリソースが該当する。
- Namespace
- serviceaccount
- role
- clusterrole
- clusterrolebinding
- networkpilicy
- resourcequota
- presistentvolume
- Node
Metadataリソース
クラスタ内の他のリソースの動作を制御するようなリソース
例えば、podのオートスケールをするなど。。
kubectl
$ kubectl apply -f manifestファイル名
マニフェストファイル名の変更の適応をしてくれる。リソースができていない時は新規作成してくれる。kubectl create
コマンドより使い勝手が良い。
リソースの取得をしたい
podやdeploymentなどのリソースを取得したいという場合がある。
そういう時はkubectl get
コマンドを利用する
#特定のリソースを見たいん場合
$ kubectl get リソース名
# 全てのリソースを見たい場合
$ kubectl get all
例えば、
$ kubectl get pods
======実行結果=====
NAME READY STATUS RESTARTS AGE
sample-pod 1/1 Running 0 31m
このようにリソース名やステータスなどが確認できる。
もっと詳しい情報がみたいという場合には-o(output)
オプションを利用する。
例えば、、
$ kubectl get pods -o wide
===== 実行結果 =====
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
sample-pod 1/1 Running 0 35m 10.1.0.6 docker-desktop <none> <none>
先ほどの情報に加えてIPやNodeの情報も見れるようになった。
**もっとより詳細な情報が見たい!!!**という場合はkubectl describe
コマンドを利用する。
例えば、
$ kubectl describe pods sample-pods
===== 実行結果 =====
Name: sample-pod
Namespace: default
Priority: 0
Node: docker-desktop/192.168.65.3
Start Time: Sat, 06 Jun 2020 09:49:45 +0900
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"sample-pod","namespace":"default"},"spec":{"containers":[{"image":"ng...
Status: Running
IP: 10.1.0.6
Containers:
nginx-container:
Container ID: docker://67aeac189a2fd0834a383d4a3ca34d53a3babb44b81f4e5cda349edb4d01a0a5
Image: nginx:1.13
Image ID: docker-pullable://nginx@sha256:b1d09e9718890e6ebbbd2bc319ef1611559e30ce1b6f56b2e3b479d9da51dc35
Port: <none>
Host Port: <none>
State: Running
Started: Sat, 06 Jun 2020 09:50:18 +0900
Ready: True
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-z5kvw (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
default-token-z5kvw:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-z5kvw
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 40m default-scheduler Successfully assigned default/sample-pod to docker-desktop
Normal Pulling 40m kubelet, docker-desktop Pulling image "nginx:1.13"
Normal Pulled 39m kubelet, docker-desktop Successfully pulled image "nginx:1.13"
Normal Created 39m kubelet, docker-desktop Created container nginx-container
Normal Started 39m kubelet, docker-desktop Started container nginx-container
このようにイメージの取得コンテナのライフサイクルに関する情報などをみることができる。
Podのログを見たい!
podなどのリソースのログが見たいという場合にはkubectl logs
コマンドを使用する。
例えば、、、
# pod内のコンテナのログを見たい(pod名:sample-pod)
$ kubectl logs sample-pods
# pod内の特定のコンテナのログが見たい(-c(container):コンテナ名を指定する)
$ kubectl logs sample-pod -c nginx-container
# ログを追っかけたい
$ kubeclt logs -f sample-pod
Podの中に入りたい(コマンドを実行したい)
podの中のコンテナに入って、コマンドを実行したい場面がある。
そういった場合はkubectl exec
コマンドを使用する。これは、docker exec
コマンドによく似ている。
違う点としては、podは一つ以上のコンテナを持っているので、複数のコンテナをもつpodに入る場合は入るコンテナを-cオプションで指定してやる必要がある。
例えば、、、
# Pod内のコンテナで shを実行したい!
$ kubectl exec -it sample-pod sh
# 複数コンテナが入ったpodで特定のコンテナでshを実行したい!
$ kubectl exec -it sample-pod -c nginx-container sh
ローカルのブラウザでコンテナに接続したい!
そういった場合は,kubectl port-forward
コマンドを利用する。
ローカルブラウザで表示したいという用途以外にも,DBクライアントから、MySQLのコンテナに接続したいといったことも考えられる。
# localhost:5000をPodの80番ポートに転送
$ kubectl port-forward sample-pod 5000:80
で http://localhost:5000/ にアクセスしてみると。。
Welcome to nginx! と書かれたwebページが表示されます。
まとめ
- Kubenetes はkubenetes master とkubenetes nodeで成り立っている。
- kubernetesには大きく五つのリソースがある。
- workloads
- Discovery & LB
- Config&Storage
- Cluster
- Metadata
- kubectl の基本コマンドの使い方
kubectl apply
kubectl get
kubectl describe
kubectl logs
kubectl exec