かべぎわブログ

ブログです

Vagrantでシェルスクリプト実行させる

こんなかんじ。
以下の例だとAWSCLIをインストールしてくれる。

$script = <<-SCRIPT
  sudo apt install unzip
  curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
  unzip awscliv2.zip
  sudo ./aws/install
SCRIPT

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-20.04"
  config.vm.provision "shell", inline: $script
end

VagrantのUbuntu20にminikubeをインストールするまで

なんかこんな記事ばっかり書いているような気がするけれど動かしてから云々は仕事用のwikiに書いているのです。

Vagrant

Vagrantfileはこんなかんじ。

Vagrant.configure("2") do |config|
  config.vm.box = "bento/ubuntu-20.04"
  
  config.vm.provider "virtualbox" do |v|
    v.memory = 8192
    v.cpus = 4
  end
end

起動して接続

vagrant up
vagrant ssh

Ubuntuのなか

minikubeのインストール

インストールして

 curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64   && chmod +x minikube

配置

sudo mkdir -p /usr/local/bin/
 sudo install minikube /usr/local/bin/

dockerのインストール

これのとおりやる。

docs.docker.com

dockerグループへの追加

これのとおりやる。

docs.docker.com

確認

うごきましたね。

vagrant@vagrant:~$ minikube start
* minikube v1.13.0 on Ubuntu 20.04 (vbox/amd64)
* Automatically selected the docker driver
* Starting control plane node minikube in cluster minikube
* Pulling base image ...
* Downloading Kubernetes v1.19.0 preload ...
    > preloaded-images-k8s-v6-v1.19.0-docker-overlay2-amd64.tar.lz4: 486.28 MiB
* Creating docker container (CPUs=2, Memory=2200MB) ...
* Preparing Kubernetes v1.19.0 on Docker 19.03.8 ...
* Verifying Kubernetes components...
* Enabled addons: default-storageclass, storage-provisioner
* kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'
* Done! kubectl is now configured to use "minikube" by default
vagrant@vagrant:~$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

istio-proxyがinjectされちゃうせいでjobが終わらない

概要

タイトルのとおり。
istio-proxyがauto-injectされちゃうような構成というかサイドカー構成だと、JobやCronJobを実行したとき、いつまでたってもCompletedにならなかったりする。

$ kubectl get pods
NAME                             READY   STATUS      RESTARTS   AGE
hello-1598853420-5stdh           1/2     Running     0          3m39s
hello-1598853480-sfjds           1/2     Running     0          2m39s
hello-1598853540-dpvrm           1/2     Running     0          98s

なんでそうなるのか

Jobを実行するコンテナの方は正常終了していたとしても、サイドカーコンテナ(この場合istio-proxy)はそれを検知せず、実行し続けてしまう。

Istio環境での解決策

metadataに以下の様にtemplateにmetadata.annotations.sidecar.istio.io/inject: "false"を設定してあげる。

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        metadata:
          annotations:
            sidecar.istio.io/inject: "false"
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: Never

そうすると当然Jobが実行されるコンテナしか動作しないためCompletedになる。

$ kubectl get pods
NAME                             READY   STATUS      RESTARTS   AGE
hello-1598853600-dz7vj           0/1     Completed   0          24s

おわりに

これはIstioではなく、k8s自体の問題。
Issueはあがっているみたいなので改善されるとよいですね。