kubernetes勉強メモ

# はじめに

kubenetesの勉強メモ

### Kubenetes

- kubernetesはコンテナのお世話係、指令係
  - コンテナがちゃんと生きているか監視する
  - もしコンテナが死んだら、回復させる。
  - 仕事をnodeさんに割り振る
  - nodeさんの能力によってコンテナを振り分ける

Kubenetes = kubenetes master + kubenetes node

##### masterの役割

- APIエンドポイントの提供→だから、kubectlが使える
- コンテナのスケジューリング、スケーリング（アクセスに応じてコンテナを増やしたりヘラいたりする）

##### nodeの役割

- そもそもなんでnodeという名前なのか？dockerhostみたいな名前でよかったのでは？
- それは、kubenetesがdocker以外のコンテナランタイムをホストにできるから
- nodeないで実際にコンテナが起動している



kubenetesには大きく五つのリソースに分かれている

1. **Workloads** ・・コンテナの実行に関するリソース
2. **Discovery&LB**・・コンテナを外部に公開するためのリソース
3. **Config&Storage**・・設定、永続化ボリュームなどに関するリソース
4. Cluter ・・セキュリティなどに関するリソース
5. medadataリソース・・・リソースを操作する系統のリソース

特に上三つはアプリ開発でよく使うリソース



### workloadsリソース

クラスタ上にコンテナを起動するために利用するリソース

俺らが直接利用するのは全部で8個ある。

- pod
- Replication controller
- replicaset
- deployment
- daemonset
- statefulset
- job
- cronjob



### Discovery&LBリソース

コンテナを外部からアクセスできるようにするために利用するリソース

俺らが利用するものは全部で２個ある。（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

```bash
$ kubectl apply -f manifestファイル名
```

マニフェストファイル名の変更の適応をしてくれる。リソースができていない時は新規作成してくれる。`kubectl create`コマンドより使い勝手が良い。

#### リソースの取得をしたい

podやdeploymentなどのリソースを取得したいという場合がある。

そういう時は`kubectl get` コマンドを利用する

```bash
#特定のリソースを見たいん場合
$ kubectl get リソース名
# 全てのリソースを見たい場合
$ kubectl get all
```

例えば、

```bash
$ 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`コマンドを利用する。



例えば、

```bash
$ 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`コマンドを使用する。

例えば、、、

```bash
# 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オプションで指定してやる必要がある。

例えば、、、

```bash
# Pod内のコンテナで　shを実行したい！
$ kubectl exec -it sample-pod sh
# 複数コンテナが入ったpodで特定のコンテナでshを実行したい！
$ kubectl exec -it sample-pod -c nginx-container sh
```



### ローカルのブラウザでコンテナに接続したい！

そういった場合は,`kubectl port-forward`コマンドを利用する。

ローカルブラウザで表示したいという用途以外にも,DBクライアントから、MySQLのコンテナに接続したいといったことも考えられる。

```bash
#  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`

# 参考

- https://thinkit.co.jp/article/13542