ansibleでkubernetes環境の構築 1

<!-- wp:heading {"level":1} -->
<h1>はじめに</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p> nodeに対してのk8sのインストールなどは極力ansibleで自動化していく<br> ansibleの実行機やk8sのマスターはMAASサーバーのKVMを使用する</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>ゴール</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>ansibleでk8sをインストールできる状態まで構築する</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>環境</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>MBP OS Sierra<br>
MAASサーバー(192.168.100.152)<br>
k8s-masterサーバー(KVM:192.168.100.191)<br>
ansibleサーバー(KVM:192.168.100.192)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ansible Ver.2.5.1<br>
kubernetes Ver.1.10.3</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>MAASサーバーにKVMをインストールする</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>ansibleサーバー、k8sサーバーを作るためのKVMを土台となるMAASサーバーにインストールする<br>
インストール後はlibvirtグループに参加し、sudoなしでも実行できるようにする</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo apt install -y qemu-kvm libvirt0 libvirt-bin virt-manager bridge-utils
$ sudo systemctl enable libvirt-bin
$ sudo gpasswd libvirtd -a &lt;username></code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>KVMの作成はデスクトップ環境を使用した方が便利なため、MAASサーバーにデスクトップをインストールする</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo apt -y install ubuntu-desktop</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>デスクトップのインストールは時間がかかるためしばし待つ<br>
インストールが完了して再起動すれば自動でデスクトップが表示される</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>デスクトップ上のターミナルでKVMを起動すれば作成用ウィンドウが起動される</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ virt-manager</code></pre>
<!-- /wp:code -->

<!-- wp:image -->
<figure class="wp-block-image"><img src="https://qiita-image-store.s3.amazonaws.com/0/259343/9cc5b71a-04c2-ec9a-047f-049bf0a16fbc.png" alt="0001_New-Virtual-Machine.png"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>ここで下記スペックのKVMを新規作成する</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>ホスト名:ansible
メモリ:4GB
CPU:2
ストレージ:30GB

ホスト名:k8s-master
メモリ:8GB
CPU:4
ストレージ:40GB</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>ansibleの構築</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>KVMで作成したansibleサーバーに実際にansibleをインストールする</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ 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</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>今回はhome直下にansibleフォルダを作成し、各種ファイルを管理する</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo mkdir ansible</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>k8s-masterにk8sをインストールするためのplaybookを作成する</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ 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</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>次はansibleのhostsを追加設定</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo vi /etc/ansible/hosts
</code></pre>
<!-- /wp:code -->

<!-- wp:shortcode -->
[master]
<!-- /wp:shortcode -->

<!-- wp:paragraph -->
<p>
k8s-master

$ sudo vi /etc/hosts
192.168.100.191 k8s-master
</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>準備ができたらansibleのplaybook実行<br>
python3をしようする場合は"-e"以降のオプションが必要</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>~/ansible$ sudo ansible-playbook --private-key=id_rsa_common k8s-master.yml -e 'ansible_python_interpreter=/usr/bin/python3'</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>エラーが出なければ完了</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>おわりに</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>k8sはバージョンの移り変わりが早く、ubuntuも18.04と新しいバージョンでエラーが多くどうなるかと思ったが初期化の成功にひとまず安心した</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>つまづいたところ</h1>
<!-- /wp:heading -->

<!-- wp:heading {"level":3} -->
<h3>dockerのバージョン</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>k8sの初期化をする際、最新のdocker(18.03)を入れていると、対応しているバージョンは17.03までだからダウングレードしろとメッセージが出たため、17.03を入れ直した<br>
しかし失敗するのは変わらなかったため、docker.ioをいれたところ成功した</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>kube-dnsが機能しなかった</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>ansibleファイル内で実行しているkubeadm initのコマンドにおいて、--pod-network-cidrのネットワーク表記を当初「10.0.0.0」にしていたが、その設定だとパッケージに入っているkube-dnsが機能しなかった<br>
各ページを確認したところこのネットワークは「10.244.0.0」が正しそうだということがわかり、そちらの設定でコマンドを実行したところ正常にkube-dnsは機能してくれた</p>
<!-- /wp:paragraph -->

<!-- wp:heading -->
<h2>参考ページ</h2>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><a href="https://www.hiroom2.com/2016/07/11/ubuntu-16-04-kvm%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B/">Ubuntu 16.04: KVMをインストールして仮想マシンを起動する</a><br>
<a href="https://dev.classmethod.jp/server-side/ansible/ansible-intro-3/">Ansible入門しました。【入門編】</a><br>
<a href="https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/">kubernetes 公式ページ</a><br>
<a href="https://knowledge.sakura.ad.jp/3681/">kubernetesによるDockerコンテナ管理入門</a><br>
<a href="https://qiita.com/hichihara/items/79ef6613026f8c13eb99">kubeadm で kubernetes v1.8 + Flannel をインストール</a></p>
<!-- /wp:paragraph -->