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.confでnet.ipv4.ip_forward=1の行をuncommentし、その後sudo sysctl -pで設定反映
KubesprayをDeploy
Kubesprayを使ってクラスター構築していく。
quickstartにある通りレポジトリをcloneして、inventory/myclusterのディレクトリをコピーして作成しておく。
その後、ノードとして利用するVMのIP群からinvenryを作成。
$ 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を適用する。
$ ansible-playbook -i inventory/mycluster/hosts.yaml --become --become-user=root --ask-become-pass cluster.yml適用後、control planeのvmにsshしてkubectlを実行すると各ノードが確認できる。
$ sudo kubectl get nodeNAME STATUS ROLES AGE VERSIONcontrol-plane1 Ready control-plane 4m26s v1.30.3control-plane2 Ready control-plane 3m55s v1.30.3worker-node1 Ready <none> 3m23s v1.30.3worker-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: v1kind: Servicemetadata: labels: app: mon name: mon-service namespace: defaultspec: ports: - port: 80 protocol: TCP targetPort: 3000 selector: app: mon type: LoadBalancer loadBalancerIP: 192.168.11.20 # Optional. poolにあるIPから指定して割り当てる。適用後、External IPが割り当てられている。
➜ kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.233.0.1 <none> 443/TCP 6d23hmon-service LoadBalancer 10.233.23.220 192.168.11.1 80:32548/TCP 12mルーティングテーブルの設定
クラスターの外で自宅のネットワークからアクセスする際にkubernetesノードにルーティングされるように設定する。 ルーターにアクセスして、静的ルーティングエントリから静的ルートを追加
Destination: 192.168.11.0/24 # poolされたServiceたちのIPGateway: 192.168.1.10 # kubernetesのcontrol planeのノードのIPInterface: 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の再作成を行わないと変更が反映されない。