[JAWS-UG KANSAI ハンズオン資料] Kubernetesを運用してみよう！企画#2 〜Kubernetes On EC2を壊してみよう〜

# 注意事項
本資料は [JAWS-UG KANSAI Kubernetesを運用してみよう！企画#1 〜Kubernetes On EC2を壊してみよう〜](https://jawsugosaka.doorkeeper.jp/events/93270) のハンズオン手順です。
参加条件はURL内の通りで、VPC及びEC2の基礎知識があることを前提にしているため、AWSに関する部分は簡略化しています

# 本資料の目的
Kubernetesのコントロールプレーンを落としたりセキュリティグループを閉じたりと、擬似障害を発生させその際の各種挙動を確かめます。
挙動を確認し影響範囲を知ることで各コントロールプレーンの役割を理解したり、障害時の知見を貯めることを目的にしています。

本手順ではあくまで素材置き場と下準備を中心に書いています。何をどのように落とすかまでは書いていないので、各自サンプルのコマンドを参考にビシバシ落としながら確認していきましょう。
もしこっちの方が良いよ。というものがあればコメントください。

# 前提
- [前回のハンズオンの内容を元に](https://qiita.com/shogomuranushi/items/b2e079488d6cd3610981)
    - Kubernetes Masterを起動している
    - Kubernetes Worker Nodeを1台起動している
    - kubeconfigを設定済み
    - ローカルのPCから22, 30080ポートを開放済み

# 下準備
## 1. アプリケーションへの影響確認
以下のコマンドを実行し、Serviceを作成します。
後ほど壊した時のインターネットからアプリケーションへの疎通が取れるかを確認用です。

```
cat <<EOF > deployment.yaml 
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
EOF
kubectl apply -f deployment.yaml

cat <<EOF > service.yaml 
kind: Service
apiVersion: v1
metadata:
  name: nginx-service
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: "TCP"
    port: 8080
    targetPort: 80
    nodePort: 30080
EOF
kubectl apply -f service.yaml
```

以下のコマンドをローカルのPCから実行し、常時ステータスを監視します。
200が返ってこない場合は、Serviceへの疎通に影響が出ています。

```:
while sleep 1; do echo "$(date) :::==> $(curl -m 3 -LI http://<Your IP>:30080/ -o /dev/null -w '%{http_code}\n' -s)" ; done;
```

## 2. KuberntesのAPIへの影響確認
API Serverなどを壊した際に一度Deploymentなどを作ってみます。
どのような挙動をするか確認しましょう。

### リソースの作成、削除
```
cat <<EOF > nginx-tmp.yaml 
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
  name: nginx-tmp
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
EOF
kubectl apply -f nginx-tmp.yaml
kubectl delete -f nginx-tmp.yaml
```
### KubernetesのAPIへのリクエスト
正常であればPodの一覧が、異常であれば応答が返ってきません。

```
kubectl get pods
```

## 3. Podなどへの影響
正常動作であれば、PodやNodeの場合はRunning、Deploymentの場合は 1/1 などになっているはずです。

```
kubectl get nodes,service,deployment,replicaset,pods --all-namespaces
```

# さぁ、壊していきましょう
## 見たいポイント
これ以外でもOKです。

- 稼働しているアプリケーションに影響はあるか
- どれくらいで（自動）復旧するか
- 何ができなくなるのか

## 対象
これ以外でもOKです。
これ以外に当日やったことを追記予定です。

- kube-system系の停止
    - kube-apiserver
    - kube-controller-manager
    - kube-scheduler
    - etcd
    - dns (1Pod → 2Pod）
- Workerのkubeletを停止
- その他
    - セキュリティグループを閉じる
    - SSL証明書の有効期限を短く

## kube-apiserver を停止
### 停止
```
mv /etc/kubernetes/manifests/kube-apiserver.yaml /tmp/
mv /tmp/kube-apiserver.yaml /etc/kubernetes/manifests/
```
### 試したこと
```
$ kubectl get pod
The connection to the server 172.31.11.148:6443 was refused - did you specify the right host or port?
```
### 結果
もちろん API Server へのリクエストが受け付けなくなったので、kubectl get podとか何も受け付けなくなった。

しかし、Kubernetes上へのアプリケーションに影響が出ていた。

```
2019年 7月 4日 木曜日 20時39分27秒 JST :::==> 200
2019年 7月 4日 木曜日 20時39分29秒 JST :::==> 000
2019年 7月 4日 木曜日 20時39分30秒 JST :::==> 000
2019年 7月 4日 木曜日 20時39分31秒 JST :::==> 200
2019年 7月 4日 木曜日 20時39分33秒 JST :::==> 000
```
### 推測
調べると上の手順では「Node Portを使用」しており、「2台のNode」を利用していたため、一旦Node Portで受けた後に他のNodeへリクエストを投げる際にAPI Serverにアクセスしているため、API Serverへのリクエストを受け付けられず失敗していたと推測。

1台で稼働させると問題なかったので、1台では転送処理はされていないと思われる。
Node Portの場合はAPI Serverへのリクエストが送信されるが、Loadbalancerなどを利用するとLoad Balancer側の処理になるため影響はない。

所感：
- OperatorとかでKubernetesで何でもかんでもやっちゃうと、API Server死んだらサービス全死亡みたいなことが起こりうるのでは？



## scheduler を停止
### 停止
```
mv /etc/kubernetes/manifests/kube-scheduler.yaml /tmp/
mv /tmp/kube-scheduler.yaml /etc/kubernetes/manifests/
```
### 試したこと
### 結果
### 推測

## controller-manager を停止
### 停止
```
mv /etc/kubernetes/manifests/kube-controller-manager.yaml /tmp/
mv /tmp/kube-controller-manager.yaml /etc/kubernetes/manifests/
```
### 試したこと
### 結果
### 推測

## etcd を停止
### 停止
```
mv /etc/kubernetes/manifests/etcd.yaml /tmp/
mv /tmp/etcd.yaml /etc/kubernetes/manifests/
```
### 試したこと
### 結果
### 推測

## セキュリティグループを閉じる
### 試したこと
- Master - Worker間
- Worker - Worker間

参考：[必須ポートの確認](https://kubernetes.io/ja/docs/setup/independent/install-kubeadm/#%E5%BF%85%E9%A0%88%E3%83%9D%E3%83%BC%E3%83%88%E3%81%AE%E7%A2%BA%E8%AA%8D)
### 結果
### 推測

## SSL証明書の有効期限を短く
### 試したこと
### 結果
### 推測