k8s自分用チートシート

**k8s利用を停止中のため、本記事は更新していません**

見るためではなく1行コピペするための記事です。
まだk8s始めて間もないので、気力あれば追記していきます。
(今はほぼ`kubectl`についてのみの記述です)

参考資料
--------------------
- [kubectl Cheat Sheet (kubernetes.io)](https://kubernetes.io/docs/reference/kubectl/cheatsheet/)


記述の説明
--------------------
- `<variable>`: 変数です、任意の値を入力します


情報表示
--------------------
### よく使う
```sh
# 見るだけ
kubectl version                                # Client, Server Version表示(サーバ繋がってるかチェック)
kubectl get pods -A                            # Pod全部表示
kubectl describe pods -A | less                # Pod情報全部表示してlessで見る
kubectl describe nodes | less                  # Node情報全部表示してlessで見る
# Podのログ表示してlessで見る(コンテナが起動しない場合等)
kubectl logs <pod_name> -n <namespace> | less
kubectl get all -A && kubectl get nodes -A     # PodやNode等を一括表示する

# フィルタリング付き
kubectl get pods -A | awk '$4!="Running"'      # Running以外のPodを表示する
kubectl get node -A | awk '$2!="Ready"'        # Ready以外のNodeを表示する

# 状態監視
kubectl get pods -A --watch                    # 起動後のPodの変化を追う
```

### クラスタやノード等

パラメータ省略あります(Pod名やNamespaceなど)

```sh
kubectl version                  # クライアント、サーババージョン
kubectl cluster-info             # クラスタの情報
kubectl config view              # クラスタの構成情報(yaml)
kubectl get nodes                # Node
kubectl get pods                 # Pod
kubectl get services             # Service
kubectl get deployments          # Deployment
kubectl get namespaces           # Namespace

kubectl describe nodes           # Node
kubectl describe pods            # Pod
kubectl describe services        # Service
kubectl describe deployments     # Deployment
kubectl describe namespaces      # Namespace
```

リソース操作
--------------------
TODO

### Node / Pod

```sh
# Master Nodeに追加でPod割り当て可能にする
# もし他にもTaintあったら適宜 `kubectl taint node` で外す
kubectl taint node <master_node_name> node-role.kubernetes.io/master:NoSchedule-
```

### Container

```sh
# コンテナでシェルを起動する, /bin/bashが無い事もあるのでshで
kubectl exec -it <pod_name> -n <namespace> -- /bin/sh
```


状況確認の詳細化
--------------------
### クラスタ設定確認

#### RBAC(Role-Based Access Control)の有無

```sh
# "--authorization-mode=...,RBAC,..."のような出力があればRBAC設定あり
kubectl cluster-info dump | grep RBAC
```

### Pod状態

```sh
# Pod名重複しないなら -n ではなく -A 推奨(打ち込みが楽)
# 簡易的な情報で状態確認
kubectl get pods <pod_name> -n <namespace>
# 詳細な設定やイベントログで状態確認
kubectl describe pods <pod_name> -n <namespace>
# 起動からの経緯を詳細に確認
kubectl pods <pod_name> -n <namespace>
```

ファイルを作ってゆっくり見たい時用シェルスクリプト
--------------------

### Pod

#### `get`,`describe`,`logs`を全部1ファイルへ出力する
```sh
#!/bin/sh

if [ "$1" = "" -o "$2" = "" ] ; then
  exit 1
fi
POD="$1"
NAMESPACE="$2"
LOG_FILE_NAME="${POD}_${NAMESPACE}.log"
kubectl get pods $POD -n $NAMESPACE      >> $LOG_FILE_NAME && \
kubectl describe pods $POD -n $NAMESPACE >> $LOG_FILE_NAME && \
kubectl logs $POD  -n $NAMESPACE         >> $LOG_FILE_NAME
if [ `stat -c %b ${LOG_FILE_NAME}` -eq 0 ] ; then
  rm ${LOG_FILE_NAME}
else
  less ${LOG_FILE_NAME}
fi
```

使い方

```sh
./dump.sh pod-name namespace    # pod-name_namespace.log というファイルが出力されます
```

### Node

TODO

`kubectl`での操作一覧(順不同)
--------------------

`kubectl help`で見るのとあんまり変わらないので後で消すかも

```
# 情報取得系
get                 # 簡易
describe            # 詳細
logs                # 経緯の詳細
top                 # CPUやメモリのリソース消費状態

# リソース操作系
create              # 作る
delete              # 消す

# コンテナ操作系
attach              # 
exec                # コンテナ内でコマンド実行
```

クラスタ操作
--------------------

### k8sクラスタ作成スクリプト

#### Single Node + `calico`用

```sh
#!/bin/sh

NODE_NAME=$1
if [ "${NODE_NAME}" = "" ] ; then
  echo "Please input Master Node Name"
  exit 1
fi

kubectl get node ${NODE_NAME}
if [ "$?" -ne 0 ] ; then
  echo "Please verify Master Node Name"
  exit 2
fi

# for calico (Requirements)
POD_CIDR="192.168.0.0/16"

# Off the all Swap
sudo swapoff -a

# Start k8s cluster
sudo kubeadm init --pod-network-cidr=${POD_CIDR}

# Update current user k8s config for kubectl
mkdir -p $HOME/.kube
sudo cp -f /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# Create calico of CNI implementation
kubectl apply -f https://docs.projectcalico.org/v3.0/getting-started/kubernetes/installation/hosted/kubeadm/1.7/calico.yaml

# untaint Master Node for calico
kubectl taint node ${NODE_NAME} node.kubernetes.io/not-ready:NoSchedule-

# untaint Master Node
kubectl taint node ${NODE_NAME} node-role.kubernetes.io/master:NoSchedule-
```

使い方

```sh
./start-k8s.sh master-node-name
```


記事用メモ
--------------------
- 雑多になってきたら断捨離、又は別記事へ移行の予定
- カテゴリ分けが重複しがち(リソース操作 ≒ クラスタ操作)

### 更新履歴

- 2019/08/06: [状況確認の詳細化](#状況確認の詳細化)、[ファイルを作ってゆっくり見たい時用シェルスクリプト](#ファイルを作ってゆっくり見たい時用シェルスクリプト)を追記した
- 2019/08/07:
  - [よく使う](#よく使う)に**状態監視**を追記し、**見るだけ**にコマンド追記した
  - [リソース操作](#リソース操作)に[Container](#Container)を追記した
  - コピペの手間を減らすために変数`<...>`の記述があるコマンドはコメントを別の行へ移動した
- 2019/08/08:
  - [クラスタ操作](#クラスタ操作)を追記した