Ubuntu 18.04 のKubernetes環境を構築してみた！

この記事は、[富士通システムズウェブテクノロジー Advent Calendar](https://qiita.com/advent-calendar/2019/fsweb)の14日目の記事です。
（お約束）本記事の掲載内容は私自身の見解であり、所属する組織を代表するものではありません。

部署の業務には関係はないですが、自分の趣味でこの記事を書きました。

#必要なものについて
###VMware Workstation 15 Playerのインストール
https://www.vmware.com/jp/products/workstation-player/workstation-player-evaluation.html

###ubuntu18.04のイメージのダウンロード
https://jp.ubuntu.com/download

#仮想マシン2台の用意＆環境構築

###１、ubuntu18.04のインストール（masterノードとworkノード）

#### ①VMware Workstationでubuntu18.04のイメージを使い仮想マシンを作成します。
※仮想マシンのCPUの個数は2以上にする必要があります。
それにメモリを4GB以上にしたほうがいいと思います。
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531194/fef8c0d8-f7c0-3963-4e30-7b5fb19b13c0.png"><img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531194/9bc5eb08-7bfb-672d-326b-438d05238b0c.png">


#### ②ubuntuのsoftwareをアップデートします
「install Now」を選択します。
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531194/d9203709-31df-d4c8-7150-c08731d129ae.png">

#### ③host名の変更
※二台の仮想マシンのhost名が同じの場合、後でworkノードをmasterノードにjoinできなくなりますので、masterNodeとworkNode1に変更、変更後に再起動を行います。
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531194/eae567e2-b944-c3e1-1e2a-f9db40ade3a7.png"><img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531194/3da27742-ef6e-ef87-4742-0204b52e5f11.png">


###２、Dockerのインストール
#### ①必要なライブラリをインストール
```
$ sudo apt update 
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
```
#### ②公開鍵のインストールとフィンガープリントの確認
```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
```
#### ③Docker-ceのインストール
```
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt update
$ sudo apt install -y docker-ce=18.06.0~ce~3-0~ubuntu
```
#### ④cgroupdriverの設定
```
$ cat > /etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m"
  },
  "storage-driver": "overlay2"
}
EOF

$ mkdir -p /etc/systemd/system/docker.service.d
```
#### ⑤Dockerの再起動
```
$ systemctl daemon-reload
$ systemctl restart docker
```

###３、Kubernetesのインストール
#### ①kubernetes のキーとリポジトリの登録
```
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
```
#### ②Kubernetesのインストール
```
$ sudo apt update
$ sudo apt install -y kubeadm
```
#### ③swapをオフにします
```
$ vi /etc/fstab
```
swapに該当する行を#でコメントアウトし、再起動を行います。
<img width="50%" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531194/547e539b-a457-2e97-8573-c229f288a081.png">

#クラスターのセットアップ

###１、masterNodeのセットアップ

#### ①クラスターの生成
```
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16
```
```text:実行結果
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

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

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.177.133:6443 --token imzh6v.j1jbcrvc1z5rla31 \
    --discovery-token-ca-cert-hash sha256:455e7f5f25a92ff919748f0ae8db5e1948f64b62c20c2fe7edbd9868efe0f30d 

```
#### ②設定ファイルの配備
```
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
```

#### ③flannelを使用

```
$ sudo sysctl net.bridge.bridge-nf-call-iptables=1
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
```

※flannelを適用するために一分ぐらい時間がかかるので、しばらく待つ必要があります。

#### ④masterNodeの状態確認

```
$ kubectl get nodes
```
```text:実行結果
NAME         STATUS   ROLES    AGE     VERSION
masternode   Ready    master   2m48s   v1.17.0
``` 

###２、workNode1をmasterNodeにjoin

#### ①masterNodeで生成したコマンドでjoinします。
```
$ kubeadm join 192.168.177.133:6443 --token imzh6v.j1jbcrvc1z5rla31 \
    --discovery-token-ca-cert-hash sha256:455e7f5f25a92ff919748f0ae8db5e1948f64b62c20c2fe7edbd9868efe0f30d 
```
#### ②masterNodeでworkNode1のjoinを確認
```
$ kubectl get nodes
```
```text:実行結果
NAME         STATUS   ROLES    AGE   VERSION
masternode   Ready    master   14m   v1.17.0
worknode1    Ready    <none>   94s   v1.17.0
```
###補足:
kubernetesの環境をリセットしたい場合は下記のコマンドを使います。

```
$ kubeadm reset
```

#複数のnginxをデプロイしてみよう！

#### ①deploymentファイルの作成

```text:nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
```

`replicas`：同じコンテナを三つ立ち上げるのを指定します。
`selector`：管理するコンテナを指定します。（例だとラベルはapp: nginxのコンテナをマッチ）
`template: spec`：nginxのコンテナを起動するのを指定します。

#### ② deploymentのyamlファイルを実行

```
$ kubectl create -f nginx-deployment.yaml
```
```text:実行結果
deployment "nginx-deployment" created
```

#### ③deploymentsの確認

```
$ kubectl get deployments
```
```text:実行結果
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           105s
```

#### ④serviceファイルの作成
```text:nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: NodePort
  sessionAffinity: ClientIP
  selector:
    app: nginx
  ports:
    - port: 80
      nodePort: 30080
```
`kind`：Serviceを作成するのを指定
`nodePort`：外部アクセスする際のポートを指定

#### ⑤ serviceのyamlファイルを実行
```
$ kubectl create -f nginx-service.yaml
```
```text:実行結果
service/nginx-service created
```

#### ⑥serviceの確認

```
$ kubectl get service
```
```text:実行結果
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        120m
nginx-service   NodePort    10.96.118.142   <none>        80:30080/TCP   76s
```
```
$ kubectl get pods
```
```text:実行結果
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-54f57cf6bf-k72mv   1/1     Running   0          17m
nginx-deployment-54f57cf6bf-krj9r   1/1     Running   0          17m
nginx-deployment-54f57cf6bf-wmwsg   1/1     Running   0          17m
```

#### ⑦外部からnginxをアクセス
ステップ⑥からすでにport(`30080`)を確認できましたので、
masterNodeのIP(`192.168.177.133`)とそのportで外部マシン（ローカルPC）からアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531194/50013c24-e72e-0926-8b51-48c108aee40c.png)


#### 以上となります。


#参考
[Ubuntu 18.04 LTS にKubernetes環境をインストールする [Master / Worker]](https://qiita.com/soumi/items/5b01d88c187b678c0474)
[Ubuntu 18.04 LTS にDocker環境をインストールする](https://qiita.com/soumi/items/7736ac3aabbbe4fb474a)
[k8s 使用篇 - deployment](https://my.oschina.net/u/914655/blog/1635492)