13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VPS(Vultr)と家のPCをVPN(WireGuard)で繋いでKubernetesクラスターの構築

Last updated at Posted at 2019-03-09

はじめに

この記事では,VPSと家のPCをVPN(WireGuard)で繋ぎ,VPSをマスターとして,家のPCをそのノードとして,Kubernetesのクラスターを構築する方法を記します.

構成イメージ図

VPSと家のPC接続構成図.png

練習環境

構築の練習としてVultr上にVPSを2台用意し,片方を家のPCの代わりとして利用します.

以下に示す構成で構築した場合,Vultr側から各VPSのIPとrootのパスワードを示してくれます.
PermitRootLogin yesの状態になっているので,そのままrootでSSH接続して試し終わったらVPSを削除すればいいと思います.
1時間以内には終わると思います.(約4円!Wow!)

構成

項目 内容
Server Location Tokyo
Server Type Ubuntu 18.04
Server Size 55GB SSD / 1CPU / 2048MB Memory

Additional Features

項目 内容
Enable IPv6 no
Enable Private Networking no

Server Hostname & Label

  • Server1
  • Server2

※ Server2を家のPCの代わりとして利用します

WireGuardのネットワークについて

WireGuardを使ったVPNで利用するIPは

  • Server1: 10.0.0.1
  • Server2: 10.0.0.2
    を利用し,ポートは33333を利用します.

構築手順

共通の手順

VPN(WireGuard)のインストール

WireGuardは簡単にVPNができる技術です.
WireGuardのインストールは公式の手順と同じ感じに行います.

# add-apt-repository ppa:wireguard/wireguard
# apt update
# apt install wireguard

Dockerのインストール

Dockerはコンテナ型の仮想化環境を提供するオープンソースソフトウェアです.
Dockerのインストールも公式の手順と同じ感じに行います.
インストールするdokcer-ceはこの記事を書いた時点のKubernetes v1.13.4に対応する18.06.3~ce~3-0~ubuntuをインストールしています.
また,apt-markを使ってdocker-ceapt upgradeで更新されないようにしています,

# apt update
# apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# apt update
# apt install docker-ce=18.06.3~ce~3-0~ubuntu
# apt-mark hold docker-ce

Kubeadmのインストール

Kubernetesはコンテナオーケストレーションシステムです.
Kubeadmは公式が提供しているkubernetesクラスターを構築するためのツールです.
Kubeadmのインストールも公式の手順と同じ感じに行います.

# apt update
# apt install apt-transport-https curl
# curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# add-apt-repository "deb https://apt.kubernetes.io/ kubernetes-xenial main"
# apt update
# apt install kubelet kubeadm kubectl
# apt-mark hold kubelet kubeadm kubectl

WireGuardのセットアップ

WireGuardの秘密鍵と公開鍵の生成

各サーバーでWireGuardを使ったVPNを行うために鍵を生成します.
公式の手順に従います.
片方のサーバーで二つ生成しても問題はありません.

# wg genkey | tee privatekey | wg pubkey > publickey

WireGuardの設定ファイルの用意

WireGuradのインターフェースwg0の設定ファイルを用意します.
PostUpで後々Kubernetesのポッド間通信を実現するためのネットワーク設定をしています.
PostDownではその設定を消しています.

Server1

/etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.1
PrivateKey = {{ Server1の秘密鍵 }}
PostUp = ip route add 10.96.0.0/16 dev wg0 src 10.0.0.1
PostDown = ip route del 10.96.0.0/16 dev wg0 src 10.0.0.1
ListenPort = 33333

[Peer]
PublicKey = {{ Server2の公開鍵 }}
AllowedIps = 10.0.0.2/32
Endpoint = {{ Server2のグローバルIP }}:33333
PersistentKeepalive = 25

Server2

/etc/wireguard/wg0.conf
[Interface]
Address = 10.0.0.2
PrivateKey = {{ Server2の秘密鍵 }}
PostUp = ip route add 10.96.0.0/16 dev wg0 src 10.0.0.2
PostDown = ip route del 10.96.0.0/16 dev wg0 src 10.0.0.2
ListenPort = 33333

[Peer]
PublicKey = {{ Server1の公開鍵 }}
AllowedIps = 10.0.0.1/32
Endpoint = {{ Server1のグローバルIP }}:33333
PersistentKeepalive = 25

WireGuardのインターフェースの起動

各サーバーでwg-quick@.serviceを利用してwg0を起動します.
wg-quick@.service中ではwg-quickコマンドでインターフェースを起動しているのですが,デフォルトで/etc/wireguard/を参照するようになっています.

# systemctl start wg-quick@wg0
# systemctl enable wg-quick@wg0

WireGuardの動作確認

動作しているかはwgコマンドを使って確認できます.
pingコマンドでも確認できます.

# wg
interface: wg0
  public key: **************************************
  private key: (hidden)
  listening port: 33333

peer: **************************************
  endpoint: XXX.XXX.XXX.XXX:33333
  allowed ips: 10.0.0.2/32
  latest handshake: 10 seconds ago
  transfer: 5.70 MiB received, 20.25 MiB sent
  persistent keepalive: every 25 seconds
# ping 10.0.0.1 -c 3
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.042 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.068 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=1.63 ms

--- 10.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2047ms
rtt min/avg/max/mdev = 0.042/0.582/1.636/0.745 ms


# ping 10.0.0.2 -c 3
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=5.31 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=5.70 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=5.56 ms

--- 10.0.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 5.312/5.529/5.706/0.163 ms

kubernetesクラスターのセットアップ

Server1をマスターとして,Server2をワーカーとしてセットアップします.
公式の手順と同じ感じで行います.
利用するpod network add-onWeave Netです.

Server1のセットアップ

Kubernetesマスターのセットアップ

# kubeadm init --apiserver-advertise-address=10.0.0.1 --ignore-preflight-errors=NumCPU
...
You can now join any number of machines by running the following on each node
as root:

  kubeadm join 10.0.0.1:6443 --token ***...*** --discovery-token-ca-cert-hash sha256:***...***

--ignore-preflight-errors=NumCPUは今回練習で利用しているVPSのCPUが1個なので,そのエラーを無視するためのものです.
kubeadm join 10.0.0.1:6443 --token ***...*** --discovery-token-ca-cert-hash sha256:***...***はServer2のセットアップで使います

Weave Netのセットアップ

# echo "net.bridge.bridge-nf-call-iptables=1" > /etc/sysctl.d/k8s.conf
# sysctl --system
# export KUBECONFIG=/etc/kubernetes/admin.conf
# kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

MasterでもPodが建てれるように設定

# export KUBECONFIG=/etc/kubernetes/admin.conf
# kubectl taint nodes --all node-role.kubernetes.io/master-

Server2のセットアップ

クラスターへの参加

# kubeadm join 10.0.0.1:6443 --token ***...*** --discovery-token-ca-cert-hash sha256:***...***

Kubernetesクラスターの動作確認

少しだけ時間をおいてServer1側でkubectl nodeを使って状態を確認します.

# export KUBECONFIG=/etc/kubernetes/admin.conf
# kubectl get node
NAME      STATUS     ROLES    AGE   VERSION
server1   Ready      master   **m   v1.13.4
server2   Ready      <none>   **m   v1.13.4

Nodeを指定してPodを建てれるようにlabelの設定

参考記事: kubernetes: 特定のコンテナ(Pod)だけ特定のホストで

# export KUBECONFIG=/etc/kubernetes/admin.conf
# kubectl label nodes server1 type=server1
# kubectl label nodes server2 type=server2

おわり

あとは,このKubernetesクラスターを自由に使ってみればいいと思います.

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?