Operator, Podmanが使える環境を構築する

# Fedoraの設定

```bash
sudo systemctl set-default multi-user.target
sudo systemctl enable sshd
sudo yum -y update
sudo yum -y groupremove LibreOffice
```

# Podmanを使ってみる

CentOS 8 で導入される Podman は 2019/11/9 現在では v1.0.5 となっているが、このバージョンで Podman の [Getting Started](https://podman.io/getting-started/) は rootless コンテナでポート・バインディングができないとのこと

```bash
$ podman run -dt -p 8080:8080/tcp -e HTTPD_VAR_RUN=/var/run/httpd -e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d                   -e HTTPD_MAIN_CONF_PATH=/etc/httpd/conf                   -e HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/                   registry.fedoraproject.org/f27/httpd /usr/bin/run-httpd
port bindings are not yet supported by rootless containers
```

v1.1.0からは可能とのことだが、ソースコードを自分でビルドするのは避けたかったので、 Fedora を使うことにする。
https://podman.io/releases/2019/02/26/podman-release-v1.1.0.html

Fedora 31 の場合は v1.6.2 が使え、上記の`run`コマンドが成功した。

```bash
$ podman version
Version:            1.6.2
RemoteAPI Version:  1
Go Version:         go1.13.1
OS/Arch:            linux/amd64
```

# Dockerの導入(Minikube用)

```bash
# インストール
sudo yum -y install docker
# サービス登録内容の変更
# --host=fd://を--host=unix:///var/run/docker.sockに変える
# --exec-opt native.cgroupdriver=systemdを--exec-opt native.cgroupdriver=cgroupfsに変える
sudo vi /usr/lib/systemd/system/docker.service
sudo systemctl daemon-reload
# GRUB_CMDLINE_LINUXの末尾にsystemd.unified_cgroup_hierarchy=0を付ける
sudo vi /etc/sysconfig/grub
# grubの設定反映
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# 再起動
sudo reboot
```

systemdで起動

```bash
sudo systemctl start docker
sudo systemctl enable docker
```

# Minikubeの導入・起動

```bash
sudo swapoff -a
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
# minikubeをホストオンリーアダプターのIPアドレスに設定する
sudo vi /etc/hosts
sudo hostname minikube
sudo /usr/local/bin/minikube start --vm-driver=none

# セキュリティ的に問題があるがとりあえず一般ユーザーでkubectlを実行できるようにする
sudo chmod 555 /root
sudo chmod 644 /root/.minikube/client.key
sudo chmod 644 /root/.kube/config
export KUBECONFIG=/root/.kube/config
```


# operator-sdkの導入

こちらに記載の通り
https://github.com/operator-framework/operator-sdk/blob/master/doc/user/install-operator-sdk.md
https://github.com/operator-framework/operator-sdk/blob/master/doc/helm/user-guide.md

```bash
export RELEASE_VERSION=v0.12.0
curl -LO https://github.com/operator-framework/operator-sdk/releases/download/${RELEASE_VERSION}/operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
chmod +x operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu && sudo mkdir -p /usr/local/bin/ && sudo cp operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu /usr/local/bin/operator-sdk && rm operator-sdk-${RELEASE_VERSION}-x86_64-linux-gnu
```


# Operatorを起動する

ここではDockerを利用しているが`operator-sdk build`に`--image-builder podman`を付けることで、podmanを使ったビルドになる。

```bash
operator-sdk new nginx-operator --api-version=example.com/v1alpha1 --kind=Nginx --type=helm
cd nginx-operator
sudo operator-sdk build nginx-operator:v0.0.1
sudo docker images
sed -i 's|REPLACE_IMAGE|nginx-operator:v0.0.1|g' deploy/operator.yaml
sed -i 's|Always|IfNotPresent|g' deploy/operator.yaml
kubectl create -f deploy/service_account.yaml
kubectl create -f deploy/role.yaml
kubectl create -f deploy/role_binding.yaml
kubectl create -f deploy/operator.yaml
kubectl apply -f deploy/crds/example.com_nginxes_crd.yaml
kubectl get crd
```

# クラスター外でOperatorを起動する

```bash
sudo mkdir -p /opt/helm/helm-charts
sudo ln -s $PWD/helm-charts/nginx /opt/helm/helm-charts/nginx
operator-sdk up local
```

# Custom Resourceをデプロイする

別シェルを起動

```bash
cd nginx-operator

# Custom Resourceの作成
kubectl apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml
kubectl get pod

# replicaCountなどの値を変更する
vi deploy/crds/example.com_v1alpha1_nginx_cr.yaml
kubectl apply -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml
kubectl get pod
```

# 作ったリソースを削除

```bash
kubectl delete -f deploy/crds/example.com_v1alpha1_nginx_cr.yaml
kubectl delete -f deploy/operator.yaml
kubectl delete -f deploy/role_binding.yaml
kubectl delete -f deploy/role.yaml
kubectl delete -f deploy/service_account.yaml
kubectl delete -f deploy/crds/example.com_nginxes_crd.yaml
```