CentOS 7やCentOS Stream 8でminikubeを使うには次のようにセットアップしていきます。
- CentOSをインストールする
- CentOSにminikubeを使ってKubernetesをデプロイするための環境を用意する(このページのLinuxに掲載されているドライバーが使える)。
- minikubeをインストールする
- minikbe startする
- 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のバージョンが更新されていたりいろいろ。
- https://github.com/kubernetes/minikube/releases/tag/v1.18.0-beta.0
- https://github.com/kubernetes/minikube/releases/tag/v1.18.0
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でK8sクラスターをどのドライバーを使って動かすかを設定します。Linuxの場合、Docker, KVM, VirtualBox, Podmanなどが使えます。今回はDockerを事前に入れているので、Dockerドライバーを指定します。その他のドライバーを使いたい場合はこちら。
$ minikube config set driver docker
minikube start
コマンドを実行すると、MinikubeでK8sクラスターを構築できます。いろいろなオプションがあります。
example:
$ minikube start --cni=flannel
- 構築したK8s環境を操作するためのkubectlツールをインストールします。
- セットアップ完了
$ 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だったと思います。