はじめに
nodeに対してのk8sのインストールなどは極力ansibleで自動化していく
ansibleの実行機やk8sのマスターはMAASサーバーのKVMを使用する
ゴール
ansibleでk8sをインストールできる状態まで構築する
環境
MBP OS Sierra
MAASサーバー(192.168.100.152)
k8s-masterサーバー(KVM:192.168.100.191)
ansibleサーバー(KVM:192.168.100.192)
ansible Ver.2.5.1
kubernetes Ver.1.10.3
MAASサーバーにKVMをインストールする
ansibleサーバー、k8sサーバーを作るためのKVMを土台となるMAASサーバーにインストールする
インストール後はlibvirtグループに参加し、sudoなしでも実行できるようにする
$ sudo apt install -y qemu-kvm libvirt0 libvirt-bin virt-manager bridge-utils
$ sudo systemctl enable libvirt-bin
$ sudo gpasswd libvirtd -a <username>
KVMの作成はデスクトップ環境を使用した方が便利なため、MAASサーバーにデスクトップをインストールする
$ sudo apt -y install ubuntu-desktop
デスクトップのインストールは時間がかかるためしばし待つ
インストールが完了して再起動すれば自動でデスクトップが表示される
デスクトップ上のターミナルでKVMを起動すれば作成用ウィンドウが起動される
$ virt-manager
ここで下記スペックのKVMを新規作成する
ホスト名:ansible
メモリ:4GB
CPU:2
ストレージ:30GB
ホスト名:k8s-master
メモリ:8GB
CPU:4
ストレージ:40GB
ansibleの構築
KVMで作成したansibleサーバーに実際にansibleをインストールする
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
今回はhome直下にansibleフォルダを作成し、各種ファイルを管理する
$ sudo mkdir ansible
k8s-masterにk8sをインストールするためのplaybookを作成する
$ sudo vi k8s-master.yaml
---
- hosts: k8s-master
remote_user: $user名
become: yes
tasks:
- name: Install prerequisites and Docker.io #dockerインストール
become: yes
apt: name={{item}} update_cache=yes
with_items:
- apt-transport-https
- ca-certificates
- curl
- software-properties-common
- docker.io
- name: user add to docker group
user: name=gauss group=docker append=yes
- name: Add K8S GPG key #k8sインストール準備
apt_key:
url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
- name: Add K8S APT repository
apt_repository:
repo: deb http://apt.kubernetes.io/ kubernetes-xenial main
- name: Install K8S
apt: name={{item}} update_cache=yes
with_items:
- kubelet
- kubeadm
- kubectl
- name: Remove swapfile from /etc/fstab #swapを消しておかないと失敗する
mount:
name: swap
fstype: swap
state: absent
- name: Disable swap
command: swapoff -a
when: ansible_swaptotal_mb > 0
- name: Set docker service to start on boot. #再起動後もdockerを自動起動させる
service: name=docker enabled=yes
- name: Set kubelet service to start on boot. #再起動後もk8sを自動起動させる
service: name=kubelet enabled=yes
- name: Init k8s-master #k8smの初期化
become: yes
shell: kubeadm init --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.100.191
- name: Make Directory .kube
file:
path: /.kube
state: directory
owner: $オーナー
group: docker
mode: 0755
- name: Copy the .kube config
become: yes
file:
src: /home/$ユーザ名/ansible/admin.conf
dest: ~/.kube/config
owner: $オーナー
group: docker
mode: 0600
- name: Export Kubernetes
lineinfile:
path: /home/$ユーザ名/.kube/config
state: absent
regexp: '^%KUBECONFIG'
- name: Apply Flannel $flannelのネットワークを作成
sudo: yes
shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
次はansibleのhostsを追加設定
$ sudo vi /etc/ansible/hosts
[master]
k8s-master
$ sudo vi /etc/hosts
192.168.100.191 k8s-master
準備ができたらansibleのplaybook実行
python3をしようする場合は"-e"以降のオプションが必要
~/ansible$ sudo ansible-playbook --private-key=id_rsa_common k8s-master.yml -e 'ansible_python_interpreter=/usr/bin/python3'
エラーが出なければ完了
おわりに
k8sはバージョンの移り変わりが早く、ubuntuも18.04と新しいバージョンでエラーが多くどうなるかと思ったが初期化の成功にひとまず安心した
つまづいたところ
dockerのバージョン
k8sの初期化をする際、最新のdocker(18.03)を入れていると、対応しているバージョンは17.03までだからダウングレードしろとメッセージが出たため、17.03を入れ直した
しかし失敗するのは変わらなかったため、docker.ioをいれたところ成功した
kube-dnsが機能しなかった
ansibleファイル内で実行しているkubeadm initのコマンドにおいて、--pod-network-cidrのネットワーク表記を当初「10.0.0.0」にしていたが、その設定だとパッケージに入っているkube-dnsが機能しなかった
各ページを確認したところこのネットワークは「10.244.0.0」が正しそうだということがわかり、そちらの設定でコマンドを実行したところ正常にkube-dnsは機能してくれた
参考ページ
Ubuntu 16.04: KVMをインストールして仮想マシンを起動する
Ansible入門しました。【入門編】
kubernetes 公式ページ
kubernetesによるDockerコンテナ管理入門
kubeadm で kubernetes v1.8 + Flannel をインストール