Back

Prerequisites

  • 事前にKubertenesを稼働するノード群の準備。自宅ではProxmoxによるVM環境を構築している。
  • リソース群をprovisioningするマシンの準備。

Setup Cluster

ノードの事前設定

proxmoxでファイアウォールは無効設定でVMを作成しておき、OSの初期設定を行う。 サーバーが起動したら、以下を設定する。

  • 各VMにラップトップの鍵を渡しておく: ssh-copy-id 192.168.0.21 (IPは作成したVMのIP)
  • IPv4 forwardingを有効化 sudo nano /etc/sysctl.confnet.ipv4.ip_forward=1の行をuncommentし、その後sudo sysctl -pで設定反映

KubesprayをDeploy

Kubesprayを使ってクラスター構築していく。 quickstartにある通りレポジトリをcloneして、inventory/myclusterのディレクトリをコピーして作成しておく。 その後、ノードとして利用するVMのIP群からinvenryを作成。

Terminal window
$ CONFIG_FILE=inventory/mycluster/hosts.yaml python3 contrib/inventory_builder/inventory.py 192.168.0.17 192.168.0.21 (...以下略)

生成されたファイルたちを用途に応じていくつか修正する。

inventory/mycluster/hosts.yaml

各ノードに名前を割り当てて、control planeやetcdなどを配置するノードを決める。

all:
hosts:
control-plane1:
ansible_host: 192.168.0.17
ip: 192.168.0.17
access_ip: 192.168.0.17
worker-node1:
ansible_host: 192.168.0.21
ip: 192.168.0.21
access_ip: 192.168.0.21
control-plane2:
ansible_host: 192.168.0.24
ip: 192.168.0.24
access_ip: 192.168.0.24
worker-node2:
ansible_host: 192.168.0.25
ip: 192.168.0.25
access_ip: 192.168.0.25
children:
kube_control_plane:
hosts:
control-plane1:
control-plane2:
kube_node:
hosts:
worker-node1:
worker-node2:
etcd:
hosts:
control-plane2:
k8s_cluster:
children:
kube_control_plane:
kube_node:
calico_rr:
hosts: {}

etcdのホスト数は偶数だとNGなことに注意

inventory/mycluster/group_vars/k8s_cluster/addons.yml

dashboardなどアドオンをインストールするかの設定。必要に応じて以下をtrueに。

  • metrics_server_enabled
  • metallb_enabledとmetallb_protocol: “layer2”など

修正後playbookを適用する。

Terminal window
$ ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root --ask-become-pass cluster.yml

適用後、control planeのvmにsshしてkubectlを実行すると各ノードが確認できる。

Terminal window
$ sudo kubectl get node
NAME STATUS ROLES AGE VERSION
control-plane1 Ready control-plane 4m26s v1.30.3
control-plane2 Ready control-plane 3m55s v1.30.3
worker-node1 Ready <none> 3m23s v1.30.3
worker-node2 Ready <none> 3m23s v1.30.3

クラスター作成後の設定

TODO: docker pullのsecret登録, admin.confをローカルに持ってくる箇所など追記

各種リソースの準備

TODO: Image pullerの設定, Google Application Credentialsの設定

クラスター外部からServiceへの自宅ネットワークのアクセス設定

MetalLBの設定とサービスの作成

クラスターにMetalLBをaddonとしてインストールしておく。 クラスター作成時にaddon.yamlでIP rangeを設定し、poolしておく。 Service作成する際にLoadBalancerでtype指定する 例:

apiVersion: v1
kind: Service
metadata:
labels:
app: mon
name: mon-service
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 3000
selector:
app: mon
type: LoadBalancer
loadBalancerIP: 192.168.11.20 # Optional. poolにあるIPから指定して割り当てる。

適用後、External IPが割り当てられている。

Terminal window
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 6d23h
mon-service LoadBalancer 10.233.23.220 192.168.11.1 80:32548/TCP 12m

ルーティングテーブルの設定

クラスターの外で自宅のネットワークからアクセスする際にkubernetesノードにルーティングされるように設定する。 ルーターにアクセスして、静的ルーティングエントリから静的ルートを追加

Destination: 192.168.11.0/24 # poolされたServiceたちのIP
Gateway: 192.168.1.10 # kubernetesのcontrol planeのノードのIP
Interface: LAN (or appropriate interface)

ArgoCDの設定

インストール

Getting Startedのdocumentに従って導入をする。 argocd-server serviceはブラウザあるいはCLIから操作できるように公開する必要があるのでMetalLBの設定とサービスの作成は済ませておく。

private repositoryの追加

ssh private keyベースのやり方で追加する。workterminalが頻繁に入れ替わる可能性があるためprivate keyには自分のラップトップマシンのもの(~/.ssh/id_rsa)を貼り付ける。

Tips

MetalLBのaddress poolの変更の反映

addons.yamlからaddress poolの変更を適用した場合、MetalLBのcontroller deploymentをrestartしてから、再度serviceの再作成を行わないと変更が反映されない。

参考: https://metallb.universe.tf/configuration/_advanced_ipaddresspool_configuration/#changing-the-ip-of-a-service