g00ceyの技術ブログ

Kubernetes 環境をひとまずAnsibleで用意する

目次

kubernetes

Kubernetesを動かすためのサーバーを構築。
その際にAnsibleのRoleを使うが本当にこれでいいのか?ということが分からなかったので、VMでサーバーを用意してそこでK8s環境を構築を目指す。
成果物については下記のリポジトリに対して反映を行うつもりなので、下記リポジトリをベースに進めます。
g00cey/sbc-ansible: ブログで出すときに困ったのでもう公開しちゃう

結論

そもそもの結論だけど、Minikubeから初めて見るほうがいいかもね(私はやったことがないけど)
下の記事にも書いてあるけど、Ansible Galaxyで構築の大半は完了のはずだよ。

Ansible Galaxyでセットアップする際必要なものたち

  • masterノード
    • kubernetes_role: “master”
    • kubernetes_apiserver_advertise_address: 管理ノードのprivate_ip 172.16.20.3
      • ここに関しては、バグというよりは、kubectladm側が任意のNICのIPを返却する。そのため、Vagrant環境だと、NAT通信用のNICを返却してうまいことCluster環境が構築できない。
  • workerノード
    • kubernetes_role: “node”

この記事でK8sを使用してサービス提供可能状態であるかの確認までは書けませんでした。

  • この辺はMinikubeを経てK8s力がついてからやろうと思います。
  • 方針に記載しているkubernetesセットアップ用のロールを使うで問題なさそう。
    • ただ、実行前にapt updateを行うようにするプレイブック用意する
  • そもそも使用するためにはkubernetesのネットワークについての理解が必要。

方針・前提条件

方針は

  • 環境の用意は、vagrantを使用する
    • これでよかった、これいきなりPi4などのバイメタルにぶち込んだらよくわからないことになって修復が大変だった
  • 構築は、ansibleを使用する
    • これは、元々Ansibleがあったので、回避不可
  • 最終的には、Pi4に適用する
    • ここに関しては今回の記事ではやっていないし、K8s慣れるまではちょっと無理かなぁ。

また、K8s構築については、下記ロールを使用する予定。
Ansible Galaxy

環境

  • 開発環境
    • master-node ubuntu/focal
    • worker-node ubuntu/focal x 3
  • 家庭環境(今回の記事では登場しません)
    • master-node RaspberryPi4
    • worker-node
      • RaspberryPi4 x 3
      • Ubuntu Server 20.04 AMD64

実施内容

ステップとしては下記を想定しています。

  • 実験環境(VM)を用意
  • ansible作成
  • ansibleを流してみる
  • asnibleでまずい個所を直してみる
  • ansibleで作成された環境でK8sの操作を行ってみる

実験環境用意

Vagrantファイルを作成

この辺は、下記を参考にさせていただきました。
Kubernetes v1.10 クラスタをVagrantで構築したメモ - Qiita

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

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.

Vagrant.configure(2) do |config|
  config.vm.define "master-node" do |s|
    s.vm.box = "ubuntu/focal64"
    s.vm.hostname = "masternode"

    #public_ip = "192.168.1.#{i+90}"
    #s.vm.network :public_network, ip: public_ip, bridge: "en0: Ethernet"
    #if i == 1 then
    #  s.vm.network :forwarded_port, host: 8001, guest: 8001
    #end

    private_ip = "172.16.20.3"
    s.vm.network "private_network", ip: private_ip

    s.vm.provider "virtualbox" do |v|
      v.cpus = 1
      v.gui = false
      v.memory = 1048
    end
  end
  (1..3).each do |i|
    config.vm.define "workernode-#{i}" do |s|
      s.vm.box = "ubuntu/focal64"
      s.vm.hostname = "workernode-#{i}"

      #public_ip = "192.168.1.#{i+90}"
      #s.vm.network :public_network, ip: public_ip, bridge: "en0: Ethernet"
      #if i == 1 then
      #  s.vm.network :forwarded_port, host: 8001, guest: 8001
      #end

      private_ip = "172.16.20.#{i+10}"
      s.vm.network "private_network", ip: private_ip

      s.vm.provider "virtualbox" do |v|
        v.cpus = 2
        v.gui = false
        v.memory = 1024
      end
    end
  end
end

vagrant up

vagrant up
vagrant status
Current machine states:

master-node               running (virtualbox)
workernode-1              running (virtualbox)
workernode-2              running (virtualbox)
workernode-3              running (virtualbox)

This environment represents multiple VMs. The VMs are all listed
above with their current state. For more information about a specific
VM, run `vagrant status NAME`.

いけてるね。

適用対象のサーバーが見えるかを確認

Vagrantファイルを作成で作成した環境にVMを生成したマシンからアクセスできるか確認する。

luna@a300:~/tmp/kubecluster$ ping 172.16.20.3
PING 172.16.20.3 (172.16.20.3) 56(84) bytes of data.
64 bytes from 172.16.20.3: icmp_seq=1 ttl=64 time=0.668 ms
^C
--- 172.16.20.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.668/0.668/0.668/0.000 ms

luna@a300:~/tmp/kubecluster$ ping 172.16.20.11
PING 172.16.20.11 (172.16.20.11) 56(84) bytes of data.
64 bytes from 172.16.20.11: icmp_seq=1 ttl=64 time=0.578 ms

ping はOK。sshは。。。

vagrant ssh-config
Host master-node
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/luna/tmp/kubecluster/.vagrant/machines/master-node/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

Host workernode-1
  HostName 127.0.0.1
  User vagrant
  Port 2200
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/luna/tmp/kubecluster/.vagrant/machines/workernode-1/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

Host workernode-2
  HostName 127.0.0.1
  User vagrant
  Port 2201
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/luna/tmp/kubecluster/.vagrant/machines/workernode-2/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

Host workernode-3
  HostName 127.0.0.1
  User vagrant
  Port 2202
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/luna/tmp/kubecluster/.vagrant/machines/workernode-3/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

これは困りましたね。 鍵がすべて別々です。 ただ、各々の鍵のパスも得られているので、各ansibleのhost接続情報で個別に鍵を指定することで対応します。

ansibleファイル作成

組み込み予定のリポジトリをチェックアウト

g00cey/sbc-ansible: ブログで出すときに困ったのでもう公開しちゃう こちらには、ansible環境はあるので、roleのインストールを行うところまでやります。

git clone git@github.com:g00cey/sbc-ansible.git
cd sbc-ansible
./exec-ansible-galaxy-install.sh

git branch develop/kubernetes
git checkout develop/kubernetes

ansibleから接続を行うところまで確認する

各VMの情報をコピー

vagrantで生成された他の情報も併せてディレクトリにコピーしておきます。

cp -R ../.vagrant/ docker/python/key/

手動操作が入っていますが、Vagrantで固定で鍵を使用できるためにするには、確かイメージから作成しないといけないと思ったので、これで行きます。

ansibleのテスト

元ファイルあったファイルをベースを試験的にファイルを作成
※書いてて思ったのは試験的という割に準備が非常に多い気もしますが。

ansibleを実行する環境はdockerにしています。 docker-compose-test.yml

version: "3.3"

services:
  ansible:
    image: registry.localdomain/ansible
    working_dir: /home/ansible/ansible
    user: ansible
    volumes:
      - ansible-galaxy:/etc/ansible/roles
      - ./ansible:/home/ansible/ansible
#      - ./docker/python/nopass_key:/key/nopass_key
      - ./docker/python/key/.vagrant:/key/.vagrant
    env_file: .env
volumes:
  ansible-galaxy:

これは、dockerを叩くスクリプト exec-install-docker-test.sh

#!/bin/bash
docker-compose -f docker-compose-test.yml run --rm ansible ansible-playbook -i playbook/ansible-host-test.yml playbook/playbook-docker-test.yml

これはansibleの接続情報 ansible/playbook/ansible-host-test.yml

master-node:
  hosts:
    master:
      ansible_host: 172.16.20.3
      ansible_user: vagrant
      ansible_ssh_private_key_file: /key/.vagrant/machines/master-node/virtualbox/private_key
worker-node:
  hosts:
    worker-1:
      ansible_host: 172.16.20.11
      ansible_user: vagrant
      ansible_ssh_private_key_file: /key/.vagrant/machines/workernode-1/virtualbox/private_key
    worker-2:
      ansible_host: 172.16.20.12
      ansible_user: vagrant
      ansible_ssh_private_key_file: /key/.vagrant/machines/workernode-2/virtualbox/private_key
    worker-3:
      ansible_host: 172.16.20.13
      ansible_user: vagrant
      ansible_ssh_private_key_file: /key/.vagrant/machines/workernode-3/virtualbox/private_key

ansible/playbook/playbook-docker-test.yml

---
- hosts: master-node,woker-node
  become: true
  tasks:
  roles:
    - geerlingguy.docker
    - geerlingguy.kubernetes

ansibleをまずは流してみる

./exec-ansible-galaxy-install.sh
Starting galaxy role install process
[WARNING]: - geerlingguy.docker (2.9.0) is already installed - use --force to change version to unspecified
[WARNING]: - geerlingguy.kubernetes (5.0.0) is already installed - use --force to change version to unspecified
[WARNING]: - geerlingguy.pip (2.0.0) is already installed - use --force to change version to unspecified
[WARNING]: - geerlingguy.docker_arm (4.0.0) is already installed - use --force to change version to unspecified

まずは、roleを落としてきて

./exec-install-docker-test.sh

実行してみると、dockerのタスクでエラーが出てしまいました。 ansible-role-docker/setup-Debian.yml at master · geerlingguy/ansible-role-docker この行でエラーが出ました。実際にインストールしてみようとすると、ん?よくわからないエラーです。

vagrant@masternode:~$ sudo apt install gnupg2
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package gnupg2 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:
  gpgv gpgsm gnupg-l10n gnupg dirmngr

おそらくですが、このエラーは初期のVMに対して行ったことが原因で、apt側にgnupg2ってパッケージがないって問題だと思ったので。(ググってみたら、gnupg2ってパッケージが存在しているため)
なので次に全更新を行うタスクを一回作成します。

aptの更新を行うタスク

./exec-update-test.sh

中身はこんな感じです。
exec-update-test.sh

#!/bin/bash
docker-compose -f docker-compose-test.yml  run --rm ansible ansible-playbook -i playbook/ansible-host-test.yml playbook/playbook-update-test.yml

ansible/playbook/playbook-update-test.yml

---
- hosts: master-node,woker-node
  become: true
  tasks:
    - name: apt update
      apt:
        update_cache: yes
        upgrade: yes
        autoremove: yes

まずはsnapshotを取るんだ

こういう時は一度snapshotを取る。
なお、この記事を書いているときに、一度目は忘れましたが、二度目に下記を実行し、dockerインストール用のロールを一部修正していることを思い出して、restoreして後述の章で事なきを得ました。

vagrant snapshot save updated

気を取り直してインストール

./exec-install-docker-test.sh

うん。今度はうまいこといってるね。

TASK [geerlingguy.kubernetes : Include OS-specific variables.] **********************************************************************************************************************************************************************************************************************************
ok: [master]
ok: [workcer-1]
ok: [workcer-2]
ok: [workcer-3]

TASK [geerlingguy.kubernetes : include_tasks] ***************************************************************************************************************************************************************************************************************************************************
skipping: [master]
skipping: [workcer-1]
skipping: [workcer-2]
skipping: [workcer-3]

TASK [geerlingguy.kubernetes : include_tasks] ***************************************************************************************************************************************************************************************************************************************************
included: /home/ansible/ansible/playbook/roles/geerlingguy.kubernetes/tasks/setup-Debian.yml for master, workcer-1, workcer-2, workcer-3

TASK [geerlingguy.kubernetes : Ensure dependencies are installed.] ******************************************************************************************************************************************************************************************************************************
ok: [master]
ok: [workcer-3]
ok: [workcer-2]
ok: [workcer-1]

TASK [geerlingguy.kubernetes : Add Kubernetes apt key.] *****************************************************************************************************************************************************************************************************************************************
changed: [master]
changed: [workcer-2]
changed: [workcer-1]
changed: [workcer-3]

TASK [geerlingguy.kubernetes : Add Kubernetes repository.] **************************************************************************************************************************************************************************************************************************************
changed: [master]
changed: [workcer-1]
changed: [workcer-2]
changed: [workcer-3]

TASK [geerlingguy.kubernetes : Add Kubernetes apt preferences file to pin a version.] ***********************************************************************************************************************************************************************************************************
changed: [master]
changed: [workcer-3]
changed: [workcer-2]
changed: [workcer-1]

TASK [geerlingguy.kubernetes : Ensure dependencies are installed.] ******************************************************************************************************************************************************************************************************************************
ok: [master]
ok: [workcer-3]
ok: [workcer-1]
ok: [workcer-2]

TASK [geerlingguy.kubernetes : Install Kubernetes packages.] ************************************************************************************************************************************************************************************************************************************
changed: [workcer-3] => (item={'name': 'kubelet', 'state': 'present'})
changed: [workcer-2] => (item={'name': 'kubelet', 'state': 'present'})
changed: [workcer-1] => (item={'name': 'kubelet', 'state': 'present'})
changed: [master] => (item={'name': 'kubelet', 'state': 'present'})
changed: [workcer-3] => (item={'name': 'kubectl', 'state': 'present'})
changed: [workcer-2] => (item={'name': 'kubectl', 'state': 'present'})
changed: [workcer-1] => (item={'name': 'kubectl', 'state': 'present'})
changed: [master] => (item={'name': 'kubectl', 'state': 'present'})
changed: [workcer-1] => (item={'name': 'kubeadm', 'state': 'present'})
changed: [workcer-2] => (item={'name': 'kubeadm', 'state': 'present'})
changed: [workcer-3] => (item={'name': 'kubeadm', 'state': 'present'})
changed: [master] => (item={'name': 'kubeadm', 'state': 'present'})
ok: [workcer-1] => (item={'name': 'kubernetes-cni', 'state': 'present'})
ok: [workcer-2] => (item={'name': 'kubernetes-cni', 'state': 'present'})
ok: [workcer-3] => (item={'name': 'kubernetes-cni', 'state': 'present'})
ok: [master] => (item={'name': 'kubernetes-cni', 'state': 'present'})

TASK [geerlingguy.kubernetes : include_tasks] ***************************************************************************************************************************************************************************************************************************************************
included: /home/ansible/ansible/playbook/roles/geerlingguy.kubernetes/tasks/sysctl-setup.yml for master, workcer-1, workcer-2, workcer-3

TASK [geerlingguy.kubernetes : Ensure procps is installed.] *************************************************************************************************************************************************************************************************************************************
ok: [master]
ok: [workcer-1]
ok: [workcer-2]
ok: [workcer-3]

TASK [geerlingguy.kubernetes : Let iptables see bridged traffic.] *******************************************************************************************************************************************************************************************************************************
changed: [master] => (item=net.bridge.bridge-nf-call-iptables)
changed: [workcer-2] => (item=net.bridge.bridge-nf-call-iptables)
changed: [workcer-3] => (item=net.bridge.bridge-nf-call-iptables)
changed: [workcer-1] => (item=net.bridge.bridge-nf-call-iptables)
changed: [workcer-2] => (item=net.bridge.bridge-nf-call-ip6tables)
changed: [master] => (item=net.bridge.bridge-nf-call-ip6tables)
changed: [workcer-3] => (item=net.bridge.bridge-nf-call-ip6tables)
changed: [workcer-1] => (item=net.bridge.bridge-nf-call-ip6tables)

TASK [geerlingguy.kubernetes : include_tasks] ***************************************************************************************************************************************************************************************************************************************************
included: /home/ansible/ansible/playbook/roles/geerlingguy.kubernetes/tasks/kubelet-setup.yml for master, workcer-1, workcer-2, workcer-3

TASK [geerlingguy.kubernetes : Check for existence of kubelet environment file.] ****************************************************************************************************************************************************************************************************************
ok: [master]
ok: [workcer-2]
ok: [workcer-3]
ok: [workcer-1]

TASK [geerlingguy.kubernetes : Set facts for KUBELET_EXTRA_ARGS task if environment file exists.] ***********************************************************************************************************************************************************************************************
skipping: [master]
skipping: [workcer-1]
skipping: [workcer-2]
skipping: [workcer-3]

TASK [geerlingguy.kubernetes : Set facts for KUBELET_EXTRA_ARGS task if environment file doesn't exist.] ****************************************************************************************************************************************************************************************
ok: [master]
ok: [workcer-1]
ok: [workcer-2]
ok: [workcer-3]

TASK [geerlingguy.kubernetes : Configure KUBELET_EXTRA_ARGS.] ***********************************************************************************************************************************************************************************************************************************
changed: [workcer-3]
changed: [workcer-1]
changed: [master]
changed: [workcer-2]

TASK [geerlingguy.kubernetes : Reload systemd unit if args were changed.] ***********************************************************************************************************************************************************************************************************************
changed: [workcer-2]
changed: [workcer-3]
changed: [workcer-1]
changed: [master]

TASK [geerlingguy.kubernetes : Ensure kubelet is started and enabled at boot.] ******************************************************************************************************************************************************************************************************************
ok: [master]
ok: [workcer-2]
ok: [workcer-3]
ok: [workcer-1]

TASK [geerlingguy.kubernetes : Check if Kubernetes has already been initialized.] ***************************************************************************************************************************************************************************************************************
ok: [workcer-2]
ok: [workcer-1]
ok: [master]
ok: [workcer-3]

TASK [geerlingguy.kubernetes : include_tasks] ***************************************************************************************************************************************************************************************************************************************************
included: /home/ansible/ansible/playbook/roles/geerlingguy.kubernetes/tasks/master-setup.yml for master, workcer-1, workcer-2, workcer-3

TASK [geerlingguy.kubernetes : Initialize Kubernetes master with kubeadm init.] *****************************************************************************************************************************************************************************************************************
changed: [workcer-2]
changed: [workcer-1]
changed: [workcer-3]
changed: [master]

TASK [geerlingguy.kubernetes : Print the init output to screen.] ********************************************************************************************************************************************************************************************************************************
skipping: [master]
skipping: [workcer-1]
skipping: [workcer-2]
skipping: [workcer-3]

TASK [geerlingguy.kubernetes : Ensure .kube directory exists.] **********************************************************************************************************************************************************************************************************************************
changed: [workcer-2]
changed: [master]
changed: [workcer-1]
changed: [workcer-3]

TASK [geerlingguy.kubernetes : Symlink the kubectl admin.conf to ~/.kube/conf.] *****************************************************************************************************************************************************************************************************************
changed: [master]
changed: [workcer-1]
changed: [workcer-2]
changed: [workcer-3]

TASK [geerlingguy.kubernetes : Configure Flannel networking.] ***********************************************************************************************************************************************************************************************************************************
changed: [workcer-3] => (item=kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml)
changed: [workcer-1] => (item=kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml)
changed: [master] => (item=kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml)
changed: [workcer-2] => (item=kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml)
changed: [workcer-1] => (item=kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml)
changed: [workcer-3] => (item=kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml)
changed: [master] => (item=kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml)
changed: [workcer-2] => (item=kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml)

TASK [geerlingguy.kubernetes : Configure Calico networking.] ************************************************************************************************************************************************************************************************************************************
skipping: [master] => (item=kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml) 
skipping: [workcer-1] => (item=kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml) 
skipping: [workcer-2] => (item=kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml) 
skipping: [workcer-3] => (item=kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml) 

TASK [geerlingguy.kubernetes : Get Kubernetes version for Weave installation.] ******************************************************************************************************************************************************************************************************************
skipping: [master]
skipping: [workcer-1]
skipping: [workcer-2]
skipping: [workcer-3]

TASK [geerlingguy.kubernetes : Configure Weave networking.] *************************************************************************************************************************************************************************************************************************************
skipping: [master]
skipping: [workcer-1]
skipping: [workcer-2]
skipping: [workcer-3]

TASK [geerlingguy.kubernetes : Allow pods on master node (if configured).] **********************************************************************************************************************************************************************************************************************
changed: [workcer-3]
changed: [workcer-1]
changed: [workcer-2]
changed: [master]

TASK [geerlingguy.kubernetes : Check if Kubernetes Dashboard UI service already exists.] ********************************************************************************************************************************************************************************************************
ok: [workcer-1]
ok: [master]
ok: [workcer-3]
ok: [workcer-2]

TASK [geerlingguy.kubernetes : Enable the Kubernetes Web Dashboard UI (if configured).] *********************************************************************************************************************************************************************************************************
skipping: [master]
skipping: [workcer-1]
skipping: [workcer-2]
skipping: [workcer-3]

TASK [geerlingguy.kubernetes : Get the kubeadm join command from the Kubernetes master.] ********************************************************************************************************************************************************************************************************
ok: [master]
ok: [workcer-1]
ok: [workcer-3]
ok: [workcer-2]

TASK [geerlingguy.kubernetes : Set the kubeadm join command globally.] **************************************************************************************************************************************************************************************************************************
ok: [master -> 172.16.20.3] => (item=master)
ok: [master -> 172.16.20.11] => (item=workcer-1)
ok: [master -> 172.16.20.12] => (item=workcer-2)
ok: [master -> 172.16.20.13] => (item=workcer-3)
ok: [workcer-1 -> 172.16.20.3] => (item=master)
ok: [workcer-1 -> 172.16.20.11] => (item=workcer-1)
ok: [workcer-1 -> 172.16.20.12] => (item=workcer-2)
ok: [workcer-1 -> 172.16.20.13] => (item=workcer-3)
ok: [workcer-2 -> 172.16.20.3] => (item=master)
ok: [workcer-2 -> 172.16.20.11] => (item=workcer-1)
ok: [workcer-2 -> 172.16.20.12] => (item=workcer-2)
ok: [workcer-2 -> 172.16.20.13] => (item=workcer-3)
ok: [workcer-3 -> 172.16.20.3] => (item=master)
ok: [workcer-3 -> 172.16.20.11] => (item=workcer-1)
ok: [workcer-3 -> 172.16.20.12] => (item=workcer-2)
ok: [workcer-3 -> 172.16.20.13] => (item=workcer-3)

TASK [geerlingguy.kubernetes : include_tasks] ***************************************************************************************************************************************************************************************************************************************************
skipping: [master]
skipping: [workcer-1]
skipping: [workcer-2]
skipping: [workcer-3]

RUNNING HANDLER [geerlingguy.kubernetes : restart kubelet] **************************************************************************************************************************************************************************************************************************************
changed: [workcer-1]
changed: [workcer-3]
changed: [workcer-2]
changed: [master]

PLAY RECAP **************************************************************************************************************************************************************************************************************************************************************************************
master                     : ok=40   changed=19   unreachable=0    failed=0    skipped=13   rescued=0    ignored=0
workcer-1                  : ok=40   changed=19   unreachable=0    failed=0    skipped=13   rescued=0    ignored=0
workcer-2                  : ok=40   changed=19   unreachable=0    failed=0    skipped=13   rescued=0    ignored=0
workcer-3                  : ok=40   changed=19   unreachable=0    failed=0    skipped=13   rescued=0    ignored=0

もちろんぱっとみ、この状態じゃダメ。だって、各々のサーバーが管理サーバーになっているログに見えるしさ。

geerlingguy/ansible-role-kubernetes: Ansible Role - Kubernetes
説明書きを最初から見るべきだったのだけど、そうじゃなかったので仕方がない。(捨てることが可能な環境だから出来る技)

一応K8sネットワークが構築完了出来たっぽいファイルの状態

K8sで入れているコンポーネント全てが正しく動いているか分かりませんが、現状のファイル群は、こんな感じになっております。

exec-install-docker-test.sh k8sインストール用プレイブックを実行

#!/bin/bash
docker-compose -f docker-compose-test.yml  run --rm ansible ansible-playbook -i playbook/ansible-host-test.yml playbook/playbook-kubernetes.yml

exec-update-test.sh とりあえず、対象ホストを更新

#!/bin/bash
docker-compose -f docker-compose-test.yml  run --rm ansible ansible-playbook -i playbook/ansible-host-test.yml playbook/playbook-update-test.yml

docker-compose-test.yml ansible実行用のyaml

version: "3.3"

services:
  ansible:
    image: registry.localdomain/ansible
    working_dir: /home/ansible/ansible
    user: ansible
    volumes:
      - ansible-galaxy:/etc/ansible/roles
      - ./ansible:/home/ansible/ansible
#      - ./docker/python/nopass_key:/key/nopass_key
      - ./docker/python/key/.vagrant:/key/.vagrant
    env_file: .env
volumes:
  ansible-galaxy:

ansible-host-test.yml 対象ファイルを記述したinventory

master-node:
  hosts:
    master:
      ansible_host: 172.16.20.3
      ansible_user: vagrant
      ansible_ssh_private_key_file: /key/.vagrant/machines/master-node/virtualbox/private_key
  vars:
    kubernetes_role: "master"
    kubernetes_apiserver_advertise_address: 172.16.20.3
worker-node:
  hosts:
    worker-1:
      ansible_host: 172.16.20.11
      ansible_user: vagrant
      ansible_ssh_private_key_file: /key/.vagrant/machines/workernode-1/virtualbox/private_key
    worker-2:
      ansible_host: 172.16.20.12
      ansible_user: vagrant
      ansible_ssh_private_key_file: /key/.vagrant/machines/workernode-2/virtualbox/private_key
    worker-3:
      ansible_host: 172.16.20.13
      ansible_user: vagrant
      ansible_ssh_private_key_file: /key/.vagrant/machines/workernode-3/virtualbox/private_key
  vars:
    kubernetes_role: "node"

playbook-kubernetes.yml

---
- hosts: master-node, worker-node
  become: true
  tasks:
  roles:
    - geerlingguy.docker
    - geerlingguy.kubernetes

K8sの操作を行ってみる

上記のファイル群を適用完了状態だと仮定して、下記のチュートリアル紹介記事をやってみる。
[第1回]Kubernetesの公式チュートリアルをやって基本を押さえる -アプリのデプロイ- | Developers.IO

vagrant@masternode:~$ sudo kubectl get nodes
NAME           STATUS   ROLES    AGE   VERSION
masternode     Ready    master   66m   v1.19.3
workernode-1   Ready    <none>   65m   v1.19.3
workernode-2   Ready    <none>   65m   v1.19.3
workernode-3   Ready    <none>   65m   v1.19.3
vagrant@masternode:~$ sudo kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=8080
pod/kubernetes-bootcamp created
vagrant@masternode:~$ sudo kubectl get deployments
No resources found in default namespace.
vagrant@masternode:~$ sudo kubectl get deployments -A
NAMESPACE     NAME      READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   coredns   2/2     2            2           71m

どうもデプロイされていないっぽいっすね。 一応マスターノードで他のノードが見えてる状態まではできたのでこれでいったん止めておき、K8sに慣れ親しんでまた続きを書きます。

最後に

しり切れトンボになっとりますけど、K8s力自体が足りない状態でどうしてこうなっているかを確認するのは厳しいのでここで終了。
Cluster環境っぽいのが出来上がるまでは出来上がったよ。っていう状態っすね。


Share

comments powered by Disqus