kubernetes 基礎 -- Part 01 kubectl で context と namespace で絞って pod を全表示、詳細表示、ログ表示する
Tags: kubernetes, kubectl, k8s
Published: 2022-12-12 19:00:59


# 概要

今回扱う表示や操作できるのもの大きさを比べると、こうなっていると解釈している。

pod < svc < namespace < context < cluster < server(k8sではない)

だと解釈した。

サーバーが k8s リソースを置くところ。
クラスタが一番大きい概念。
コンテキストがクラスタ内部の一番大きな区切り。
名前空間がその次に大きな区切り。
サービスはポッドのまとまり。
ポッドは最初単位。

という解釈をした。

secret や vs はどの位置なのか不明。

node, depolyments も不明。

https://www.researchgate.net/figure/Sample-diagram-of-usage-of-K8s-resources-node-deployment-pod-PVC-and-service-in_fig4_357212022

この図によると、pod たちのまとまりが Node で
複数 Node に跨る pod たちを deployments としてまとめられるようだ。
そして各 Pod を直接 service が扱えるようだ。

---

## 参考

https://komodor.com/learn/the-ultimate-kubectl-cheat-sheet/

どうやって各リソースを操作するか詳しく書いてある。

https://www.tohoho-web.com/ex/kubernetes.html

とほほさんの k8s 入門 2023-01-24 追記

---
---

# context 

操作できる中では一番大きい単位。だいたい 1 つしか使わない？

## config get-contexts -- context を一覧表示する

そのサーバー内部にあるコンテキスト一覧

```php
kubectl config get-contexts
CURRENT   NAME        CLUSTER     AUTHINFO          NAMESPACE
*         k3d-1234   k3d-1234   admin@k3d-1234   
```

---

## use-contexts -- 現在いる context を切り替える

use-contexts

おおきいサーバーだと複数コンテキストでわけて pod たちを管理するらしい。推測。

---

## --context=hoge get po 

コンテキストの絞り込み。

hoge というコンテキストにあり、default の NameSpace にあるポッドを表示できる。

```kotlin
k --context=hoge get po
No resources found in default namespace.
```

デフォルト NameSpace になにもないとでない。

```kotlin
kubectl --context=hoge get po -n foo
NAME                                READY   STATUS    RESTARTS        AGE
hoge-api-abc123     2/2     Running   0               1d1h
```

中身が入っている NS だとうこうやって情報がでる。

---

---

# secret

用途がわりとわからん。DB のパスとか置く専用の pod につけるラベルなのだろうか？

## -n nameSpaceName get secret -- secret 一覧の表示

```php
kubectl -n some get secret
NAME TYPE DATA AGE
kubernetes.io/service-account-token   3      12d
hoge helm 1 12d
```

## ... secretName -0 yaml -- ある secret を yaml で表示する

```php
kubectl -n some get secret hoge -o yaml

123edf...
kind: Secret 
  name: helm
```

---
---

# namespace 

pod の分類。一番使う。プロジェクトごとに分類する。
これを指定せずに pod を作った場合は default という ns に紐づけられる。

## get ns --- namespace 一覧を表示する

```php
❯ kubectl get ns                                 
NAME              STATUS   AGE
default           Active   12d
kube-system       Active   12d
some              Active   12d
```

## {create,delete} ns -- namespace を作成、削除する

```php
kubectl create ns foo
kubectl delete ns foo
```

調子が悪い時は作り直す

---

## -n NameSpaceName get po

```kotlin
kubectl get po -n foo
No resources found in foo namespace.
```

名前空間で絞り込む。
大抵前段で コンテキストの絞り込みも必須。

---
---

# svc

ns よりも大きい概念。あまりわかってない。

## get svc -- svc 一覧

```php
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
```

サービスが出せる
有るかわかる
外部から叩ける IP がわかる

---
---

# vs

## get vs

```php
k --context=hoge -n foo get vs
NAME GATEWAYS HOSTS AGE
```

ゲートウェイは不明。
ホストとしてクラスタ内部で叩けるアドレスと、サーバー内部で叩けるアドレスが出せる。


---
---

# pod

k8s リソースの最小単位。アプリケーションが動いているか、おちたログはどうなっているか、などはここにアクセスする。

## get po -A -- 全ての pod を表示する

```php
kubectl get po -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system hoge-123af 1/1 Running 0 100d
something some-246bd 1/1 Running 0 10d
```

全ての namespace の pod が出せる。
何もしていしなければ context と ns は デフォルトのもので絞られている。
context と ns を横断して pod を全て出す方法はわかっていない

---

## get po -n -- ある namespace の pod のみの簡易情報をみる

```php
kubectl get po -n something
NAMESPACE NAME READY STATUS RESTARTS AGE
something some-246bd 1/1 Running 0 10d
```

-n {namespace} で namespace で絞り込める

get pod とも書ける。

---

## ... -n nameSpaceName -o yamlある namespace の pod のみの詳細情報を yaml でみる

yaml 形式で詳細情報がみれる

```php
kubectl get po -n some -o yaml
apiVersion: v1                                                                                                            
kind: Pod
namespace: some 
spec: 
  containers:
  - env: 
    - name: PASS
      value: hoge
    image: hoge-hoge.com/hoge/app-name:{gitHashTag}
```

どのコンテナから作成されて
どのコミットから作成されたイメージから作成されているかまでわかる。

---

## -n nameSpaceName describe pod podName -- ある namespace の pod のみの詳細情報を軽くみる

describe でも詳細情報がみれる。

```php
kubectl -n some describe pod podName
Name:             some-db-123-eef                                                                       
Namespace:        some      
Priority:         0  
Containers:
  some-db:
    image: hoge-hoge.com/hoge/app-name:{gitHashTag}                                                                                                     
```

このように MySQL の show コマンドっぽくも出せる。

---

## logs -n nameSpaceName podName -- podName のログをみる

ns は必須。ないと default になっちゃうからね。
pod が何を吐いているかのログをみれる。

kotlin で作った API なら、logger に出している情報を見れる。

```php
kubectl logs -n some some-db-123edf
```

----

## exec -it podName --bash -- pod を動かしているコンテナに bash で入る

実際にそのポッドに bash で入って操作ができる。

```php
kubectl -n some exec -it some-db-12af -- bash
```

---

## まとめ

config get-contexts でコンテキスト一覧を出せる。

--context=contextName でコンテキストで絞れる。
-n nameSpaceName で名前空間で絞れる。

get po -A で デフォルトコンテキストでデフォルト名前空間のポッドを全て表示できる。

describe podName でポッドの詳細情報を表示できる。

logs podName でポッドのログを表示できる。

exec --it podName -- bash でポッドに bash でアクセスできる。

---

## 伸びしろ

pod の作成、manifest の出力、manifest の適用？をやりたい

https://qiita.com/suzukihi724/items/241f7241d297a2d4a55c#1-pod%E3%82%92%E4%BD%9C%E6%88%90

k apply -f {定義のyaml?} で pod を作成するらしい

https://prefetch.net/blog/2019/10/16/the-beginners-guide-to-creating-kubernetes-manifests/

kubectl explain で manifest を作れるらしい

create deployment appName でも作れるらしい