Microk8sとkubernetesの使い方 Fedoraのトラブルシューティング、ssh secret、dns設定付


### 基本
[Jobs](https://kubernetes.io/ja/docs/concepts/workloads/controllers/job/)
[Run a Stateless Application Using a Deployment](https://kubernetes.io/docs/tasks/run-application/run-stateless-application-deployment/)
[Run a Single-Instance Stateful Application](https://kubernetes.io/docs/tasks/run-application/run-single-instance-stateful-application/)
[Expose Pod Information to Containers Through Files](https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/)
[Create a MicroK8s cluster](https://microk8s.io/docs/clustering)
[Add-on dns](https://microk8s.io/docs/addon-dns)

Dockerfile
[git/build.sh at master · alpine-docker/git](https://github.com/alpine-docker/git/blob/master/build.sh)

### 導入

[UbuntuにMicroK8sを導入する](https://qiita.com/nykym/items/32c17bf0547be63107ac)
[useradd, usermod によるグループへの追加](https://tex2e.github.io/blog/linux/useradd-usermod)

```
sudo snap install microk8s --classic
```
でインストール
```
sudo usermod -aG microk8s me
sudo usermod -aG docker me
```
ついでにsudoなしでも使えるようにしておこう
```
microk8s dashboard-proxy
```
でWebUIにアクセスできる

snapを利用するのでその対処
[Installing snap on Fedora](https://snapcraft.io/docs/installing-snap-on-fedora)



### Dockerは容量喰うのでその対処
Microk8sではそんなに有効じゃないかも
```/etc/docker/daemon.json
{
  "data-root": "/mnt/docker-data"
}
```
[Docker daemon configuration overview](https://docs.docker.com/config/daemon/)
[ docker imageの保存先を変更する](https://rikeiin.hatenablog.com/entry/2019/09/13/115611)
[Change Docker root directory /var/lib/docker to another location](https://linuxconfig.org/how-to-move-docker-s-default-var-lib-docker-to-another-directory-on-ubuntu-debian-linux)

### サンプル

```
kind: Job
apiVersion: batch/v1
metadata:
  name: git-test72
  labels:
    app: git-test
spec:
  backoffLimit: 1
  template:
    spec:
      containers:
        - name: git-test
          image: localhost:32000/my-git
          command:
            - /bin/sh
            - '-c'
            - git clone git@github.com:Whitecat6142/Whitecat6142.git && cat Whitecat6142/README.md
          volumeMounts:
          - name: foo
            mountPath: "/root/.ssh"
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
        - 8.8.8.8
      restartPolicy: Never
      volumes:
      - name: foo
        secret:
          secretName: my-secret
          defaultMode: 0400
```
commandはJob側で指定する(中身はArray)

```
kind: Secret
apiVersion: v1
metadata:
  name: my-secret
data:
  config: SG9zdCBnaXRodWIuY29tCiBJZGVudGl0eUZpbGUgL3Jvb3QvLnNzaC9pZF9yc2E=
  id_rsa: >-
    base64
  id_rsa.pub: >-
    base64
  known_hosts: >-
    base64
type: Opaque
```

```
ssh-keyscan github.com >> ./known_hosts
microk8s kubectl create secret generic my-secret --from-file=id_rsa=./id_rsa --from-file=id_rsa.pub=./id_rsa.pub --from-file=known_hosts=./known_hosts --from-file=config=./config
```

```./config
Host github.com
    IdentityFile /root/.ssh/id_rsa
```

[kubectlを使用してSecretを管理する](https://kubernetes.io/ja/docs/tasks/configmap-secret/managing-secret-using-kubectl/)
[Secret](https://kubernetes.io/ja/docs/concepts/configuration/secret/)
[設定ファイルを使用してSecretを管理する](https://kubernetes.io/ja/docs/tasks/configmap-secret/managing-secret-using-config-file/)
[Secretsで安全にクレデンシャルを配布する](https://kubernetes.io/ja/docs/tasks/inject-data-application/distribute-credentials-secure/)
[kubectlチートシート](https://kubernetes.io/ja/docs/reference/kubectl/cheatsheet/)
[Working with kubectl](https://microk8s.io/docs/working-with-kubectl)
[Creating ssh secrets key file in kubernetes](https://stackoverflow.com/questions/39568412/creating-ssh-secrets-key-file-in-kubernetes)
[A few common k8s secret types examples](https://external-secrets.io/v0.5.9/guides-common-k8s-secret-types/)

defaultModeを指定しない場合セキュリティで弾かれるので注意

JobにSecretをVolumeとしてマウントすることでsshキーを使用可能にしています
Secret内部には.sshフォルダのpubkey,privkey,known hosts,configが入っています

```
FROM ubuntu:latest

RUN apt-get update && \
    apt install -y git ca-certificates iputils-ping && \
    rm -rf /var/lib/apt/lists/*
```
    
### Could not resolve host: github.comと出る

### 確認用
[Dockerコンテナでpingコマンドを使いたい](https://syachiku.net/docker-install-ping/)

### firewalld
homeのマスカレード+dockerの送信元+デフォルトのゾーンをdockerに
送信元0.0.0.0/24 でうまくいった 10.11.12.0/24 でもいけた
[CentOS8にDockerを入れようとして躓いた話](https://tech-blog.rakus.co.jp/entry/20200407/docker)
[firewall-cmd - add-forward-port don't work - Super User](https://superuser.com/questions/1474254/firewall-cmd-add-forward-port-dont-work)
[5.9. Port Forwarding](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/sec-port_forwarding)

### dns周り
コンテナによってはresolv.confが設定されていないのでyamlで設定している
[【docker】コンテナの hosts と resolv.conf を変更する](https://qiita.com/kiyo27/items/6d6234d3a9abb0db2cd1)
[Alpine on k8sのDNSでハマった話](https://qiita.com/corestate55/items/8cf2f713b10d0197c29e)
[microk8sハマること(Kube内のDNSが参照できない,証明書](https://qiita.com/takahyon/items/97a2373889297f8bb489)
[ubuntu19.04でpingとnslookupができなくなり、DNSサーバーを変更するのにめちゃくちゃハマった話](https://qiita.com/gkzz/items/5ac6648e87339e1dd883)
[DNS for Services and Pods](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/)
[Alpineでgit cloneができない時はDNSサーバーを変える](https://zenn.dev/neko/articles/1c04cc215b3c3da4d808)
[How I can configure my local machine to use a docker hosted dns server alonsside with ant other dns settings for specific domains?](https://serverfault.com/questions/1077783/how-i-can-configure-my-local-machine-to-use-a-docker-hosted-dns-server-alonsside)



### 自前のイメージを使いたいとき

方法1
```/etc/docker/daemon.json
{
  "insecure-registries" : ["localhost:32000"]
}
```
```sh
microk8s enable registry
```
で有効化
```sh
microk8s status
```
で確認
```sh
docker build --no-cache -t localhost:36000/my .
```
でbuild
[Working with MicroK8s’ built-in registry](https://microk8s.io/docs/registry-built-in)


方法2
```
docker run -d -p 5000:5000 --restart=always --name registry registry:2
docker build --no-cache -t my .
docker tag my localhost:5000/my
docker push localhost:5000/my
```
もある
[How to use local docker images with Minikube?](https://stackoverflow.com/questions/42564058/how-to-use-local-docker-images-with-minikube/42564191#42564191)
[Experiment with Kubernetes with a custom Docker Image](https://gist.github.com/dims/aafc4b23c6653402f056d5c185fd6cf9)