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

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

# 手順
## 1. EC2を立ち上げる
- keypairを作成する (chmod 600 xxx.pemを忘れずに)
- EC2を3台立ち上げる (以下の設定以外は特に変更不要。わかりやすさを重視してVPCはdefault vpcを使う)

|Key|Value|補足|
|:--|:--|:--|
|AMI|Ubuntu 16.04|kubeadm推奨OS|
|Instance Type|t3.medium|kubeadmで2GB以上推奨|
|Security Group|default|同SG間はフル解放されているため|

- 作成したEC2の1台のタグに `Name:master` を付与する
- 残りのEC2の2台のダグに `Name:worker` を付与する
- Security Group: defaultの22(SSH用),30080(Service公開用)を自分のIPだけ開放する

## 2. masterにsshしてkubeadmをセットアップする
#### dockerをインストールする

```:master
sudo su -
apt-get update && apt-get install -y docker.io=18.06.1-0ubuntu1.2~16.04.1
systemctl enable docker.service
```

#### kubeadmをインストールする

```:master
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
```

#### kubeadmをセットアップし、kubeconfigを設定する

```:master
# kubeadm init 実行後に出てくる kubeadm join コマンドを記録しておく
kubeadm init --pod-network-cidr=192.168.0.0/16

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

#### CNI(calico)をインストールする

```:master
kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
```

## 3. workerにsshしてkubeadmをセットアップし、masterにjoinする
#### dockerをインストールする

```:worker
sudo su -
apt-get update && apt-get install -y docker.io=18.06.1-0ubuntu1.2~16.04.1
systemctl enable docker.service
```

#### kubeadmをインストールする

```:worker
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
```

#### masterにjoinする

```:worker
# masterで kubeadm init 実行時のjoinコマンドをコピペする
kubeadm join <ip>:6443 --token xxx123.aaaaaaaaaaaaaaaa --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

# 4. masterでkubectlコマンドを操作する

```:master
$ kubectl get nodes
NAME               STATUS     ROLES    AGE     VERSION
ip-172-31-19-222   Ready      <none>   12s     v1.13.4
ip-172-31-25-223   NotReady   <none>   5s      v1.13.4
ip-172-31-26-53    Ready      master   3m16s   v1.13.4
```

```:master
$ kubectl get pod --all-namespaces
NAMESPACE     NAME                                      READY   STATUS    RESTARTS   AGE
kube-system   calico-node-2l4cb                         2/2     Running   0          53s
kube-system   calico-node-8tztv                         2/2     Running   0          59s
kube-system   calico-node-sxbcv                         2/2     Running   0          78s
kube-system   coredns-86c58d9df4-f7qbs                  1/1     Running   0          3m45s
kube-system   coredns-86c58d9df4-tpgh6                  1/1     Running   0          3m45s
kube-system   etcd-ip-172-31-26-53                      1/1     Running   0          2m46s
kube-system   kube-apiserver-ip-172-31-26-53            1/1     Running   0          2m56s
kube-system   kube-controller-manager-ip-172-31-26-53   1/1     Running   0          3m8s
kube-system   kube-proxy-kgmjn                          1/1     Running   0          53s
kube-system   kube-proxy-tcs8z                          1/1     Running   0          59s
kube-system   kube-proxy-xwhrg                          1/1     Running   0          3m45s
kube-system   kube-scheduler-ip-172-31-26-53            1/1     Running   0          3m2s
```

```:master
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: 2 # tells deployment to run 2 pods matching the template
  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
```

```:master
$ kubectl get pod,deployment
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-76bf4969df-bcvd4   1/1     Running   0          48s
pod/nginx-deployment-76bf4969df-hcjsc   1/1     Running   0          48s

NAME                                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/nginx-deployment   2/2     2            2           48s
```