ytooyamaのブログ

サーバ構築とか、仕事で発見したこととか、趣味のこととかを書いています。

CentOS 7やCentOS Stream 8でMinikubeを使う

CentOS 7やCentOS Stream 8でminikubeを使うには次のようにセットアップしていきます。

  1. CentOSをインストールする
  2. CentOSにminikubeを使ってKubernetesをデプロイするための環境を用意する(このページのLinuxに掲載されているドライバーが使える)。
  3. minikubeをインストールする
  4. minikbe startする
  5. kubectlをインストールする)

ところが、CentOS 7ではディストリビューション標準のdockerパッケージを使うと問題が発生します。

CentOS 7で起きる「Template parsing error: template: :1: unexpected "=" in operand」について

ただ、CentOS 7でインストールできるDocker 1.13.1.xをインストールしてminikube startしたら次のようなエラーが発生しました。 この問題の原因はGolangのバージョンの差異による演算子の解釈の違いが原因だそうです。

プルリクエストも上がっているようです。

前のIssueから1.13.1が使えるようになることはなさそうなので、CentOS 7でどうしてもMinikubeを使いたい場合は、Docker Engineをインストールした方が良さそうです。

Docker 20.10からはCentOS 8もDockerを使えるようになったので、同じ手順で導入できます。現状のCentOS Stream 8も、同じ手順でDocker 20.10.4をインストールできました。

$ minikube start --cni=flannel
😄  Centos 7.9.2009 上の minikube v1.17.1
✨  設定を元に、 docker ドライバを使用します
👍  コントロールプレーンのノード minikube を minikube 上で起動しています
🚜  Pulling base image ...
💾  Kubernetes v1.20.2 のダウンロードの準備をしています
    > preloaded-images-k8s-v8-v1....: 491.22 MiB / 491.22 MiB  100.00% 11.25 Mi
🔥  docker container (CPUs=2, Memory=2200MB) を作成しています...
🐳  Docker 20.10.2 で Kubernetes v1.20.2 を準備しています...E0301 16:39:01.789214    2037 start.go:99] Unable to get host IP: network inspect: docker network inspect minikube --format "{"Name": "{{.Name}}","Driver": "{{.Driver}}","Subnet": "{{range .IPAM.Config}}{{.Subnet}}{{end}}","Gateway": "{{range .IPAM.Config}}{{.Gateway}}{{end}}","MTU": {{if (index .Options "com.docker.network.driver.mtu")}}{{(index .Options "com.docker.network.driver.mtu")}}{{else}}0{{end}},{{$first := true}} "ContainerIPs": [{{range $k,$v := .Containers }}{{if $first}}{{$first = false}}{{else}}, {{end}}"{{$v.IPv4Address}}"{{end}}]}": exit status 64
stdout:

stderr:
Template parsing error: template: :1: unexpected "=" in operand
E0301 16:39:01.790067    2037 out.go:330] unable to execute Failed to setup kubeconfig: network inspect: docker network inspect minikube --format "{"Name": "{{.Name}}","Driver": "{{.Driver}}","Subnet": "{{range .IPAM.Config}}{{.Subnet}}{{end}}","Gateway": "{{range .IPAM.Config}}{{.Gateway}}{{end}}","MTU": {{if (index .Options "com.docker.network.driver.mtu")}}{{(index .Options "com.docker.network.driver.mtu")}}{{else}}0{{end}},{{$first := true}} "ContainerIPs": [{{range $k,$v := .Containers }}{{if $first}}{{$first = false}}{{else}}, {{end}}"{{$v.IPv4Address}}"{{end}}]}": exit status 64
stdout:

stderr:
Template parsing error: template: :1: unexpected "=" in operand
: template: Failed to setup kubeconfig: network inspect: docker network inspect minikube --format "{"Name": "{{.Name}}","Driver": "{{.Driver}}","Subnet": "{{range .IPAM.Config}}{{.Subnet}}{{end}}","Gateway": "{{range .IPAM.Config}}{{.Gateway}}{{end}}","MTU": {{if (index .Options "com.docker.network.driver.mtu")}}{{(index .Options "com.docker.network.driver.mtu")}}{{else}}0{{end}},{{$first := true}} "ContainerIPs": [{{range $k,$v := .Containers }}{{if $first}}{{$first = false}}{{else}}, {{end}}"{{$v.IPv4Address}}"{{end}}]}": exit status 64
stdout:

stderr:
Template parsing error: template: :1: unexpected "=" in operand
:1:253: executing "Failed to setup kubeconfig: network inspect: docker network inspect minikube --format \"{\"Name\": \"{{.Name}}\",\"Driver\": \"{{.Driver}}\",\"Subnet\": \"{{range .IPAM.Config}}{{.Subnet}}{{end}}\",\"Gateway\": \"{{range .IPAM.Config}}{{.Gateway}}{{end}}\",\"MTU\": {{if (index .Options \"com.docker.network.driver.mtu\")}}{{(index .Options \"com.docker.network.driver.mtu\")}}{{else}}0{{end}},{{$first := true}} \"ContainerIPs\": [{{range $k,$v := .Containers }}{{if $first}}{{$first = false}}{{else}}, {{end}}\"{{$v.IPv4Address}}\"{{end}}]}\": exit status 64\nstdout:\n\nstderr:\nTemplate parsing error: template: :1: unexpected \"=\" in operand\n" at <index .Options "com.docker.network.driver.mtu">: error calling index: index of untyped nil - returning raw string.


❌  Exiting due to GUEST_START: Failed to setup kubeconfig: network inspect: docker network inspect minikube --format "{"Name": "{{.Name}}","Driver": "{{.Driver}}","Subnet": "{{range .IPAM.Config}}{{.Subnet}}{{end}}","Gateway": "{{range .IPAM.Config}}{{.Gateway}}{{end}}","MTU": {{if (index .Options "com.docker.network.driver.mtu")}}{{(index .Options "com.docker.network.driver.mtu")}}{{else}}0{{end}},{{$first := true}} "ContainerIPs": [{{range $k,$v := .Containers }}{{if $first}}{{$first = false}}{{else}}, {{end}}"{{$v.IPv4Address}}"{{end}}]}": exit status 64
stdout:

stderr:
Template parsing error: template: :1: unexpected "=" in operand


😿  If the above advice does not help, please let us know: 
👉  https://github.com/kubernetes/minikube/issues/new/choose

[2021/03/02 追記]

minikube 1.18.0がリリースされた。昨日ブログに書いた「template parsing issue」が修正されてたり Docker, CRI-Oのバージョンが更新されていたりいろいろ。

CentOS 7やCentOS Stream 8でMinikubeを使う手順

というわけで、問題を回避しつつ動かすための手順例です。 2021年3月1日現在、この手順でCentOS 7.9やCentOS Stream 8でMinikubeを使ったKubernetesのデプロイが手元の環境でできたことを確認しています。

  • アップデートして再起動
# yum update
# reboot
  • Docker Engineをインストール

  • dockerユーザーグループにユーザーを追加する

# usermod -aG docker <user_name>
  • そのユーザーに切り替え
# su - <user_name>
  • Minikubeツールをダウンロード、インストール

  • MinikubeでK8sクラスターをどのドライバーを使って動かすかを設定します。Linuxの場合、Docker, KVM, VirtualBox, Podmanなどが使えます。今回はDockerを事前に入れているので、Dockerドライバーを指定します。その他のドライバーを使いたい場合はこちら

$ minikube config set driver docker
  • minikube startコマンドを実行すると、MinikubeでK8sクラスターを構築できます。いろいろなオプションがあります。

example:

$ minikube start --cni=flannel
$ kubectl get node
NAME       STATUS   ROLES                  AGE   VERSION
minikube   Ready    control-plane,master   59m   v1.20.2

$ kubectl get pod -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-74ff55c5b-dxn85            1/1     Running   0          59m
kube-system   etcd-minikube                      1/1     Running   0          59m
kube-system   kube-apiserver-minikube            1/1     Running   0          59m
kube-system   kube-controller-manager-minikube   1/1     Running   0          59m
kube-system   kube-flannel-ds-amd64-rzscm        1/1     Running   0          59m
kube-system   kube-proxy-ccq6k                   1/1     Running   0          59m
kube-system   kube-scheduler-minikube            1/1     Running   0          59m
kube-system   storage-provisioner                1/1     Running   2          59m

minikube startのいろいろなオプション

最後にminikube start実行時に使えるオプションをいくつか。全部見たい方は minikube start --helpをご覧ください。以下はよく私が使うもののみです。

現在のKubernetes安定版はKubernetes 1.20.4ですので、minikube startの実行時にバージョンを指定するとそのバージョンをデプロイできます。バージョンを指定しないとstableが入るはずなんだけどなあ。

$ minikube start --cni=flannel --kubernetes-version=v1.20.4

Calicoが良ければこう。Calicoだとネットワークポリシーが使える。

$ minikube start --cni=calico --kubernetes-version=v1.20.4

デフォルトのDockerではなくてcontainerdをコンテナランタイムとして使いたければ。

$ minikube start --cni=calico --container-runtime=containerd --kubernetes-version=v1.20.4

いや、CRI-Oを使いたいんだって人は...

$ minikube start --cni=calico --container-runtime=cri-o --kubernetes-version=v1.20.4

シングルノードではなく複数ノードをテストしたければ。ただしこれはDriverで指定した環境上に、コンテナーとして動く感じになります。

$ minikube start --cni=calico --container-runtime=containerd --kubernetes-version=v1.20.4 --nodes 2

ちなみに、--cniオプションを指定しない場合はブリッジが使われるようです。Dockerの場合はdocker0がvethの親になります。他のランタイムの場合はcni0だったと思います。

このブログサイトはJavaScriptを使っていますが、読み込んでいるJavaScriptは全てはてなが提供しているものであり、筆者が設置しているものではありません。