Skip to content

fix: control_plane_hostをFQDNに変更しk8s1/k8s2/k8s4のAレコードを追加 - #51

Draft
kigawa01 wants to merge 1 commit into
mainfrom
fix/k8s-fqdn-hostnames
Draft

fix: control_plane_hostをFQDNに変更しk8s1/k8s2/k8s4のAレコードを追加#51
kigawa01 wants to merge 1 commit into
mainfrom
fix/k8s-fqdn-hostnames

Conversation

@kigawa01

Copy link
Copy Markdown
Member

Summary

kinfraのR2変更検出フィルタ実地検証を通じて、hardware/k8s-worker3join_infoが一貫して失敗する根本原因を特定した:

join_info: failed to get token/hash from kigawa@k8s1 (ssh exit 255): ssh: Could not resolve hostname k8s1: Name or service not known

(#48でjoin_infoスクリプトに診断メッセージを追加して判明)

調査の結果、k8s1というbareホスト名は、このリポジトリが管理するどのDNSインフラにも存在しないことが分かった:

  • Knot DNS authorityのゾーンファイル(hardware/zones/kigawa.net.zone)にk8s1.kigawa.netのAレコードが無い(k8s.kigawa.netはあるがk8s1は無い)
  • Knot Resolver (kresd) はkigawa.net等のゾーンをKnot DNS authorityに転送するのみで、bareホスト名の解決手段は持たない
  • CoreDNS経由でも同様にbareホスト名は解決できない(クラスタ内Podで実際に検証済み)

これまで動いていたのは、手動で/etc/hostsk8s1等を設定済みの管理マシンからrun.shベースのCIが実行されていたためと考えられる。IaCで管理されたCI Runner(Kubernetes Pod)にはそのような手動設定が無いため、ssh: Could not resolve hostname k8s1で失敗する。

hardware/k8s-worker3以外にも、k8s1/k8s2/k8s4/k8s-worker5が同様にcontrol_plane_host変数にbareホスト名をデフォルト値として使っており、同じ問題を抱えている(今回はk8s-worker3のリソースがtainted状態だったため顕在化したが、他のモジュールも潜在的に同じ問題を持つ)。

Changes

  • hardware/zones/kigawa.net.zone: k8s1.kigawa.net(10.0.0.103) / k8s2.kigawa.net(10.0.0.120) / k8s4.kigawa.net(10.0.0.140) のAレコードを追加(IPはdocs/network.md記載の静的割当を使用)。SOAシリアルを更新
  • hardware/{k8s1,k8s2,k8s4,k8s-worker3,k8s-worker5}/variables.tf: control_plane_hostのデフォルト値をbareホスト名からFQDNに変更(例: "k8s1""k8s1.kigawa.net"

⚠️ 注意

ゾーンファイルの変更は、k8s1/k8s2/k8s4上のKnot DNSに実際に反映されるには各モジュールでterraform applyが必要module "knot"経由でゾーンファイルがSSH+リモートコマンドで配信される)。マージ後、plan/applyで実際にDNSサーバーへ反映されるまではk8s1.kigawa.net等はまだ解決できない点に注意。

Test plan

  • terraform init -backend=false && terraform validate を影響する5モジュール全てで実行し成功を確認
  • マージ後、hardware全体(またはk8s1/k8s2/k8s4個別)でterraform applyしゾーンを反映
  • terraform-kinfra.ymlをworkflow_dispatchで再実行し、k8s1.kigawa.netが名前解決できること、k8s-worker3のplanが完走することを確認

🤖 Generated with Claude Code

hardware/k8s-worker3等の各モジュールがcontrol_plane_hostにbareホスト名
("k8s1"/"k8s4"等)をデフォルト値として使い、SSH接続先として解決していたが、
このbareホスト名はどのDNSインフラ(Knot DNS authority/kresd/CoreDNS)にも
存在しないレコードだった。kigawa.net.zoneにもk8s1.kigawa.net等のAレコードは
無く、k8s.kigawa.net(CNAME/A)のみが存在していた。

これまで動いていたのは、手動で/etc/hostsを設定済みの管理マシンから実行
されていたためと考えられ、IaCで管理されたCI Runner(Kubernetes Pod)からは
"ssh: Could not resolve hostname k8s1"で失敗していた
(kigawa-net/kinfraの変更検出フィルタ実地検証中、k8s-worker3のjoin_infoで発覚)。

- hardware/zones/kigawa.net.zone: k8s1(10.0.0.103)/k8s2(10.0.0.120)/
  k8s4(10.0.0.140)のAレコードを追加(docs/network.mdの静的割当IPを使用)
- hardware/{k8s1,k8s2,k8s4,k8s-worker3,k8s-worker5}/variables.tf:
  control_plane_hostのデフォルト値をbareホスト名からFQDN
  (例: "k8s1" → "k8s1.kigawa.net")に変更

ゾーンの変更はk8s1/k8s2/k8s4上のKnot DNSにterraform apply(each moduleの
knotサブモジュール経由)で反映される。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

Terraform Plan hardware/k8s-worker3

data.external.ssh_key: Reading...
data.external.sudo_password: Reading...
data.external.join_info: Reading...
data.external.sudo_password: Read complete after 1s [id=-]
data.external.ssh_key: Read complete after 1s [id=-]
data.external.join_info: Still reading... [10s elapsed]
data.external.join_info: Still reading... [20s elapsed]
data.external.join_info: Still reading... [30s elapsed]
data.external.join_info: Still reading... [40s elapsed]
data.external.join_info: Still reading... [50s elapsed]
data.external.join_info: Still reading... [1m0s elapsed]
data.external.join_info: Still reading... [1m10s elapsed]
data.external.join_info: Still reading... [1m20s elapsed]
data.external.join_info: Still reading... [1m30s elapsed]
data.external.join_info: Still reading... [1m40s elapsed]
data.external.join_info: Still reading... [1m50s elapsed]
data.external.join_info: Still reading... [2m0s elapsed]
data.external.join_info: Still reading... [2m10s elapsed]
data.external.join_info: Still reading... [2m20s elapsed]
data.external.join_info: Still reading... [2m30s elapsed]
data.external.join_info: Still reading... [2m40s elapsed]
data.external.join_info: Still reading... [2m50s elapsed]
data.external.join_info: Still reading... [3m0s elapsed]
data.external.join_info: Still reading... [3m10s elapsed]
data.external.join_info: Still reading... [3m20s elapsed]
data.external.join_info: Still reading... [3m30s elapsed]
data.external.join_info: Still reading... [3m40s elapsed]
data.external.join_info: Still reading... [3m50s elapsed]
data.external.join_info: Still reading... [4m0s elapsed]
data.external.join_info: Still reading... [4m10s elapsed]
data.external.join_info: Still reading... [4m20s elapsed]
data.external.join_info: Still reading... [4m30s elapsed]
data.external.join_info: Read complete after 4m33s [id=-]
null_resource.worker_node: Refreshing state... [id=1921248082511887334]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
-/+ destroy and then create replacement

Terraform planned the following actions, but then encountered a problem:

  # null_resource.worker_node must be replaced
-/+ resource "null_resource" "worker_node" {
      ~ id       = "1921248082511887334" -> (known after apply)
      ~ triggers = { # forces replacement
          ~ "ca_cert_hash"  = "sha256:6115df9d7965c06d99704d9b20a4d2783c2293c729415528429795f2aa8566e8" -> ""
          ~ "token"         = "nb388k.zbhl56o3564uzl7f" -> ""
            # (2 unchanged elements hidden)
        }
    }

Plan: 1 to add, 0 to change, 1 to destroy.

Error: Resource postcondition failed

  on main.tf line 149, in resource "null_resource" "worker_node":
 149:       condition     = length(self.triggers.token) > 0
    ├────────────────
    │ self.triggers.token is ""

join_info did not return a token

Error: Resource postcondition failed

  on main.tf line 153, in resource "null_resource" "worker_node":
 153:       condition     = length(self.triggers.ca_cert_hash) > 0
    ├────────────────
    │ self.triggers.ca_cert_hash is ""

join_info did not return a ca_cert_hash

@github-actions

Copy link
Copy Markdown

Terraform Plan hardware/k8s-worker5

data.external.ssh_key: Reading...
data.external.join_info: Reading...
data.external.sudo_password: Reading...
data.external.ssh_key: Read complete after 0s [id=-]
data.external.sudo_password: Read complete after 0s [id=-]
data.external.join_info: Still reading... [10s elapsed]
data.external.join_info: Still reading... [20s elapsed]
data.external.join_info: Still reading... [30s elapsed]
data.external.join_info: Still reading... [40s elapsed]
data.external.join_info: Still reading... [50s elapsed]
data.external.join_info: Still reading... [1m0s elapsed]
data.external.join_info: Still reading... [1m10s elapsed]
data.external.join_info: Still reading... [1m20s elapsed]
data.external.join_info: Still reading... [1m30s elapsed]
data.external.join_info: Still reading... [1m40s elapsed]
data.external.join_info: Still reading... [1m50s elapsed]
data.external.join_info: Still reading... [2m0s elapsed]
data.external.join_info: Still reading... [2m10s elapsed]
data.external.join_info: Still reading... [2m20s elapsed]
data.external.join_info: Still reading... [2m30s elapsed]
data.external.join_info: Still reading... [2m40s elapsed]
data.external.join_info: Still reading... [2m50s elapsed]
data.external.join_info: Still reading... [3m0s elapsed]
data.external.join_info: Still reading... [3m10s elapsed]
data.external.join_info: Still reading... [3m20s elapsed]
data.external.join_info: Still reading... [3m30s elapsed]
data.external.join_info: Still reading... [3m40s elapsed]
data.external.join_info: Still reading... [3m50s elapsed]
data.external.join_info: Still reading... [4m0s elapsed]
data.external.join_info: Still reading... [4m10s elapsed]
data.external.join_info: Still reading... [4m20s elapsed]
data.external.join_info: Still reading... [4m30s elapsed]
data.external.join_info: Read complete after 4m32s [id=-]
null_resource.worker_node: Refreshing state... [id=2183205705926198087]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # module.node_exporter.null_resource.node_exporter will be created
  + resource "null_resource" "node_exporter" {
      + id       = (known after apply)
      + triggers = {
          + "host"           = "192.168.1.150"
          + "listen_address" = ":9100"
          + "version"        = "1.7.0"
        }
    }

Plan: 1 to add, 0 to change, 0 to destroy.

─────────────────────────────────────────────────────────────────────────────

Saved the plan to: tfplan

To perform exactly these actions, run the following command to apply:
    terraform apply "tfplan"

@github-actions

Copy link
Copy Markdown

Terraform Plan hardware/k8s1

data.external.sudo_password: Reading...
data.external.ssh_key: Reading...
data.external.join_info: Reading...
data.external.ssh_key: Read complete after 0s [id=-]
data.external.sudo_password: Read complete after 0s [id=-]
module.control_plane.null_resource.disable_swap: Refreshing state... [id=2884415110834909690]
module.keepalived.null_resource.keepalived: Refreshing state... [id=7637171177745551209]
module.wireguard[0].null_resource.wireguard: Refreshing state... [id=6656762921329990223]
data.external.join_info: Still reading... [10s elapsed]
data.external.join_info: Still reading... [20s elapsed]
data.external.join_info: Still reading... [30s elapsed]
data.external.join_info: Still reading... [40s elapsed]
data.external.join_info: Read complete after 41s [id=-]
module.control_plane.null_resource.control_plane: Refreshing state... [id=8957225143565195658]
module.kube_vip.null_resource.kube_vip: Refreshing state... [id=3972940073172515771]
module.knot.null_resource.knot: Refreshing state... [id=1087168737206409085]
module.bgp.null_resource.bird: Refreshing state... [id=7710895868079908516]
module.knot_resolver.null_resource.knot_resolver: Refreshing state... [id=6307309063132079256]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create
  - destroy

Terraform will perform the following actions:

  # module.node_exporter.null_resource.node_exporter will be created
  + resource "null_resource" "node_exporter" {
      + id       = (known after apply)
      + triggers = {
          + "host"           = "192.168.1.103"
          + "listen_address" = ":9100"
          + "version"        = "1.7.0"
        }
    }

  # module.wireguard[0].null_resource.wireguard will be destroyed
  # (because module.wireguard[0] is not in configuration)
  - resource "null_resource" "wireguard" {
      - id       = "6656762921329990223" -> null
      - triggers = {
          - "allowed_ips"       = "172.31.255.0/24"
          - "host"              = "192.168.1.103"
          - "server_endpoint"   = "161.248.62.66:51820"
          - "server_public_key" = "70061113b24f5ac462235f3907f5c5ceb69b318024f6465c4d1ad4ce77a348b3"
          - "setup_version"     = "3"
          - "wireguard_address" = "172.31.255.11/24"
        } -> null
    }

Plan: 1 to add, 0 to change, 1 to destroy.

─────────────────────────────────────────────────────────────────────────────

Saved the plan to: tfplan

To perform exactly these actions, run the following command to apply:
    terraform apply "tfplan"

@github-actions

Copy link
Copy Markdown

Terraform Plan hardware/k8s2

data.external.join_info: Reading...
data.external.ssh_key: Reading...
data.external.sudo_password: Reading...
data.external.ssh_key: Read complete after 0s [id=-]
data.external.sudo_password: Read complete after 0s [id=-]
module.control_plane.null_resource.disable_swap: Refreshing state... [id=2078522867301445248]
module.wireguard[0].null_resource.wireguard: Refreshing state... [id=2269961954052301461]
module.keepalived.null_resource.keepalived: Refreshing state... [id=77951099548562352]
data.external.join_info: Still reading... [10s elapsed]
data.external.join_info: Still reading... [20s elapsed]
data.external.join_info: Still reading... [30s elapsed]
data.external.join_info: Still reading... [40s elapsed]
data.external.join_info: Still reading... [50s elapsed]
data.external.join_info: Still reading... [1m0s elapsed]
data.external.join_info: Still reading... [1m10s elapsed]
data.external.join_info: Still reading... [1m20s elapsed]
data.external.join_info: Still reading... [1m30s elapsed]
data.external.join_info: Still reading... [1m40s elapsed]
data.external.join_info: Still reading... [1m50s elapsed]
data.external.join_info: Still reading... [2m0s elapsed]
data.external.join_info: Still reading... [2m10s elapsed]
data.external.join_info: Still reading... [2m20s elapsed]
data.external.join_info: Still reading... [2m30s elapsed]
data.external.join_info: Still reading... [2m40s elapsed]
data.external.join_info: Still reading... [2m50s elapsed]
data.external.join_info: Still reading... [3m0s elapsed]
data.external.join_info: Still reading... [3m10s elapsed]
data.external.join_info: Still reading... [3m20s elapsed]
data.external.join_info: Still reading... [3m30s elapsed]
data.external.join_info: Still reading... [3m40s elapsed]
data.external.join_info: Still reading... [3m50s elapsed]
data.external.join_info: Still reading... [4m0s elapsed]
data.external.join_info: Still reading... [4m10s elapsed]
data.external.join_info: Still reading... [4m20s elapsed]
data.external.join_info: Still reading... [4m30s elapsed]
data.external.join_info: Still reading... [4m40s elapsed]
data.external.join_info: Still reading... [4m50s elapsed]
data.external.join_info: Still reading... [5m0s elapsed]
data.external.join_info: Still reading... [5m10s elapsed]
data.external.join_info: Still reading... [5m20s elapsed]
data.external.join_info: Still reading... [5m30s elapsed]
data.external.join_info: Still reading... [5m40s elapsed]
data.external.join_info: Still reading... [5m50s elapsed]
data.external.join_info: Still reading... [6m0s elapsed]
data.external.join_info: Still reading... [6m10s elapsed]
data.external.join_info: Still reading... [6m20s elapsed]
data.external.join_info: Still reading... [6m30s elapsed]
data.external.join_info: Still reading... [6m40s elapsed]
data.external.join_info: Still reading... [6m50s elapsed]
data.external.join_info: Still reading... [7m0s elapsed]
data.external.join_info: Still reading... [7m10s elapsed]
data.external.join_info: Still reading... [7m20s elapsed]
data.external.join_info: Still reading... [7m30s elapsed]
data.external.join_info: Still reading... [7m40s elapsed]
data.external.join_info: Still reading... [7m50s elapsed]
data.external.join_info: Still reading... [8m0s elapsed]
data.external.join_info: Still reading... [8m10s elapsed]
data.external.join_info: Still reading... [8m20s elapsed]
data.external.join_info: Still reading... [8m30s elapsed]
data.external.join_info: Still reading... [8m40s elapsed]
data.external.join_info: Still reading... [8m50s elapsed]
data.external.join_info: Still reading... [9m0s elapsed]
data.external.join_info: Read complete after 9m2s [id=-]
module.control_plane.null_resource.control_plane: Refreshing state... [id=3058245187027734364]
module.knot.null_resource.knot: Refreshing state... [id=298362026524776807]
module.kube_vip.null_resource.kube_vip: Refreshing state... [id=4617693817191532127]
module.bgp.null_resource.bird: Refreshing state... [id=6967168182303976108]
module.knot_resolver.null_resource.knot_resolver: Refreshing state... [id=4610183504413275223]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create
  - destroy

Terraform will perform the following actions:

  # module.node_exporter.null_resource.node_exporter will be created
  + resource "null_resource" "node_exporter" {
      + id       = (known after apply)
      + triggers = {
          + "host"           = "192.168.1.20"
          + "listen_address" = ":9100"
          + "version"        = "1.7.0"
        }
    }

  # module.wireguard[0].null_resource.wireguard will be destroyed
  # (because module.wireguard[0] is not in configuration)
  - resource "null_resource" "wireguard" {
      - id       = "2269961954052301461" -> null
      - triggers = {
          - "allowed_ips"       = "172.31.255.0/24"
          - "host"              = "192.168.1.20"
          - "server_endpoint"   = "161.248.62.66:51820"
          - "server_public_key" = "70061113b24f5ac462235f3907f5c5ceb69b318024f6465c4d1ad4ce77a348b3"
          - "setup_version"     = "3"
          - "wireguard_address" = "172.31.255.12/24"
        } -> null
    }

Plan: 1 to add, 0 to change, 1 to destroy.

─────────────────────────────────────────────────────────────────────────────

Saved the plan to: tfplan

To perform exactly these actions, run the following command to apply:
    terraform apply "tfplan"

@github-actions

Copy link
Copy Markdown

Terraform Plan hardware/k8s4

data.external.inuyama_wireguard_private_key: Reading...
data.external.ssh_key: Reading...
data.external.sudo_password: Reading...
data.external.inuyama_wireguard_public_key: Reading...
data.external.join_info: Reading...
data.external.sudo_password: Read complete after 1s [id=-]
data.external.inuyama_wireguard_public_key: Read complete after 1s [id=-]
data.external.ssh_key: Read complete after 1s [id=-]
module.control_plane.null_resource.disable_swap: Refreshing state... [id=2329390693052091540]
data.external.inuyama_wireguard_private_key: Read complete after 1s [id=-]
data.external.join_info: Still reading... [10s elapsed]
data.external.join_info: Still reading... [20s elapsed]
data.external.join_info: Still reading... [30s elapsed]
data.external.join_info: Still reading... [40s elapsed]
data.external.join_info: Still reading... [50s elapsed]
data.external.join_info: Still reading... [1m0s elapsed]
data.external.join_info: Still reading... [1m10s elapsed]
data.external.join_info: Still reading... [1m20s elapsed]
data.external.join_info: Still reading... [1m30s elapsed]
data.external.join_info: Still reading... [1m40s elapsed]
data.external.join_info: Still reading... [1m50s elapsed]
data.external.join_info: Still reading... [2m0s elapsed]
data.external.join_info: Still reading... [2m10s elapsed]
data.external.join_info: Still reading... [2m20s elapsed]
data.external.join_info: Still reading... [2m30s elapsed]
data.external.join_info: Still reading... [2m41s elapsed]
data.external.join_info: Still reading... [2m51s elapsed]
data.external.join_info: Still reading... [3m1s elapsed]
data.external.join_info: Still reading... [3m11s elapsed]
data.external.join_info: Still reading... [3m21s elapsed]
data.external.join_info: Still reading... [3m31s elapsed]
data.external.join_info: Still reading... [3m41s elapsed]
data.external.join_info: Still reading... [3m51s elapsed]
data.external.join_info: Still reading... [4m1s elapsed]
data.external.join_info: Still reading... [4m11s elapsed]
data.external.join_info: Still reading... [4m21s elapsed]
data.external.join_info: Still reading... [4m31s elapsed]
data.external.join_info: Still reading... [4m41s elapsed]
data.external.join_info: Still reading... [4m51s elapsed]
data.external.join_info: Still reading... [5m1s elapsed]
data.external.join_info: Still reading... [5m11s elapsed]
data.external.join_info: Still reading... [5m21s elapsed]
data.external.join_info: Still reading... [5m31s elapsed]
data.external.join_info: Still reading... [5m41s elapsed]
data.external.join_info: Still reading... [5m51s elapsed]
data.external.join_info: Still reading... [6m1s elapsed]
data.external.join_info: Still reading... [6m11s elapsed]
data.external.join_info: Still reading... [6m21s elapsed]
data.external.join_info: Still reading... [6m31s elapsed]
data.external.join_info: Still reading... [6m41s elapsed]
data.external.join_info: Still reading... [6m51s elapsed]
data.external.join_info: Still reading... [7m1s elapsed]
data.external.join_info: Still reading... [7m11s elapsed]
data.external.join_info: Still reading... [7m21s elapsed]
data.external.join_info: Still reading... [7m31s elapsed]
data.external.join_info: Still reading... [7m41s elapsed]
data.external.join_info: Still reading... [7m51s elapsed]
data.external.join_info: Still reading... [8m1s elapsed]
data.external.join_info: Still reading... [8m11s elapsed]
data.external.join_info: Still reading... [8m21s elapsed]
data.external.join_info: Still reading... [8m31s elapsed]
data.external.join_info: Still reading... [8m41s elapsed]
data.external.join_info: Still reading... [8m51s elapsed]
data.external.join_info: Read complete after 9m0s [id=-]
module.control_plane.null_resource.control_plane: Refreshing state... [id=5585367606577211439]
null_resource.alice_gateway_services: Refreshing state... [id=1072532008218401708]
null_resource.inuyama_wireguard: Refreshing state... [id=3885716026194835594]
module.knot.null_resource.knot: Refreshing state... [id=6183639464161112917]
module.kube_vip.null_resource.kube_vip: Refreshing state... [id=6160400128829816737]
module.knot_resolver.null_resource.knot_resolver: Refreshing state... [id=420020468497207407]
module.bgp.null_resource.bird: Refreshing state... [id=158986863230925580]

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
  + create
-/+ destroy and then create replacement

Terraform will perform the following actions:

  # null_resource.alice_gateway_services must be replaced
-/+ resource "null_resource" "alice_gateway_services" {
      ~ id       = "1072532008218401708" -> (known after apply)
      ~ triggers = { # forces replacement
          ~ "ingress_vip"            = "192.168.1.240" -> "10.0.0.240"
          ~ "metallb_base_range"     = "192.168.1.50-192.168.1.99" -> "10.0.0.50-10.0.0.99"
          ~ "metallb_reserved_range" = "192.168.1.240-192.168.1.249" -> "10.0.0.240-10.0.0.249"
          ~ "minecraft_vip"          = "192.168.1.241" -> "10.0.0.241"
            # (3 unchanged elements hidden)
        }
    }

  # module.bgp.null_resource.bird must be replaced
-/+ resource "null_resource" "bird" {
      ~ id       = "158986863230925580" -> (known after apply)
      ~ triggers = { # forces replacement
          ~ "advertised_vips" = "192.168.1.53" -> "10.0.0.53"
          ~ "bird_conf"       = <<-EOT
                log syslog all;
                
              - router id 192.168.1.120;
              + router id 10.0.0.140;
                
                protocol device {}
                
                protocol direct {
                  ipv4;
                }
                
                protocol kernel {
                  ipv4 {
                    export all;
                    import all;
                  };
                  learn;
                  persist;
                }
                
                protocol bgp peer0 {
              -   local 192.168.1.120 as 65000;
              -   neighbor 192.168.1.103 as 65000;
              +   local 10.0.0.140 as 65000;
              +   neighbor 10.0.0.103 as 65000;
                  ipv4 {
                    import all;
                    export all;
                  };
                }
                
                protocol bgp peer1 {
              -   local 192.168.1.120 as 65000;
              -   neighbor 192.168.1.20 as 65000;
              +   local 10.0.0.140 as 65000;
              +   neighbor 10.0.0.120 as 65000;
                  ipv4 {
                    import all;
                    export all;
                  };
                }
                
                protocol static local_vips {
                  ipv4;
              -   route 192.168.1.53/32 blackhole;
              +   route 10.0.0.53/32 blackhole;
                }
                
                protocol bgp external0 {
                  local 172.31.255.1 as 65010;
                  neighbor 172.31.255.2 as 65020;
                  ipv4 {
                    import filter {
                
                      reject;
                    };
                    export filter {
              -       if net = 192.168.1.0/24 then accept;
              +       if net = 10.0.0.0/16 then accept;
                      reject;
                    };
                  };
                }
                
                protocol bgp kube_vip {
                  local 127.0.0.2 as 65000;
                  neighbor 127.0.0.1 as 65001;
                  multihop;
                  passive on;
                  ipv4 {
                    import filter {
              -       bgp_next_hop = 192.168.1.120;
              +       bgp_next_hop = 10.0.0.140;
                      accept;
                    };
                    export none;
                  };
                }
            EOT
          ~ "external_peers"  = jsonencode(
              ~ [
                  ~ {
                      ~ export_prefixes = [
                          - "192.168.1.0/24",
                          + "10.0.0.0/16",
                        ]
                        # (5 unchanged attributes hidden)
                    },
                ]
            )
          ~ "pod_yaml"        = <<-EOT
                apiVersion: v1
                kind: Pod
                metadata:
                  name: bird
                  namespace: kube-system
                  annotations:
              -     config-hash: "db9aaa663fb169a42c76932ec34f14d43fcf2898df26a1082eb594c11b175fea"
              +     config-hash: "381fe9e684b9a72325c5ba64a94bc8df5318e7b70d956f26df437f736afedcbc"
                spec:
                  hostNetwork: true
                  priorityClassName: system-node-critical
                  containers:
                  - name: bird
                    image: kathara/bird2:latest
                    command: ["bird", "-f", "-c", "/etc/bird/bird.conf"]
                    securityContext:
                      capabilities:
                        add:
                        - NET_ADMIN
                        - NET_RAW
                    volumeMounts:
                    - name: bird-config
                      mountPath: /etc/bird
                      readOnly: true
                    - name: bird-run
                      mountPath: /var/run/bird
                  volumes:
                  - name: bird-config
                    hostPath:
                      path: /etc/bird
                      type: DirectoryOrCreate
                  - name: bird-run
                    hostPath:
                      path: /var/run/bird
                      type: DirectoryOrCreate
            EOT
            # (2 unchanged elements hidden)
        }
    }

  # module.keepalived.null_resource.keepalived will be created
  + resource "null_resource" "keepalived" {
      + id       = (known after apply)
      + triggers = {
          + "conf_hash" = "438a7827e984a7b9c95481d31fb7d7ccf146dd3927bdad5e3b64337d26914b47"
          + "host"      = "192.168.1.120"
        }
    }

  # module.knot_resolver.null_resource.knot_resolver must be replaced
-/+ resource "null_resource" "knot_resolver" {
      ~ id       = "420020468497207407" -> (known after apply)
      ~ triggers = { # forces replacement
          ~ "kresd_conf" = <<-EOT
                logging:
                  level: notice
                
                network:
                  listen:
                    - interface: "0.0.0.0@53"
                    - interface: "0.0.0.0@853"
                      kind: dot
              +     - interface: "10.0.0.53@53"
                
                cache:
                  size-max: 512M
                  storage: /var/cache/knot-resolver
                
                forward:
                  - subtree: "cluster.local."
                    servers:
                      - "10.96.0.10"
                  - subtree: "haproxy.kigawa.net."
                    servers:
                      - "127.0.0.1@5353"
                  - subtree: "k8s.kigawa.net."
                    servers:
                      - "127.0.0.1@5353"
                  - subtree: "mod.kigawa.net."
                    servers:
                      - "127.0.0.1@5353"
                  - subtree: "oyu.kigawa.net."
                    servers:
                      - "127.0.0.1@5353"
                  - subtree: "kizuna.kigawa.net."
                    servers:
                      - "127.0.0.1@5353"
                  - subtree: "atm10.kigawa.net."
                    servers:
                      - "127.0.0.1@5353"
                  - subtree: "kigawa.net."
                    servers:
                      - "127.0.0.1@5353"
                  - subtree: "onemc.world."
                    servers:
                      - "127.0.0.1@5353"
                  - subtree: "."
                    servers:
              -       - 8.8.8.8
              -       - 8.8.4.4
                      - 1.1.1.1
                      - 1.0.0.1
              +       - 8.8.8.8
              +       - 8.8.4.4
            EOT
            # (1 unchanged element hidden)
        }
    }

  # module.kube_vip.null_resource.kube_vip must be replaced
-/+ resource "null_resource" "kube_vip" {
      ~ id       = "6160400128829816737" -> (known after apply)
      ~ triggers = { # forces replacement
          ~ "pod_yaml"  = <<-EOT
                apiVersion: v1
                kind: Pod
                metadata:
                  name: kube-vip
                  namespace: kube-system
                spec:
                  containers:
                  - name: kube-vip
                    image: ghcr.io/kube-vip/kube-vip:v0.8.9
                    imagePullPolicy: IfNotPresent
                    args:
                    - manager
                    env:
                    - name: vip_arp
              -       value: "true"
              +       value: "false"
                    - name: bgp_enable
                      value: "true"
                    - name: bgp_routerid
              -       value: 192.168.1.100
              +       value: 10.0.0.100
                    - name: bgp_as
                      value: "65001"
                    - name: bgp_peeraddress
                      value: "127.0.0.2"
                    - name: bgp_peeras
                      value: "65000"
                    - name: PORT
                      value: "6443"
                    - name: vip_interface
                      value: ens18
                    - name: address
              -       value: 192.168.1.100
              +       value: 10.0.0.100
                    - name: cp_enable
                      value: "true"
                    - name: cp_namespace
                      value: kube-system
                    - name: vip_leaderelection
                      value: "true"
                    securityContext:
                      capabilities:
                        add:
                        - NET_ADMIN
                        - NET_RAW
                        - SYS_TIME
                    volumeMounts:
                    - mountPath: /etc/kubernetes/admin.conf
                      name: kubeconfig
                      readOnly: true
                  hostNetwork: true
                  hostAliases:
              -   - ip: 192.168.1.104
              +   - ip: 10.0.0.100
                    hostnames:
                    - kubernetes
                  volumes:
                  - hostPath:
                      path: /etc/kubernetes/admin.conf
                    name: kubeconfig
            EOT
          ~ "vip"       = "192.168.1.100" -> "10.0.0.100"
            # (2 unchanged elements hidden)
        }
    }

  # module.node_exporter.null_resource.node_exporter will be created
  + resource "null_resource" "node_exporter" {
      + id       = (known after apply)
      + triggers = {
          + "host"           = "192.168.1.120"
          + "listen_address" = ":9100"
          + "version"        = "1.7.0"
        }
    }

Plan: 6 to add, 0 to change, 4 to destroy.

─────────────────────────────────────────────────────────────────────────────

Saved the plan to: tfplan

To perform exactly these actions, run the following command to apply:
    terraform apply "tfplan"

@github-actions

Copy link
Copy Markdown

Terraform Plan hardware/zones

Error: No configuration files

Plan requires configuration to be present. Planning without a configuration
would mark everything for destruction, which is normally not what is desired.
If you would like to destroy everything, run plan with the -destroy option.
Otherwise, create a Terraform configuration file (.tf file) and try again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant