Edited at

ansibleでkubernetes環境の構築 2

More than 1 year has passed since last update.


はじめに

前回の記事でansibleを使用してkubernetesを初期化することができた

いよいよk8s workerを追加して本確定なk8s環境を作っていく


環境

MBP OS Sierra

MAASサーバー(192.168.100.152 MAAS用ネットワーク:192.168.200.1)

k8s-masterサーバー(KVM:192.168.100.191)

ansibleサーバー(KVM:192.168.100.192)

k8s worker(192.168.200.151)

k8s worker(192.168.200.153)

dash-board Ver.1.8


ゴール

k8sで作ったflannelネットワーク内に、MAASでOSをデプロイしたマシンをk8s-workerとして追加する

またk8sの使用状況をダッシュボードでも見ることができるようにする


MAASサーバーのネットワーク設定

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

ubuntu18は16までのものとネットワーク設定の仕方が変わっている

/etc/netplan/50-cloud-init.yaml_bkの記述だけでいけるはずだったが、ブリッジの設定がうまくいかなかったため今回は2種類のファイルに記述している

$ 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<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<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<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::329c:23ff:feac:5570 prefixlen 64 scopeid 0x20<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<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<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

また2つのネットワークで通信できるようにNATの設定をする

sudo iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j SNAT --to 192.168.100.152


workerの追加

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

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

(k8s-master)$ kubeadm token create --print-join-command

出てきたコマンドを使ってworker参加用のplaybookを作成する

(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 ~~ #上記のコマンドで出力したものを記述

マスターの時と同様にhostsの編集

$ 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

ansibleのplaybook実行

python3をしようする場合は"-e"以降のオプションが必要

~/ansible$ sudo ansible-playbook --private-key=id_rsa_common mlp.yml -e 'ansible_python_interpreter=/usr/bin/python3'

playbookが成功した場合、以下の状態になる

(k8s-master)$ kubectl get node

NAME STATUS ROLES AGE VERSION
k8s-master Ready master 3d v1.10.3
mlp01 Ready <none> 3d v1.10.2


nginxイメージの起動

nodeが追加された後は、ひとまずnginxのdockerイメージを走らせる

理由は後述する

$ 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

nginxがRunningになれば問題ない


Dash-boardのインストール

Dash-boardはなくても、kubernetesを使う上ではなんとかなるがせっかくなら使いたい

というわけでインストールをしていく

$ kubectl create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

エラーが出ず、「created」と表示されればOK

動いているかを確認

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

kubeのproxyを起動

$ kubectl proxy --address 0.0.0.0 --accept-hosts '.*'

Starting to serve on [::]:8001

この状態になったらブラウザでアクセスして見る

ログイン画面が出てくる

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login

スクリーンショット 2018-05-29 14.24.06.png

ログインするためのトークンを発行する

$ kubectl -n kube-system get secret

発行されたトークンを使えば入れる

毎回トークンを発行するのが大変という人向けの設定は以下のもの

これを実行した後は、ログイン画面のSKIPで入れるようになる

ただしセキュリティ的にはガバガバなため、社内オンリーの環境など外部の人がいない条件での使用推奨

$ cat <<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

これでkubernetesの環境構築は終了である


おわりに

この環境を作ることができたら、あとはk8s-masterからdockerイメージを起動させればnodeに自動配布することができる

nodeの新規追加もflannelネットワークに追加するコマンドさえあればすぐできるためとても便利


つまづいたところ


ネットワーク通信

この記事の冒頭の方でネットワーク設定を載せているが、これに決まるまでは通信が通らないエラーがで続けていた

ubuntu18のバージョン変更に伴う設定方法の変更に振り回された印象


kubeadm initが失敗する

原因としてはswapの消去を忘れていただけだが、存在を忘れがちである


dash-boardが表示されない

マスターにノードが追加され、dash-boardをインストール→proxyを起動としただけではブラウザにdash-boardは表示されず、ブラウザのページにはファイルのディレクトリツリーだけが出てくるのみだった

試しにページの中段にあるようにproxy-podを起動させてみて、その後手順通りに進めたらdash-boardが表示されるようになった

他の参考にしたページでは同様の症状はなかったようでdash-boardのバージョンの仕様なのか、自分だけだやっていない設定があるのか、原因は不明


参考にしたページ

iptables で NAT 環境を構築してみた

kubernetes 公式ページ

access control

Kubernetes/Web UI (Dashboard)の追加

KubernetesにDashboardをインストールして、認証なしでアクセスする