Game of Pods攻略(Pento編)

# Game of Pods攻略~Pento~
FileServerの構築です。
ただK8sのAPIserverに一部エラー有り


Game of Pods関連のソースコードを挙げてます
https://github.com/hayama17/Game-of-Pods
## 作りたい環境
* FileServer
    * NodePort
    * PVC
        * PV

## 動かない...
kubectlが動かない

```bash
controlplane $ kubectl get node
The connection to the server 172.17.0.44:6443 was refused - did you specify the right host or port?

controlplane $ kubectl api-resources 
NAME   SHORTNAMES   APIGROUP   NAMESPACED   KIND
The connection to the server 172.17.0.44:6443 was refused - did you specify the right host or port?
```

https://qiita.com/pnpnd1111/items/cac6f9f33a25de06e3e9
https://qiita.com/AseiSugiyama/items/8b10bf2c2968da6b9e2c
→config周りが怪しい or PortやIPアドレスが違う 

### 確認したこと
#### ポート,IP

```bash
$ iptables -L --line-numbers
```
  おかしい点は無かった
####  log

apiサーバーがおかしい事がクイズポータルから確認できるので、apiサーバーのコンテナを確認

```bash
$ docker ps -a |grep ap
## APIサーバーコンテナのIDを取得
$ docker logs コンテナID
...
Error: unable to load client CA file: open /etc/kubernetes/pki/ca-authority.crt: no such file or directory
...
```
証明書がないとエラーが出ているので証明書のあるディレクトリを確認

```bash
$ ls /etc/kubernetes/pki/
apiserver-etcd-client.crt     apiserver-kubelet-client.key  ca.crt  front-proxy-ca.crt      front-proxy-client.key
apiserver-etcd-client.key     apiserver.crt                 ca.key  front-proxy-ca.key      sa.key
apiserver-kubelet-client.crt  apiserver.key                 etcd    front-proxy-client.crt  sa.pub
```

ca-authority.crtは無くca.crtがあったのでこちらに書き換える

```bash
$ vi /etc/kubernetes/manifests/kube-apiserver.yaml

--client-ca-file=/etc/kubernetes/pki/ca-authority.crt
↓
--client-ca-file=/etc/kubernetes/pki/ca.crt
```

kubectlが動くようになった

```bash
$ kubectl get node
NAME           STATUS                     ROLES    AGE   VERSION
controlplane   Ready                      master   48m   v1.18.0
node01         Ready,SchedulingDisabled   <none>   48m   v1.18.0
```
## coreDNSのimageを変更
kubeDNSからcoreDNSへ変更するためにコンテナのイメージを変える

```bash
$ kubectl -n kube-system edit deploy coredns

image: k8s.gcr.io/kubedns:1.3.1　
↓　
image: k8s.gcr.io/coredns:1.6.7
```
## Nodeの追加
nodeの状態が「SchedulingDisabled 」となっており、Podを作れないのでPodを作れる状態=スケジュールするようにする

```bash
$ kubectl uncordon node01
```

## FileServerの構築
ほぼ前回と同じでPV→PVC→Pod→Serviceの流れで作る

### PVとPVC

```yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: data-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: /web
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  volumeName: data-pv
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
```

## Pod
前回とほぼ同じ
NodePortを使いapp: gopのNodeを外部に公開する為書き込む

```yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: gop
  name: gop-fileserver
spec:
  containers:
    - name: gop
      image: kodekloud/fileserver
      ports:
        - containerPort: 8080
      volumeMounts:
        - name: data-store
          mountPath: /web
  volumes:
    - name: data-store
      persistentVolumeClaim:
        claimName: data-pvc
```

## Service 
NodePortを書けばいい

ホスト31200→Pod8080をつなげるように書く

```yaml
apiVersion: v1
kind: Service
metadata: 
  name: gop-fs-service
spec:
  type: NodePort
  selector:
    app: gop
  ports:
    - name: gop-ports
      protocol: TCP
      nodePort: 31200
      targetPort: 8080
      port: 8080
```

## 参考文献
https://github.com/fdmsantos/game-of-pods-solutions/tree/master/Solutions/Pento%20-%20FileServer
答えだけど...

## github
https://github.com/hayama17/Game-of-Pods/tree/main/Pento