ansibleでkubernetes環境の構築 2

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

<!-- wp:paragraph -->
ansibleを使用してkubernetesを初期化することができた<br> いよいよk8s workerを追加して本確定なk8s環境を作っていく</p>


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

<!-- wp:paragraph -->
<p>MBP OS Sierra<br>
MAASサーバー(192.168.100.152 MAAS用ネットワーク:192.168.200.1)<br>
k8s-masterサーバー(KVM:192.168.100.191)<br>
ansibleサーバー(KVM:192.168.100.192)<br>
k8s worker(192.168.200.151)<br>
k8s worker(192.168.200.153)</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>dash-board Ver.1.8</p>
<!-- /wp:paragraph -->

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

<!-- wp:paragraph -->
<p>k8sで作ったflannelネットワーク内に、MAASでOSをデプロイしたマシンをk8s-workerとして追加する<br>
またk8sの使用状況をダッシュボードでも見ることができるようにする</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>MAASサーバーのネットワーク設定</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>今回はMAASのDHCP問題の関係でk8s-masterとworkerは別のネットワークにしているため、MAASサーバーでブリッジ設定をする必要がある</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>ubuntu18は16までのものとネットワーク設定の仕方が変わっている<br>
/etc/netplan/50-cloud-init.yaml_bkの記述だけでいけるはずだったが、ブリッジの設定がうまくいかなかったため今回は２種類のファイルに記述している</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo vi /etc/netplan/50-cloud-init.yaml_bk
network:
    ethernets:
        enp0s31f6:
            addresses:
            - 192.168.100.152/24
            gateway4: 192.168.100.1
            nameservers:
                addresses:
                - 8.8.8.8
                search:
                - 8.8.4.4
        enp2s0:
            addresses:
            - 192.168.200.1/24
            gateway4: 192.168.100.1
            nameservers:
                addresses:
                - 8.8.8.8
                search:
                - 8.8.4.4
    version: 2

$ sudo vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto enp0s31f6
iface enp0s31f6 inet manual

auto br0
iface br0 inet static
address 192.168.100.152
netmask 255.255.255.0
gateway 192.168.100.1
dns-nameservers 8.8.8.8
bridge_ports enp0s31f6
bridge_maxwait 0
bridge_df 0
bridge_stp off


auto enp2s0
iface enp2s0 inet static
address 192.168.200.1
netmask 255.255.255.0
gateway 192.168.100.1
dns-nameservers 8.8.8.8

$ ifconfig
br0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.152  netmask 255.255.255.0  broadcast 192.168.100.255
        inet6 fe80::329c:23ff:feac:5570  prefixlen 64  scopeid 0x20&lt;link>
        ether 30:9c:23:ac:55:70  txqueuelen 1000  (Ethernet)
        RX packets 9579059  bytes 16579553543 (16.5 GB)
        RX errors 0  dropped 657286  overruns 0  frame 0
        TX packets 6047022  bytes 936298283 (936.2 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp0s31f6: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::329c:23ff:feac:5570  prefixlen 64  scopeid 0x20&lt;link>
        ether 30:9c:23:ac:55:70  txqueuelen 1000  (Ethernet)
        RX packets 21689196  bytes 26237413396 (26.2 GB)
        RX errors 0  dropped 475  overruns 0  frame 0
        TX packets 6555651  bytes 4057603928 (4.0 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16  memory 0xdf100000-df120000

enp2s0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.200.1  netmask 255.255.255.0  broadcast 192.168.200.255
        inet6 fe80::6a05:caff:fe66:a834  prefixlen 64  scopeid 0x20&lt;link>
        ether 68:05:ca:66:a8:34  txqueuelen 1000  (Ethernet)
        RX packets 6867754  bytes 970026556 (970.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13304857  bytes 15246678579 (15.2 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 17  memory 0xdf0c0000-df0e0000</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>また2つのネットワークで通信できるようにNATの設定をする</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>sudo iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j SNAT --to 192.168.100.152</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>workerの追加</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>k8sのworkerを追加するにはマスターの場合とほとんど変わらないがflannelネットワークに参加させる最後に起動させるコマンドが必要になる</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>そのコマンドはkubeadm initを行なった際の出力内容に表示されるが、下記コマンドでも確認することができる</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>(k8s-master)$ kubeadm token create --print-join-command</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>出てきたコマンドを使ってworker参加用のplaybookを作成する</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>(ansible)$ sudo vi mlp.yml
---
- hosts: mlp01
  remote_user: ubuntu
  become: yes
  tasks:
    - name: Install prerequisites and Docker.io , nfs-common
      apt: name={{item}} update_cache=yes
      with_items:
        - nfs-common
        - apt-transport-https
        - ca-certificates
        - curl
        - software-properties-common
        - docker.io
    - name: user add to docker group
      user: name=ubuntu group=docker append=yes
    - name: Add K8S GPG key
      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
      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.
      service: name=docker enabled=yes
    - name: Set kubelet service to start on boot.
      service: name=kubelet enabled=yes
    - name: Join k8s-master
      become: yes
      shell: kubeadm join 192.168.100.191:6443 ~~ #上記のコマンドで出力したものを記述</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>マスターの時と同様にhostsの編集</p>
<!-- /wp:paragraph -->

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

[mlp]
mlp01 

$ sudo vi /etc/hosts 
192.168.100.191 k8s-master 192.168.200.151 mlp01 </code></pre>
<!-- /wp:code -->

<!-- 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 mlp.yml -e 'ansible_python_interpreter=/usr/bin/python3'</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>playbookが成功した場合、以下の状態になる</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>(k8s-master)$ kubectl get node
NAME         STATUS    ROLES     AGE       VERSION
k8s-master   Ready     master    3d        v1.10.3
mlp01        Ready     &lt;none>    3d        v1.10.2</code></pre>
<!-- /wp:code -->

<!-- wp:heading {"level":1} -->
<h1>nginxイメージの起動</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>nodeが追加された後は、ひとまずnginxのdockerイメージを走らせる<br>
理由は後述する</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ sudo vi nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
spec:
  containers:
    - name: nginx-container
      image: nginx
      ports:
      - containerPort: 80

$ kubectl apply -f nginx-pod.yaml
create
$ kubectl get pod
NAME           READY     STATUS    RESTARTS   AGE
nginx-pod      1/1       Running   0          3d</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>nginxがRunningになれば問題ない</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>Dash-boardのインストール</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>Dash-boardはなくても、kubernetesを使う上ではなんとかなるがせっかくなら使いたい<br>
というわけでインストールをしていく</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>エラーが出ず、「created」と表示されればOK<br>
動いているかを確認</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>kubectl get pods --all-namespaces
NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE
default       nginx-pod                               1/1       Running   0          3d
kube-system   kubernetes-dashboard-7d5dcdb6d9-7hptz   1/1       Running   0          3d</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>kubeのproxyを起動</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ kubectl proxy --address 0.0.0.0 --accept-hosts '.*'
Starting to serve on [::]:8001</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>この状態になったらブラウザでアクセスして見る<br>
ログイン画面が出てくる</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login</code></pre>
<!-- /wp:code -->

<!-- wp:image -->
<figure class="wp-block-image"><img src="https://qiita-image-store.s3.amazonaws.com/0/259343/e9a9b1bb-9435-7c67-deda-a9a0dd1b0fcd.png" alt="スクリーンショット 2018-05-29 14.24.06.png"/></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>ログインするためのトークンを発行する</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ kubectl -n kube-system get secret</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>発行されたトークンを使えば入れる</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>毎回トークンを発行するのが大変という人向けの設定は以下のもの<br>
これを実行した後は、ログイン画面のSKIPで入れるようになる<br>
ただしセキュリティ的にはガバガバなため、社内オンリーの環境など外部の人がいない条件での使用推奨</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>$ cat &lt;&lt;EOF | kubectl create -f -
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system
EOF</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>これでkubernetesの環境構築は終了である</p>
<!-- /wp:paragraph -->

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

<!-- wp:paragraph -->
<p>この環境を作ることができたら、あとはk8s-masterからdockerイメージを起動させればnodeに自動配布することができる<br>
nodeの新規追加もflannelネットワークに追加するコマンドさえあればすぐできるためとても便利</p>
<!-- /wp:paragraph -->

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

<!-- wp:heading {"level":3} -->
<h3>ネットワーク通信</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>この記事の冒頭の方でネットワーク設定を載せているが、これに決まるまでは通信が通らないエラーがで続けていた<br>
ubuntu18のバージョン変更に伴う設定方法の変更に振り回された印象</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>kubeadm initが失敗する</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>原因としてはswapの消去を忘れていただけだが、存在を忘れがちである</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":3} -->
<h3>dash-boardが表示されない</h3>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p>マスターにノードが追加され、dash-boardをインストール→proxyを起動としただけではブラウザにdash-boardは表示されず、ブラウザのページにはファイルのディレクトリツリーだけが出てくるのみだった<br>
試しにページの中段にあるようにproxy-podを起動させてみて、その後手順通りに進めたらdash-boardが表示されるようになった<br>
他の参考にしたページでは同様の症状はなかったようでdash-boardのバージョンの仕様なのか、自分だけだやっていない設定があるのか、原因は不明</p>
<!-- /wp:paragraph -->

<!-- wp:heading {"level":1} -->
<h1>参考にしたページ</h1>
<!-- /wp:heading -->

<!-- wp:paragraph -->
<p><a href="http://www.kurobuti.com/blog/?p=5112">iptables で NAT 環境を構築してみた</a><br>
<a href="https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/">kubernetes 公式ページ</a><br>
<a href="https://qiita.com/sheepland/items/0ee17b80fcfb10227a41">access control</a><br>
<a href="http://www.n-novice.com/entry/2018/03/11/172859">Kubernetes/Web UI (Dashboard)の追加</a><br>
<a href="https://qiita.com/sheepland/items/0ee17b80fcfb10227a41">KubernetesにDashboardをインストールして、認証なしでアクセスする</a></p>
<!-- /wp:paragraph -->