まずはKubernetesを立てる

とにもかくにもKubernetesを立てる。
自動化のためにSaltを選択。

いけるとこまで手元のALIENWAREノートPCで頑張る。
メモリ16GBでいけるとこまでいく。


確認バージョン:

# salt --version
  salt 2016.11.3 (Carbon)

# kubectl --version
  Kubernetes v1.5.2


まずはVagrant

PCにVirtualBoxを入れてVagrantを入れる。

作るVM下記。

名前 IPアドレス 備考
salt-master 192.168.66.21 Saltマスター用
kube-master1 192.168.66.22 Kubernetesマスター用
その内冗長構成にしたい
kube-minion1 192.168.66.24 Kubernetesミニオン
kube-minion2 192.168.66.25 Kubernetesミニオン


PCのどっかに下記のフォルダを作り、Vagrantfileを配置していく。

vagrant
  |- kube-master1
  |- kube-minion1
  |- kube-minion2
   - salt-master

下記のファイルを作っていく。

vagrant/salt-master/Vagrantfileファイル
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
  config.ssh.insert_key = false

  config.vm.provider "virtualbox" do |vb|
    vb.name = "salt-master"
    vb.memory = "1024"
  end

  config.vm.hostname = "salt-master"
  config.vm.network :forwarded_port, guest: 22, host: 2221, id: "ssh", auto_correct: true
  config.vm.network "private_network", ip: "192.168.66.21"
end

load "../yum_Vagrantfile" if File.exist?("../yum_Vagrantfile")
load "../cmd_Vagrantfile" if File.exist?("../cmd_Vagrantfile")
load "../salt_master_Vagrantfile" if File.exist?("../salt_master_Vagrantfile")
vagrant/kube-master1/Vagrantfileファイル
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
  config.ssh.insert_key = false

  config.vm.provider "virtualbox" do |vb|
    vb.name = "kube-master1"
    vb.memory = "2048"
  end

  config.vm.hostname = "kube-master1"
  config.vm.network :forwarded_port, guest: 22, host: 2222, id: "ssh", auto_correct: true
  config.vm.network "private_network", ip: "192.168.66.22"
end

load "../yum_Vagrantfile" if File.exist?("../yum_Vagrantfile")
load "../cmd_Vagrantfile" if File.exist?("../cmd_Vagrantfile")
load "../salt_minion_Vagrantfile" if File.exist?("../salt_minion_Vagrantfile")
vagrant/kube-minion1/Vagrantfileファイル

vagrant/kube-minion1/Vagrantfileもホスト名とIPアドレスとホストのポート以外は一緒)

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
  config.ssh.insert_key = false

  config.vm.provider "virtualbox" do |vb|
    vb.name = "kube-minion1"
    vb.memory = "2048"
  end

  config.vm.hostname = "kube-minion1"
  config.vm.network :forwarded_port, guest: 22, host: 2224, id: "ssh", auto_correct: true
  config.vm.network "private_network", ip: "192.168.66.24"
end

load "../yum_Vagrantfile" if File.exist?("../yum_Vagrantfile")
load "../cmd_Vagrantfile" if File.exist?("../cmd_Vagrantfile")
load "../salt_minion_Vagrantfile" if File.exist?("../salt_minion_Vagrantfile")
vagrant/yum_Vagrantfileファイル

好みでパッケージ入れる。

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: <<-SHELL
    yum update -y
    yum install -y net-tools sysstat iotop iftop vim tmux lsof bind-utils strace tcpdump psmisc wget git bash-completion
    cp /usr/share/doc/tmux-1.8/examples/vim-keys.conf /root/.tmux.conf
    sed -e '$ a set -g prefix C-g' -i /root/.tmux.conf
    sed -e '$ a unbind C-b' -i /root/.tmux.conf

    yum install -y epel-release
    yum clean all
  SHELL
end
vagrant/cmd_Vagrantfileファイル

叩いておきたいコマンドがあったらを書いておく。

Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: <<-SHELL
    systemctl disable NetworkManager
  SHELL
end
vagrant/salt_master_Vagrantfileファイル
Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: <<-SHELL
    yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm
    yum clean all

    yum install -y salt-master
    sed -e '$ a log_level_logfile: info' -i /etc/salt/master

    sed -e '$ a default_include: master.d/*.conf' -i /etc/salt/master
    mkdir /etc/salt/master.d
    touch /etc/salt/master.d/nodegroups.conf
    echo -e "nodegroups:\\n  kube-master: 'kube-master*'\\n  kube-minion: 'kube-minion*'" > /etc/salt/master.d/nodegroups.conf

    sed -e "$ a file_roots:\\n  base:\\n    - /srv/salt" -i /etc/salt/master
    mkdir /srv/salt
    touch /srv/salt/top.sls
    touch /srv/salt/default.sls

    sed -e "$ a pillar_roots:\\n  base:\\n    - /srv/pillar" -i /etc/salt/master
    mkdir /srv/pillar
    touch /srv/pillar/top.sls
    touch /srv/pillar/default.sls

    systemctl start salt-master
    systemctl enable salt-master

    shutdown -r now
  SHELL
end
vagrant/salt_minion_Vagrantfileファイル
Vagrant.configure("2") do |config|
  config.vm.provision "shell", inline: <<-SHELL
    yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-1.el7.noarch.rpm
    yum clean all

    yum install -y salt-minion
    sed -e '$ a master: salt-master' -i /etc/salt/minion
    sed -e '$ a 192.168.66.21 salt-master' -i /etc/hosts
    systemctl start salt-minion
    systemctl enable salt-minion
    shutdown -r now
  SHELL
end

salt-master -> kube-master1,kube-minion1,kube-minion2
の順で vagrant upして VM作る。


Kubernetes立てる

salt-masterで実行
salt-minionの公開鍵を承認。
# salt-key -L
# salt-key -A

# cat /etc/salt/master.d/nodegroups.conf
  nodegroups:
      kube-master: 'kube-master*'
      kube-minion: 'kube-minion*'

Saltでの疎通を確認
# salt -N 'kube-master' test.ping
  kube-master1:
      True


Stateファイルの配置

# cd /srv/salt/
# git clone https://github.com/YasuhiroOsajima/salt_kubernetes.git


デプロイ

# salt -N 'kube-master' state.sls salt_kubernetes/deploy_kube-master saltenv=base
# salt -N 'kube-minion' state.sls salt_kubernetes/deploy_kube-minion saltenv=base

デプロイされたか確認。
# salt "*" state.request


状況を確認

kube-master1で、

# kubectl get node
  NAME           STATUS     AGE
  kube-minion1   Ready      14m
  kube-minion2   Ready      13m

Saltを初めて使ったけど、Ansibleみたいに処理経過がコンソールに出てこないから、なんか怖い。
出るように設定できるのかもしれないけど、「Salt」で検索すると塩のことばかり引っかかってきて心が折れた。
「SaltStack」で検索しないといけないけど、ツール自体の名前は「Salt」なのよね、たしか。


次は Kubernetesに ReplicaSetを(また Saltから……)立てて、手始めに Tomcatの辺りから作っていきたいと思う。