[{"data":1,"prerenderedAt":2923},["ShallowReactive",2],{"navigation":3,"\u002Fblog\u002F2025\u002Fkubernetes-ipv6-only-for-real-in-good-this-time":508,"\u002Fblog\u002F2025\u002Fkubernetes-ipv6-only-for-real-in-good-this-time-surround":2917},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9},"Docs","i-ph-book-open","\u002Fdocs","1.docs",[10,12,23,63,73,99,123,214,279,287,326,394,420,482],{"title":5,"path":7,"stem":11},"1.docs\u002Findex",{"title":13,"icon":14,"path":15,"stem":16,"children":17,"page":22},"Coffee","i-ph-coffee-bean","\u002Fdocs\u002Fcoffee","1.docs\u002Fcoffee",[18],{"title":19,"path":20,"stem":21},"Shops","\u002Fdocs\u002Fcoffee\u002Fshops","1.docs\u002Fcoffee\u002Fshops",false,{"title":24,"icon":25,"path":26,"stem":27,"children":28,"page":22},"Databases","i-ph-database","\u002Fdocs\u002Fdatabases","1.docs\u002Fdatabases",[29,33],{"title":30,"path":31,"stem":32},"MongoDB","\u002Fdocs\u002Fdatabases\u002Fmongodb","1.docs\u002Fdatabases\u002Fmongodb",{"title":34,"icon":35,"path":36,"stem":37,"children":38,"page":22},"MySQL","i-simple-icons-mysql","\u002Fdocs\u002Fdatabases\u002Fmysql","1.docs\u002Fdatabases\u002Fmysql",[39,43,47,51,55,59],{"title":40,"path":41,"stem":42},"Cheat Sheet","\u002Fdocs\u002Fdatabases\u002Fmysql\u002Fcheat-sheet","1.docs\u002Fdatabases\u002Fmysql\u002Fcheat-sheet",{"title":44,"path":45,"stem":46},"event_scheduler","\u002Fdocs\u002Fdatabases\u002Fmysql\u002Fevent_scheduler","1.docs\u002Fdatabases\u002Fmysql\u002Fevent_scheduler",{"title":48,"path":49,"stem":50},"init_file: Run SQL file on startup","\u002Fdocs\u002Fdatabases\u002Fmysql\u002Finit_file","1.docs\u002Fdatabases\u002Fmysql\u002Finit_file",{"title":52,"path":53,"stem":54},"MariaDB","\u002Fdocs\u002Fdatabases\u002Fmysql\u002Fmariadb","1.docs\u002Fdatabases\u002Fmysql\u002Fmariadb",{"title":56,"path":57,"stem":58},"Pitfalls","\u002Fdocs\u002Fdatabases\u002Fmysql\u002Fpitfalls","1.docs\u002Fdatabases\u002Fmysql\u002Fpitfalls",{"title":60,"path":61,"stem":62},"Slow Log","\u002Fdocs\u002Fdatabases\u002Fmysql\u002Fslow-log","1.docs\u002Fdatabases\u002Fmysql\u002Fslow-log",{"title":64,"icon":65,"path":66,"stem":67,"children":68,"page":22},"Development","i-ph-code","\u002Fdocs\u002Fdevelopment","1.docs\u002Fdevelopment",[69],{"title":70,"path":71,"stem":72},"Protobuf \u002F gRPC","\u002Fdocs\u002Fdevelopment\u002Fprotobuf","1.docs\u002Fdevelopment\u002Fprotobuf",{"title":74,"icon":75,"path":76,"stem":77,"children":78,"page":22},"General","i-ph-wrench","\u002Fdocs\u002Fgeneral","1.docs\u002Fgeneral",[79,83,87,91,95],{"title":80,"path":81,"stem":82},"ADB","\u002Fdocs\u002Fgeneral\u002Fadb","1.docs\u002Fgeneral\u002Fadb",{"title":84,"path":85,"stem":86},"VS Codium","\u002Fdocs\u002Fgeneral\u002Fcodium","1.docs\u002Fgeneral\u002Fcodium",{"title":88,"path":89,"stem":90},"OpenSSL","\u002Fdocs\u002Fgeneral\u002Fopenssl","1.docs\u002Fgeneral\u002Fopenssl",{"title":92,"path":93,"stem":94},"Projects, Tools and Utilites","\u002Fdocs\u002Fgeneral\u002Ftools-utilities","1.docs\u002Fgeneral\u002Ftools-utilities",{"title":96,"path":97,"stem":98},"Online Tools","\u002Fdocs\u002Fgeneral\u002Fuseful-online-tools","1.docs\u002Fgeneral\u002Fuseful-online-tools",{"title":100,"icon":101,"path":102,"stem":103,"children":104,"page":22},"Hassio","i-simple-icons-homeassistant","\u002Fdocs\u002Fhassio","1.docs\u002Fhassio",[105,115,119],{"title":106,"icon":107,"path":108,"stem":109,"children":110,"page":22},"ESPHome","i-simple-icons-esphome","\u002Fdocs\u002Fhassio\u002Fesphome","1.docs\u002Fhassio\u002Fesphome",[111],{"title":112,"path":113,"stem":114},"Voltage - ADC","\u002Fdocs\u002Fhassio\u002Fesphome\u002Fvoltage-adc","1.docs\u002Fhassio\u002Fesphome\u002Fvoltage-adc",{"title":116,"path":117,"stem":118},"Raspberry Pi","\u002Fdocs\u002Fhassio\u002Fraspberrypi","1.docs\u002Fhassio\u002Fraspberrypi",{"title":120,"path":121,"stem":122},"Zigbee2MQTT","\u002Fdocs\u002Fhassio\u002Fzigbee2mqtt","1.docs\u002Fhassio\u002Fzigbee2mqtt",{"title":124,"icon":125,"path":126,"stem":127,"children":128,"page":22},"Kubernetes","i-simple-icons-kubernetes","\u002Fdocs\u002Fkubernetes","1.docs\u002Fkubernetes",[129,133,136,140,157,161,165,175,188,192,210],{"title":130,"path":131,"stem":132},"Certificates","\u002Fdocs\u002Fkubernetes\u002Fcertificates","1.docs\u002Fkubernetes\u002Fcertificates",{"title":40,"path":134,"stem":135},"\u002Fdocs\u002Fkubernetes\u002Fcheat-sheet","1.docs\u002Fkubernetes\u002Fcheat-sheet",{"title":137,"path":138,"stem":139},"Cluster Components Upgrade Order","\u002Fdocs\u002Fkubernetes\u002Fcluster-components-upgrade-order","1.docs\u002Fkubernetes\u002Fcluster-components-upgrade-order",{"title":141,"icon":142,"path":143,"stem":144,"children":145,"page":22},"Etcd","i-simple-icons-etcd","\u002Fdocs\u002Fkubernetes\u002Fetcd","1.docs\u002Fkubernetes\u002Fetcd",[146,149,153],{"title":40,"path":147,"stem":148},"\u002Fdocs\u002Fkubernetes\u002Fetcd\u002Fcheat-sheet","1.docs\u002Fkubernetes\u002Fetcd\u002Fcheat-sheet",{"title":150,"path":151,"stem":152},"Editing Kubernetes Objects","\u002Fdocs\u002Fkubernetes\u002Fetcd\u002Fediting-kubernetes-objects","1.docs\u002Fkubernetes\u002Fetcd\u002Fediting-kubernetes-objects",{"title":154,"path":155,"stem":156},"Snapshots: Save & Restore","\u002Fdocs\u002Fkubernetes\u002Fetcd\u002Fsnapshots-save-restore","1.docs\u002Fkubernetes\u002Fetcd\u002Fsnapshots-save-restore",{"title":158,"path":159,"stem":160},"Ingress","\u002Fdocs\u002Fkubernetes\u002Fingress","1.docs\u002Fkubernetes\u002Fingress",{"title":162,"path":163,"stem":164},"kubeadm","\u002Fdocs\u002Fkubernetes\u002Fkubeadm","1.docs\u002Fkubernetes\u002Fkubeadm",{"title":166,"icon":167,"path":168,"stem":169,"children":170,"page":22},"Logging","i-ph-log","\u002Fdocs\u002Fkubernetes\u002Flogging","1.docs\u002Fkubernetes\u002Flogging",[171],{"title":172,"path":173,"stem":174},"Regex","\u002Fdocs\u002Fkubernetes\u002Flogging\u002Fregex","1.docs\u002Fkubernetes\u002Flogging\u002Fregex",{"title":176,"icon":177,"path":178,"stem":179,"children":180,"page":22},"Monitoring","i-ph-binoculars","\u002Fdocs\u002Fkubernetes\u002Fmonitoring","1.docs\u002Fkubernetes\u002Fmonitoring",[181,184],{"title":176,"path":182,"stem":183},"\u002Fdocs\u002Fkubernetes\u002Fmonitoring\u002Fbasics","1.docs\u002Fkubernetes\u002Fmonitoring\u002Fbasics",{"title":185,"path":186,"stem":187},"Components","\u002Fdocs\u002Fkubernetes\u002Fmonitoring\u002Fcomponents","1.docs\u002Fkubernetes\u002Fmonitoring\u002Fcomponents",{"title":189,"path":190,"stem":191},"Kubernetes Name Schemas","\u002Fdocs\u002Fkubernetes\u002Fname-schema","1.docs\u002Fkubernetes\u002Fname-schema",{"title":193,"icon":194,"path":195,"stem":196,"children":197,"page":22},"Networking","i-ph-network","\u002Fdocs\u002Fkubernetes\u002Fnetworking","1.docs\u002Fkubernetes\u002Fnetworking",[198,202,206],{"title":199,"path":200,"stem":201},"Benchmarking","\u002Fdocs\u002Fkubernetes\u002Fnetworking\u002Fbenchmarking","1.docs\u002Fkubernetes\u002Fnetworking\u002Fbenchmarking",{"title":203,"path":204,"stem":205},"Explained","\u002Fdocs\u002Fkubernetes\u002Fnetworking\u002Fexplained","1.docs\u002Fkubernetes\u002Fnetworking\u002Fexplained",{"title":207,"path":208,"stem":209},"Troubleshooting","\u002Fdocs\u002Fkubernetes\u002Fnetworking\u002Ftroubleshooting","1.docs\u002Fkubernetes\u002Fnetworking\u002Ftroubleshooting",{"title":211,"path":212,"stem":213},"System Requirements","\u002Fdocs\u002Fkubernetes\u002Fsystem-requirements","1.docs\u002Fkubernetes\u002Fsystem-requirements",{"title":215,"icon":216,"path":217,"stem":218,"children":219,"page":22},"Linux","i-simple-icons-linux","\u002Fdocs\u002Flinux","1.docs\u002Flinux",[220,224,246,250,268,272,275],{"title":221,"path":222,"stem":223},"git","\u002Fdocs\u002Flinux\u002Fgit","1.docs\u002Flinux\u002Fgit",{"title":225,"path":226,"stem":227,"children":228,"page":22},"GRUB","\u002Fdocs\u002Flinux\u002Fgrub","1.docs\u002Flinux\u002Fgrub",[229,242],{"title":230,"path":231,"stem":232,"children":233,"page":22},"Boot .XYZ File","\u002Fdocs\u002Flinux\u002Fgrub\u002Fbooting-xyz-files","1.docs\u002Flinux\u002Fgrub\u002Fbooting-xyz-files",[234,238],{"title":235,"path":236,"stem":237},".img File","\u002Fdocs\u002Flinux\u002Fgrub\u002Fbooting-xyz-files\u002Fimg-file","1.docs\u002Flinux\u002Fgrub\u002Fbooting-xyz-files\u002Fimg-file",{"title":239,"path":240,"stem":241},".iso File","\u002Fdocs\u002Flinux\u002Fgrub\u002Fbooting-xyz-files\u002Fiso-file","1.docs\u002Flinux\u002Fgrub\u002Fbooting-xyz-files\u002Fiso-file",{"title":243,"path":244,"stem":245},"Preparations for 'Booting XYZ FIle'","\u002Fdocs\u002Flinux\u002Fgrub\u002Fpreparations-for-boot-xyz-file","1.docs\u002Flinux\u002Fgrub\u002Fpreparations-for-boot-xyz-file",{"title":247,"path":248,"stem":249},"mdadm","\u002Fdocs\u002Flinux\u002Fmdam","1.docs\u002Flinux\u002Fmdam",{"title":251,"icon":252,"path":253,"stem":254,"children":255,"page":22},"Nixos","i-simple-icons-nixos","\u002Fdocs\u002Flinux\u002Fnixos","1.docs\u002Flinux\u002Fnixos",[256,260,264],{"title":257,"path":258,"stem":259},"Cleanup Storage","\u002Fdocs\u002Flinux\u002Fnixos\u002Fcleanup","1.docs\u002Flinux\u002Fnixos\u002Fcleanup",{"title":261,"path":262,"stem":263},"Quick NixOS VM","\u002Fdocs\u002Flinux\u002Fnixos\u002Fquick-vm","1.docs\u002Flinux\u002Fnixos\u002Fquick-vm",{"title":265,"path":266,"stem":267},"Update","\u002Fdocs\u002Flinux\u002Fnixos\u002Fupdate","1.docs\u002Flinux\u002Fnixos\u002Fupdate",{"title":269,"path":270,"stem":271},"Quick Commands","\u002Fdocs\u002Flinux\u002Fquick-commands","1.docs\u002Flinux\u002Fquick-commands",{"title":116,"path":273,"stem":274},"\u002Fdocs\u002Flinux\u002Fraspberrypi","1.docs\u002Flinux\u002Fraspberrypi",{"title":276,"path":277,"stem":278},"sysctl","\u002Fdocs\u002Flinux\u002Fsysctl","1.docs\u002Flinux\u002Fsysctl",{"title":166,"icon":167,"path":280,"stem":281,"children":282,"page":22},"\u002Fdocs\u002Flogging","1.docs\u002Flogging",[283],{"title":284,"path":285,"stem":286},"Loki","\u002Fdocs\u002Flogging\u002Floki","1.docs\u002Flogging\u002Floki",{"title":176,"icon":177,"path":288,"stem":289,"children":290,"page":22},"\u002Fdocs\u002Fmonitoring","1.docs\u002Fmonitoring",[291,322],{"title":292,"icon":293,"path":294,"stem":295,"children":296,"page":22},"Prometheus","i-simple-icons-prometheus","\u002Fdocs\u002Fmonitoring\u002Fprometheus","1.docs\u002Fmonitoring\u002Fprometheus",[297,318],{"title":298,"path":299,"stem":300,"children":301,"page":22},"Exporters","\u002Fdocs\u002Fmonitoring\u002Fprometheus\u002Fexporters","1.docs\u002Fmonitoring\u002Fprometheus\u002Fexporters",[302,306,310,314],{"title":303,"path":304,"stem":305},"dellhw_exporter by galexrt","\u002Fdocs\u002Fmonitoring\u002Fprometheus\u002Fexporters\u002Fdellhw_exporter","1.docs\u002Fmonitoring\u002Fprometheus\u002Fexporters\u002Fdellhw_exporter",{"title":307,"path":308,"stem":309},"ethtool_exporter by Showmax","\u002Fdocs\u002Fmonitoring\u002Fprometheus\u002Fexporters\u002Fethtool_exporter","1.docs\u002Fmonitoring\u002Fprometheus\u002Fexporters\u002Fethtool_exporter",{"title":311,"path":312,"stem":313},"node_exporter by Prometheus Project","\u002Fdocs\u002Fmonitoring\u002Fprometheus\u002Fexporters\u002Fnode_exporter","1.docs\u002Fmonitoring\u002Fprometheus\u002Fexporters\u002Fnode_exporter",{"title":315,"path":316,"stem":317},"Other exporters","\u002Fdocs\u002Fmonitoring\u002Fprometheus\u002Fexporters\u002Fothers","1.docs\u002Fmonitoring\u002Fprometheus\u002Fexporters\u002Fothers",{"title":319,"path":320,"stem":321},"Tips","\u002Fdocs\u002Fmonitoring\u002Fprometheus\u002Ftips","1.docs\u002Fmonitoring\u002Fprometheus\u002Ftips",{"title":323,"path":324,"stem":325},"Thanos","\u002Fdocs\u002Fmonitoring\u002Fthanos","1.docs\u002Fmonitoring\u002Fthanos",{"title":193,"icon":194,"path":327,"stem":328,"children":329,"page":22},"\u002Fdocs\u002Fnetworking","1.docs\u002Fnetworking",[330,347,351,363,367],{"title":331,"icon":332,"path":333,"stem":334,"children":335,"page":22},"Cisco","i-simple-icons-cisco","\u002Fdocs\u002Fnetworking\u002Fcisco","1.docs\u002Fnetworking\u002Fcisco",[336,340,343],{"title":337,"path":338,"stem":339},"ACLs","\u002Fdocs\u002Fnetworking\u002Fcisco\u002Facls","1.docs\u002Fnetworking\u002Fcisco\u002Facls",{"title":40,"path":341,"stem":342},"\u002Fdocs\u002Fnetworking\u002Fcisco\u002Fcheat-sheet","1.docs\u002Fnetworking\u002Fcisco\u002Fcheat-sheet",{"title":344,"path":345,"stem":346},"Switch Configuration","\u002Fdocs\u002Fnetworking\u002Fcisco\u002Fswitch-configuration","1.docs\u002Fnetworking\u002Fcisco\u002Fswitch-configuration",{"title":348,"path":349,"stem":350},"Cloudflare","\u002Fdocs\u002Fnetworking\u002Fcloudflare","1.docs\u002Fnetworking\u002Fcloudflare",{"title":352,"path":353,"stem":354,"children":355,"page":22},"Fiber","\u002Fdocs\u002Fnetworking\u002Ffiber","1.docs\u002Fnetworking\u002Ffiber",[356,359],{"title":40,"path":357,"stem":358},"\u002Fdocs\u002Fnetworking\u002Ffiber\u002Fcheat-sheet","1.docs\u002Fnetworking\u002Ffiber\u002Fcheat-sheet",{"title":360,"path":361,"stem":362},"Glossar","\u002Fdocs\u002Fnetworking\u002Ffiber\u002Fglossar","1.docs\u002Fnetworking\u002Ffiber\u002Fglossar",{"title":364,"path":365,"stem":366},"IP-Blocklists","\u002Fdocs\u002Fnetworking\u002Fip-blocklists","1.docs\u002Fnetworking\u002Fip-blocklists",{"title":368,"icon":369,"path":370,"stem":371,"children":372,"page":22},"Mikrotik","i-simple-icons-mikrotik","\u002Fdocs\u002Fnetworking\u002Fmikrotik","1.docs\u002Fnetworking\u002Fmikrotik",[373,376,390],{"title":40,"path":374,"stem":375},"\u002Fdocs\u002Fnetworking\u002Fmikrotik\u002Fcheat-sheet","1.docs\u002Fnetworking\u002Fmikrotik\u002Fcheat-sheet",{"title":377,"icon":378,"path":379,"stem":380,"children":381,"page":22},"DNS","i-mdi-dns","\u002Fdocs\u002Fnetworking\u002Fmikrotik\u002Fdns","1.docs\u002Fnetworking\u002Fmikrotik\u002Fdns",[382,386],{"title":383,"path":384,"stem":385},"Adlists \u002F Blocklists","\u002Fdocs\u002Fnetworking\u002Fmikrotik\u002Fdns\u002Fadlists-blocklists","1.docs\u002Fnetworking\u002Fmikrotik\u002Fdns\u002Fadlists-blocklists",{"title":387,"path":388,"stem":389},"DNS over HTTPS (DOH)","\u002Fdocs\u002Fnetworking\u002Fmikrotik\u002Fdns\u002Fdns-over-https-doh","1.docs\u002Fnetworking\u002Fmikrotik\u002Fdns\u002Fdns-over-https-doh",{"title":391,"path":392,"stem":393},"Example Configs","\u002Fdocs\u002Fnetworking\u002Fmikrotik\u002Fexample-configs","1.docs\u002Fnetworking\u002Fmikrotik\u002Fexample-configs",{"title":395,"icon":396,"path":397,"stem":398,"children":399,"page":22},"Software","i-ph-file-code","\u002Fdocs\u002Fsoftware","1.docs\u002Fsoftware",[400,404,408,412,416],{"title":401,"path":402,"stem":403},"CRI-O","\u002Fdocs\u002Fsoftware\u002Fcrio","1.docs\u002Fsoftware\u002Fcrio",{"title":405,"path":406,"stem":407},"Docker Registry","\u002Fdocs\u002Fsoftware\u002Fdocker-registry","1.docs\u002Fsoftware\u002Fdocker-registry",{"title":409,"path":410,"stem":411},"GitLab CI","\u002Fdocs\u002Fsoftware\u002Fgitlab-ci","1.docs\u002Fsoftware\u002Fgitlab-ci",{"title":413,"path":414,"stem":415},"Harbor Registry","\u002Fdocs\u002Fsoftware\u002Fharbor-registry","1.docs\u002Fsoftware\u002Fharbor-registry",{"title":417,"path":418,"stem":419},"SSH","\u002Fdocs\u002Fsoftware\u002Fssh","1.docs\u002Fsoftware\u002Fssh",{"title":421,"icon":422,"path":423,"stem":424,"children":425,"page":22},"Storage","i-ph-hard-drives","\u002Fdocs\u002Fstorage","1.docs\u002Fstorage",[426,448,456,464],{"title":427,"icon":428,"path":429,"stem":430,"children":431,"page":22},"Ceph","i-simple-icons-ceph","\u002Fdocs\u002Fstorage\u002Fceph","1.docs\u002Fstorage\u002Fceph",[432,436,440,444],{"title":433,"path":434,"stem":435},"Architecture","\u002Fdocs\u002Fstorage\u002Fceph\u002Farchitecture","1.docs\u002Fstorage\u002Fceph\u002Farchitecture",{"title":437,"path":438,"stem":439},"Common Issues","\u002Fdocs\u002Fstorage\u002Fceph\u002Fcommon-issues","1.docs\u002Fstorage\u002Fceph\u002Fcommon-issues",{"title":441,"path":442,"stem":443},"OSDs","\u002Fdocs\u002Fstorage\u002Fceph\u002Fosds","1.docs\u002Fstorage\u002Fceph\u002Fosds",{"title":445,"path":446,"stem":447},"RBD (Block Storage)","\u002Fdocs\u002Fstorage\u002Fceph\u002Frbd","1.docs\u002Fstorage\u002Fceph\u002Frbd",{"title":449,"path":450,"stem":451,"children":452,"page":22},"Gluster","\u002Fdocs\u002Fstorage\u002Fgluster","1.docs\u002Fstorage\u002Fgluster",[453],{"title":437,"path":454,"stem":455},"\u002Fdocs\u002Fstorage\u002Fgluster\u002Fcommon-issues","1.docs\u002Fstorage\u002Fgluster\u002Fcommon-issues",{"title":457,"path":458,"stem":459,"children":460,"page":22},"NFS","\u002Fdocs\u002Fstorage\u002Fnfs","1.docs\u002Fstorage\u002Fnfs",[461],{"title":437,"path":462,"stem":463},"\u002Fdocs\u002Fstorage\u002Fnfs\u002Fcommon-issues","1.docs\u002Fstorage\u002Fnfs\u002Fcommon-issues",{"title":465,"icon":466,"path":467,"stem":468,"children":469,"page":22},"Rook","i-simple-icons-rook","\u002Fdocs\u002Fstorage\u002Frook","1.docs\u002Fstorage\u002Frook",[470,473,476,479],{"title":433,"path":471,"stem":472},"\u002Fdocs\u002Fstorage\u002Frook\u002Farchitecture","1.docs\u002Fstorage\u002Frook\u002Farchitecture",{"title":40,"path":474,"stem":475},"\u002Fdocs\u002Fstorage\u002Frook\u002Fcheat-sheet","1.docs\u002Fstorage\u002Frook\u002Fcheat-sheet",{"title":465,"path":477,"stem":478},"\u002Fdocs\u002Fstorage\u002Frook\u002Fcluster","1.docs\u002Fstorage\u002Frook\u002Fcluster",{"title":437,"path":480,"stem":481},"\u002Fdocs\u002Fstorage\u002Frook\u002Fcommon-issues","1.docs\u002Fstorage\u002Frook\u002Fcommon-issues",{"title":483,"icon":484,"path":485,"stem":486,"children":487,"page":22},"Web","i-ph-browser","\u002Fdocs\u002Fweb","1.docs\u002Fweb",[488,498],{"title":489,"icon":490,"path":491,"stem":492,"children":493,"page":22},"Nuxt","i-simple-icons-nuxt","\u002Fdocs\u002Fweb\u002Fnuxt","1.docs\u002Fweb\u002Fnuxt",[494],{"title":495,"path":496,"stem":497},"Loading Indicator","\u002Fdocs\u002Fweb\u002Fnuxt\u002Floading-indicator","1.docs\u002Fweb\u002Fnuxt\u002Floading-indicator",{"title":499,"icon":500,"path":501,"stem":502,"children":503,"page":22},"Tiptap","i-mdi-file-edit-outline","\u002Fdocs\u002Fweb\u002Ftiptap","1.docs\u002Fweb\u002Ftiptap",[504],{"title":505,"path":506,"stem":507},"Snippets","\u002Fdocs\u002Fweb\u002Ftiptap\u002Fsnippets","1.docs\u002Fweb\u002Ftiptap\u002Fsnippets",{"id":509,"title":510,"authors":511,"badge":517,"body":518,"date":2908,"description":2909,"extension":2910,"image":2911,"meta":2912,"navigation":1253,"path":2913,"seo":2914,"stem":2915,"__hash__":2916},"posts\u002F3.blog\u002F2025\u002Fkubernetes-ipv6-only-for-real-in-good-this-time.md","Kubernetes: IPv6-only For Real In Good This Time",[512],{"name":513,"to":514,"avatar":515},"Alexander Trost","https:\u002F\u002Fgithub.com\u002Fgalexrt",{"src":516},"\u002Fimages\u002Fprofile-picture.jpg",null,{"type":519,"value":520,"toc":2892},"minimark",[521,533,538,541,556,569,573,595,608,611,616,625,648,663,666,692,696,721,724,729,733,736,884,888,891,1186,1190,1193,1197,1203,1206,1611,1618,1677,1681,1690,1699,1835,1842,1896,1900,1909,1958,2203,2408,2566,2572,2811,2817,2821,2832,2835,2840,2865,2868,2872,2879,2888],[522,523,524,525,532],"p",{},"(Photo by ",[526,527,531],"a",{"href":528,"rel":529},"https:\u002F\u002Fwww.pexels.com\u002Fphoto\u002Fperson-holding-logo-of-there-is-no-place-like-home-11035359\u002F",[530],"nofollow","RealToughCandy.com from Pexels.com",", modified to fit the blog post theme)",[534,535,537],"h2",{"id":536},"intro","Intro",[522,539,540],{},"In this blog post I want to share my experience on setting up a Talos Kubernetes cluster that runs using IPv6-only networking. No IPv4 addresses on the servers, no IPv4 addresses on the pods, no IPv4 addresses on the services. Just pure IPv6!",[522,542,543,544,549,550,555],{},"Before I'll dive into config, flags and more, this blog post is heavily based upon ",[526,545,548],{"href":546,"rel":547},"https:\u002F\u002Fdev.to\u002Fsergelogvinov\u002Fkubernetes-pods-with-global-ipv6-1aaj",[530],"\"Kubernetes PODs with global IPv6\" blog post"," by ",[526,551,554],{"href":552,"rel":553},"https:\u002F\u002Fdev.to\u002Fsergelogvinov",[530],"Serge Logvinov on dev.to",".\nIt is about Talos Kubernetes cluster config but still with IPv4 networking enabled. In the grand scheme of things, the config is very similar to what I wanted to achieve, but for IPv6-only networking.",[522,557,558,559,564,565,568],{},"Additionally if you aren't into ",[526,560,563],{"href":561,"rel":562},"https:\u002F\u002Fwww.talos.dev\u002F",[530],"Talos Linux"," (yet), I highly recommend checking it out, the shown configs should be easily adjustable for use with ",[566,567,162],"code",{}," and other cluster deployment tools.",[534,570,572],{"id":571},"the-environment-pinch-a-penny","The Environment - \"Pinch A Penny\"",[522,574,575,576,581,582,586,587,590,591,594],{},"In my case I am using ",[526,577,580],{"href":578,"rel":579},"https:\u002F\u002Fwww.hetzner.com\u002Fcloud",[530],"Hetzner Cloud"," as my cloud provider, which provides native IPv6 support and gives each VM\u002Fserver a ",[583,584,585],"strong",{},"routed"," and ",[583,588,589],{},"publicly reachable"," IPv6 ",[566,592,593],{},"\u002F64"," network.",[596,597,598],"callout",{},[522,599,600,601,586,603,590,605,607],{},"If you want to follow this blog post, make sure that your cloud provider supports IPv6 and gives you a a ",[583,602,585],{},[583,604,589],{},[566,606,593],{}," network for each of your VMs\u002Fservers.",[522,609,610],{},"So why am I \"pinching a penny\"? If I could get a working IPv6-only Kubernetes cluster going, I could save the costs of a public IPv4 address per server. So 0.60€\u002Fmonth per server, which is 7.20€\u002Fyear per server.\nIt's not \"much\" I hear you potentially think? Yes, but the more nodes you run the more you could save, so... ;-)",[612,613,615],"h3",{"id":614},"i-heard-that-github-doesnt-support-ipv6","I heard that GitHub doesn't support IPv6?",[522,617,618,619,624],{},"Yes.., but ",[526,620,623],{"href":621,"rel":622},"https:\u002F\u002Fgithub.com\u002Forgs\u002Fcommunity\u002Fdiscussions\u002F10539",[530],"there is a discussion about it in the GitHub Community"," that is open since 2022 and I know of older discussions\u002Fissues about this topic.",[596,626,627,630,633],{},[522,628,629],{},"Quick side note: If every company would at least slowly start to support IPv6 and take it seriously, I strongly believe that we would be in a much better place regarding IPv6 adoption.\nIt is annoying that a vital service that not just provides container images, but build and release artifacts of many open source projects, doesn't support IPv6.",[522,631,632],{},"I guess there are two mentions I want to make:",[634,635,636,640],"ol",{},[637,638,639],"li",{},"At least GitHub Pages supports IPv6, so that is at least one of (many) parts available over IPv6.",[637,641,642,647],{},[526,643,646],{"href":644,"rel":645},"https:\u002F\u002Fwww.worldipv6launch.org\u002F",[530],"\"World IPv6 Day\" event was held on 08. June 2011",", I hope I don't made you all feel too old.",[522,649,650,651,656,657,662],{},"It's an issue for this setup, because the Talos CCM (Cloud Controller Manager) is only published to ",[526,652,655],{"href":653,"rel":654},"https:\u002F\u002Fghcr.io\u002F",[530],"GHCR.io"," (GitHub Container Registry) and that also doesn't support IPv6.\nTechnically speaking there's several methods to workaround this. In my case I am using the ",[526,658,661],{"href":659,"rel":660},"https:\u002F\u002Fnat64.net\u002F",[530],"NAT64 service"," from Kasper Dupont that provides free-to-use NAT64\u002FDNS64 resolvers.\nIn a nutshell it translates IPv6 requests to IPv4 requests and vice versa.",[522,664,665],{},"I'll list the workarounds that come to my mind here:",[667,668,669,677,680,689],"ul",{},[637,670,671,672,676],{},"Using a NAT64\u002FDNS64 service that translates IPv6 requests to IPv4 requests and vice versa. (e.g., ",[526,673,675],{"href":659,"rel":674},[530],"nat64.net",", etc.)",[637,678,679],{},"Mirroring the images to another registry that supports IPv6 (e.g., Docker Hub, Quay.io, etc.) and use image overrides to pull from there.",[637,681,682,683,688],{},"Using a pull-through\u002Fproxy registry that supports IPv6 (e.g., ",[526,684,687],{"href":685,"rel":686},"https:\u002F\u002Fgoharbor.io\u002F",[530],"Harbor",", etc.) that caches the images on pull.",[637,690,691],{},"You could keep the IPv4 address attached on your nodes and use it as normal. Though even just writing this, it feels weird and against the idea of an IPv6-only Kubernetes cluster..",[534,693,695],{"id":694},"talos-kubernetes-config-no-ipv4-no-problem","Talos Kubernetes Config - No IPv4, No Problem",[596,697,698,703],{},[522,699,700,701,568],{},"Not using Talos Linux? No worries! The shown configs should be easily adjustable for use with ",[566,702,162],{},[522,704,705,706,709,710,713,714,717,718,720],{},"E.g., ",[566,707,708],{},"machine.network.nameservers"," would be ",[566,711,712],{},"\u002Fetc\u002Fresolv.conf",", ",[566,715,716],{},"cluster.network"," would be in the ",[566,719,162],{}," config file, etc.",[522,722,723],{},"The first thing we are going to do is to add the NAT64\u002FDNS64 resolvers to our nodes' using MachineConfig patches and get the Talos Linux ready.",[596,725,726],{},[522,727,728],{},"You might be able to update an existing cluster with these patches but I wouldn't recommend it. Creating a new cluster with these patches applied from the start is the way to go.",[612,730,732],{"id":731},"patch-for-all-machineconfigs","Patch for all MachineConfigs",[522,734,735],{},"Patch for all machines\u002Fnodes (including control planes; explanation in code comments).",[737,738,743],"pre",{"className":739,"code":740,"language":741,"meta":742,"style":742},"language-yaml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","machine:\n  network:\n    # Use NAT64\u002FDNS64 resolvers to resolve IPv4-only hosts like, e.g., ghcr.io\n    nameservers:\n      # NAT64\u002FDNS64 resolvers - https:\u002F\u002Fnat64.net\u002F\n      # Make sure to read through the Terms of Service before using the service\n      - 2a01:4f9:c010:3f02::1\n      - 2a00:1098:2c::1\n      - 2a01:4f8:c2c:123f::1\ncluster:\n  # Make sure Kubernetes thinks we are running in a \"cloud\" environment with a cloud controller manager\n  # In this case we'll use the Talos Cloud Controller Manager (CCM) for Hetzner Cloud\n  externalCloudProvider:\n    enabled: true\n  # Disable `kube-proxy` as we use Cilium with full kube-proxy replacement\n  proxy:\n    disabled: true\n","yaml","",[566,744,745,758,766,773,781,787,793,803,811,819,827,833,839,847,860,866,874],{"__ignoreMap":742},[746,747,750,754],"span",{"class":748,"line":749},"line",1,[746,751,753],{"class":752},"swJcz","machine",[746,755,757],{"class":756},"sMK4o",":\n",[746,759,761,764],{"class":748,"line":760},2,[746,762,763],{"class":752},"  network",[746,765,757],{"class":756},[746,767,769],{"class":748,"line":768},3,[746,770,772],{"class":771},"sHwdD","    # Use NAT64\u002FDNS64 resolvers to resolve IPv4-only hosts like, e.g., ghcr.io\n",[746,774,776,779],{"class":748,"line":775},4,[746,777,778],{"class":752},"    nameservers",[746,780,757],{"class":756},[746,782,784],{"class":748,"line":783},5,[746,785,786],{"class":771},"      # NAT64\u002FDNS64 resolvers - https:\u002F\u002Fnat64.net\u002F\n",[746,788,790],{"class":748,"line":789},6,[746,791,792],{"class":771},"      # Make sure to read through the Terms of Service before using the service\n",[746,794,796,799],{"class":748,"line":795},7,[746,797,798],{"class":756},"      -",[746,800,802],{"class":801},"sfazB"," 2a01:4f9:c010:3f02::1\n",[746,804,806,808],{"class":748,"line":805},8,[746,807,798],{"class":756},[746,809,810],{"class":801}," 2a00:1098:2c::1\n",[746,812,814,816],{"class":748,"line":813},9,[746,815,798],{"class":756},[746,817,818],{"class":801}," 2a01:4f8:c2c:123f::1\n",[746,820,822,825],{"class":748,"line":821},10,[746,823,824],{"class":752},"cluster",[746,826,757],{"class":756},[746,828,830],{"class":748,"line":829},11,[746,831,832],{"class":771},"  # Make sure Kubernetes thinks we are running in a \"cloud\" environment with a cloud controller manager\n",[746,834,836],{"class":748,"line":835},12,[746,837,838],{"class":771},"  # In this case we'll use the Talos Cloud Controller Manager (CCM) for Hetzner Cloud\n",[746,840,842,845],{"class":748,"line":841},13,[746,843,844],{"class":752},"  externalCloudProvider",[746,846,757],{"class":756},[746,848,850,853,856],{"class":748,"line":849},14,[746,851,852],{"class":752},"    enabled",[746,854,855],{"class":756},":",[746,857,859],{"class":858},"sfNiH"," true\n",[746,861,863],{"class":748,"line":862},15,[746,864,865],{"class":771},"  # Disable `kube-proxy` as we use Cilium with full kube-proxy replacement\n",[746,867,869,872],{"class":748,"line":868},16,[746,870,871],{"class":752},"  proxy",[746,873,757],{"class":756},[746,875,877,880,882],{"class":748,"line":876},17,[746,878,879],{"class":752},"    disabled",[746,881,855],{"class":756},[746,883,859],{"class":858},[612,885,887],{"id":886},"patch-for-control-plane","Patch for Control Plane",[522,889,890],{},"Patch for the control plane nodes.",[737,892,894],{"className":739,"code":893,"language":741,"meta":742,"style":742},"cluster:\n  network:\n    # Talos shouldn't deploy any CNI, we'll deploy Cilium ourselves.\n    cni:\n      name: none\n    # Only provide an IPv6 podSubnet here, so no IPv4 is allocated\u002Fused.\n    # This range is more of a dummy, as through the CCM we'll allocate slices of each node's \u002F64 network\n    # to the pods running on that node.\n    # Make sure that the podSubnet is unique and doesn't overlap with any other network in your\n    # infrastructure.\n    podSubnets:\n      - \"fd40:10::\u002F96\"\n    # Only provide an IPv6 serviceSubnet here, so no IPv4 is allocated\u002Fused.\n    serviceSubnets:\n      - \"fd40:10:100::\u002F112\"\n  controllerManager:\n    extraArgs:\n      # Make sure the kube-controller-manager listens on all interfaces (\"including\" IPv6), this can be\n      # a security implication as in a public network setting like Hetzner Cloud this would expose the\n      # kube-controller-manager's endpoints to the public internet. Therefore it is recommended to setup\n      # a firewall to only allow access from trusted IPs\u002Fnetworks.\n      bind-address: \"::\"\n      # Without disabling the node IPAM controller, this would make the controller hand out \u002F112 networks\n      # to each node.\n      node-cidr-mask-size-ipv6: \"112\"\n      # Disable Node IPAM controller as we use Talos CCM for the pod network for each node.\n      controllers: \"*,-node-ipam-controller\"\n  scheduler:\n    extraArgs:\n      # Make sure the kube-scheduler listens on all interfaces (\"including\" IPv6), this can be\n      # a security implication, see controllerManager bind-address comment above.\n      bind-address: \"::\"\n  etcd:\n    extraArgs:\n      # Make sure the etcd metrics listens on all interfaces (\"including\" IPv6), this can be\n      # a security implication, see controllerManager bind-address comment above.\n      # Note: This is optional, only needed if you want to easily scrape etcd metrics.\n      listen-metrics-urls: \"http:\u002F\u002F[::]:2381\"\n",[566,895,896,902,908,913,920,930,935,940,945,950,955,962,975,980,987,998,1005,1012,1018,1024,1030,1036,1051,1057,1063,1078,1084,1099,1107,1114,1120,1126,1139,1147,1154,1160,1165,1171],{"__ignoreMap":742},[746,897,898,900],{"class":748,"line":749},[746,899,824],{"class":752},[746,901,757],{"class":756},[746,903,904,906],{"class":748,"line":760},[746,905,763],{"class":752},[746,907,757],{"class":756},[746,909,910],{"class":748,"line":768},[746,911,912],{"class":771},"    # Talos shouldn't deploy any CNI, we'll deploy Cilium ourselves.\n",[746,914,915,918],{"class":748,"line":775},[746,916,917],{"class":752},"    cni",[746,919,757],{"class":756},[746,921,922,925,927],{"class":748,"line":783},[746,923,924],{"class":752},"      name",[746,926,855],{"class":756},[746,928,929],{"class":801}," none\n",[746,931,932],{"class":748,"line":789},[746,933,934],{"class":771},"    # Only provide an IPv6 podSubnet here, so no IPv4 is allocated\u002Fused.\n",[746,936,937],{"class":748,"line":795},[746,938,939],{"class":771},"    # This range is more of a dummy, as through the CCM we'll allocate slices of each node's \u002F64 network\n",[746,941,942],{"class":748,"line":805},[746,943,944],{"class":771},"    # to the pods running on that node.\n",[746,946,947],{"class":748,"line":813},[746,948,949],{"class":771},"    # Make sure that the podSubnet is unique and doesn't overlap with any other network in your\n",[746,951,952],{"class":748,"line":821},[746,953,954],{"class":771},"    # infrastructure.\n",[746,956,957,960],{"class":748,"line":829},[746,958,959],{"class":752},"    podSubnets",[746,961,757],{"class":756},[746,963,964,966,969,972],{"class":748,"line":835},[746,965,798],{"class":756},[746,967,968],{"class":756}," \"",[746,970,971],{"class":801},"fd40:10::\u002F96",[746,973,974],{"class":756},"\"\n",[746,976,977],{"class":748,"line":841},[746,978,979],{"class":771},"    # Only provide an IPv6 serviceSubnet here, so no IPv4 is allocated\u002Fused.\n",[746,981,982,985],{"class":748,"line":849},[746,983,984],{"class":752},"    serviceSubnets",[746,986,757],{"class":756},[746,988,989,991,993,996],{"class":748,"line":862},[746,990,798],{"class":756},[746,992,968],{"class":756},[746,994,995],{"class":801},"fd40:10:100::\u002F112",[746,997,974],{"class":756},[746,999,1000,1003],{"class":748,"line":868},[746,1001,1002],{"class":752},"  controllerManager",[746,1004,757],{"class":756},[746,1006,1007,1010],{"class":748,"line":876},[746,1008,1009],{"class":752},"    extraArgs",[746,1011,757],{"class":756},[746,1013,1015],{"class":748,"line":1014},18,[746,1016,1017],{"class":771},"      # Make sure the kube-controller-manager listens on all interfaces (\"including\" IPv6), this can be\n",[746,1019,1021],{"class":748,"line":1020},19,[746,1022,1023],{"class":771},"      # a security implication as in a public network setting like Hetzner Cloud this would expose the\n",[746,1025,1027],{"class":748,"line":1026},20,[746,1028,1029],{"class":771},"      # kube-controller-manager's endpoints to the public internet. Therefore it is recommended to setup\n",[746,1031,1033],{"class":748,"line":1032},21,[746,1034,1035],{"class":771},"      # a firewall to only allow access from trusted IPs\u002Fnetworks.\n",[746,1037,1039,1042,1044,1046,1049],{"class":748,"line":1038},22,[746,1040,1041],{"class":752},"      bind-address",[746,1043,855],{"class":756},[746,1045,968],{"class":756},[746,1047,1048],{"class":801},"::",[746,1050,974],{"class":756},[746,1052,1054],{"class":748,"line":1053},23,[746,1055,1056],{"class":771},"      # Without disabling the node IPAM controller, this would make the controller hand out \u002F112 networks\n",[746,1058,1060],{"class":748,"line":1059},24,[746,1061,1062],{"class":771},"      # to each node.\n",[746,1064,1066,1069,1071,1073,1076],{"class":748,"line":1065},25,[746,1067,1068],{"class":752},"      node-cidr-mask-size-ipv6",[746,1070,855],{"class":756},[746,1072,968],{"class":756},[746,1074,1075],{"class":801},"112",[746,1077,974],{"class":756},[746,1079,1081],{"class":748,"line":1080},26,[746,1082,1083],{"class":771},"      # Disable Node IPAM controller as we use Talos CCM for the pod network for each node.\n",[746,1085,1087,1090,1092,1094,1097],{"class":748,"line":1086},27,[746,1088,1089],{"class":752},"      controllers",[746,1091,855],{"class":756},[746,1093,968],{"class":756},[746,1095,1096],{"class":801},"*,-node-ipam-controller",[746,1098,974],{"class":756},[746,1100,1102,1105],{"class":748,"line":1101},28,[746,1103,1104],{"class":752},"  scheduler",[746,1106,757],{"class":756},[746,1108,1110,1112],{"class":748,"line":1109},29,[746,1111,1009],{"class":752},[746,1113,757],{"class":756},[746,1115,1117],{"class":748,"line":1116},30,[746,1118,1119],{"class":771},"      # Make sure the kube-scheduler listens on all interfaces (\"including\" IPv6), this can be\n",[746,1121,1123],{"class":748,"line":1122},31,[746,1124,1125],{"class":771},"      # a security implication, see controllerManager bind-address comment above.\n",[746,1127,1129,1131,1133,1135,1137],{"class":748,"line":1128},32,[746,1130,1041],{"class":752},[746,1132,855],{"class":756},[746,1134,968],{"class":756},[746,1136,1048],{"class":801},[746,1138,974],{"class":756},[746,1140,1142,1145],{"class":748,"line":1141},33,[746,1143,1144],{"class":752},"  etcd",[746,1146,757],{"class":756},[746,1148,1150,1152],{"class":748,"line":1149},34,[746,1151,1009],{"class":752},[746,1153,757],{"class":756},[746,1155,1157],{"class":748,"line":1156},35,[746,1158,1159],{"class":771},"      # Make sure the etcd metrics listens on all interfaces (\"including\" IPv6), this can be\n",[746,1161,1163],{"class":748,"line":1162},36,[746,1164,1125],{"class":771},[746,1166,1168],{"class":748,"line":1167},37,[746,1169,1170],{"class":771},"      # Note: This is optional, only needed if you want to easily scrape etcd metrics.\n",[746,1172,1174,1177,1179,1181,1184],{"class":748,"line":1173},38,[746,1175,1176],{"class":752},"      listen-metrics-urls",[746,1178,855],{"class":756},[746,1180,968],{"class":756},[746,1182,1183],{"class":801},"http:\u002F\u002F[::]:2381",[746,1185,974],{"class":756},[612,1187,1189],{"id":1188},"patch-for-worker-nodes","Patch for Worker Nodes",[522,1191,1192],{},"No additional patch needed for only the worker nodes.",[534,1194,1196],{"id":1195},"i-route-therefore-i-am-cilium-cni","\"I route, therefore I am\" - Cilium CNI",[522,1198,1199,1200,1202],{},"Ironically, Cilium CNI technically does less routing because Hetzner Cloud already routes the ",[566,1201,593],{}," networks to the respective servers.",[522,1204,1205],{},"If we don't tell Cilium to use Kubernetes for IP Address Management (IPAM), it would allocate a range itself which we don't want to happen.",[737,1207,1209],{"className":739,"code":1208,"language":741,"meta":742,"style":742},"# This uses Talos kubespan service to connect to the Kubernetes API server.\n# In non-Talos clusters this would be, e.g., the IP of your API server or a load balancer in front of it.\nk8sServiceHost: \"localhost\"\nk8sServicePort: \"7445\"\n\n# Use Cilium with full kube-proxy replacement\nkubeProxyReplacement: true\n\ncni:\n  # Yes, we want Cilium to  be our CNI.\n  install: true\n\nipam:\n  mode: \"kubernetes\"\n\nbpf:\n  masquerade: false\n\n# This can depend on your cloud provider and setup.\nloadBalancer:\n  acceleration: \"native\"\n\nk8s:\n  # We don't want\u002Fneed IPv4 Pod CIDR, so disable it.\n  requireIPv4PodCIDR: false\n  # But require a IPv6 Pod CIDR to be present on the node.\n  requireIPv6PodCIDR: true\n\n# Disable masquerading as the IPv6 networks are (publicly) routed\u002F\"accessible.\"\nenableIPv4Masquerade: false\nenableIPv6Masquerade: false\n\ncgroup:\n  autoMount:\n    # Already done by Talos, no need to do it again in\u002Fby Cilium.\n    enabled: false\n  # This is the path on Talos Linux.\n  # In non-Talos clusters you might need to adjust it and\u002For enable autoMount again.\n  hostRoot: \u002Fsys\u002Ffs\u002Fcgroup\n\n# Make sure the Cilium DaemonSet runs in privileged mode to be able to create everything it needs.\nsecurityContext:\n  privileged: true\n\nipv4:\n  # Who needs that anyway? :-)\n  enabled: false\n\nipv6:\n  # IPv6-only, let's go!\n  enabled: true\n\n# Use native routing mode as Hetzner Cloud already routes the \u002F64 networks to the respective servers,\n# If you intend to enable both IPv4 and IPv6 you might need to adjust this mode accordingly, but\n# otherwise the IPv4 networks need to be routable to each server as well.\nroutingMode: \"native\"\n",[566,1210,1211,1216,1221,1235,1249,1255,1260,1269,1273,1280,1285,1294,1298,1305,1319,1323,1330,1340,1344,1349,1356,1370,1374,1381,1386,1395,1400,1409,1413,1418,1427,1436,1440,1447,1454,1459,1467,1472,1477,1488,1493,1499,1507,1517,1522,1530,1536,1546,1551,1559,1565,1574,1579,1585,1591,1597],{"__ignoreMap":742},[746,1212,1213],{"class":748,"line":749},[746,1214,1215],{"class":771},"# This uses Talos kubespan service to connect to the Kubernetes API server.\n",[746,1217,1218],{"class":748,"line":760},[746,1219,1220],{"class":771},"# In non-Talos clusters this would be, e.g., the IP of your API server or a load balancer in front of it.\n",[746,1222,1223,1226,1228,1230,1233],{"class":748,"line":768},[746,1224,1225],{"class":752},"k8sServiceHost",[746,1227,855],{"class":756},[746,1229,968],{"class":756},[746,1231,1232],{"class":801},"localhost",[746,1234,974],{"class":756},[746,1236,1237,1240,1242,1244,1247],{"class":748,"line":775},[746,1238,1239],{"class":752},"k8sServicePort",[746,1241,855],{"class":756},[746,1243,968],{"class":756},[746,1245,1246],{"class":801},"7445",[746,1248,974],{"class":756},[746,1250,1251],{"class":748,"line":783},[746,1252,1254],{"emptyLinePlaceholder":1253},true,"\n",[746,1256,1257],{"class":748,"line":789},[746,1258,1259],{"class":771},"# Use Cilium with full kube-proxy replacement\n",[746,1261,1262,1265,1267],{"class":748,"line":795},[746,1263,1264],{"class":752},"kubeProxyReplacement",[746,1266,855],{"class":756},[746,1268,859],{"class":858},[746,1270,1271],{"class":748,"line":805},[746,1272,1254],{"emptyLinePlaceholder":1253},[746,1274,1275,1278],{"class":748,"line":813},[746,1276,1277],{"class":752},"cni",[746,1279,757],{"class":756},[746,1281,1282],{"class":748,"line":821},[746,1283,1284],{"class":771},"  # Yes, we want Cilium to  be our CNI.\n",[746,1286,1287,1290,1292],{"class":748,"line":829},[746,1288,1289],{"class":752},"  install",[746,1291,855],{"class":756},[746,1293,859],{"class":858},[746,1295,1296],{"class":748,"line":835},[746,1297,1254],{"emptyLinePlaceholder":1253},[746,1299,1300,1303],{"class":748,"line":841},[746,1301,1302],{"class":752},"ipam",[746,1304,757],{"class":756},[746,1306,1307,1310,1312,1314,1317],{"class":748,"line":849},[746,1308,1309],{"class":752},"  mode",[746,1311,855],{"class":756},[746,1313,968],{"class":756},[746,1315,1316],{"class":801},"kubernetes",[746,1318,974],{"class":756},[746,1320,1321],{"class":748,"line":862},[746,1322,1254],{"emptyLinePlaceholder":1253},[746,1324,1325,1328],{"class":748,"line":868},[746,1326,1327],{"class":752},"bpf",[746,1329,757],{"class":756},[746,1331,1332,1335,1337],{"class":748,"line":876},[746,1333,1334],{"class":752},"  masquerade",[746,1336,855],{"class":756},[746,1338,1339],{"class":858}," false\n",[746,1341,1342],{"class":748,"line":1014},[746,1343,1254],{"emptyLinePlaceholder":1253},[746,1345,1346],{"class":748,"line":1020},[746,1347,1348],{"class":771},"# This can depend on your cloud provider and setup.\n",[746,1350,1351,1354],{"class":748,"line":1026},[746,1352,1353],{"class":752},"loadBalancer",[746,1355,757],{"class":756},[746,1357,1358,1361,1363,1365,1368],{"class":748,"line":1032},[746,1359,1360],{"class":752},"  acceleration",[746,1362,855],{"class":756},[746,1364,968],{"class":756},[746,1366,1367],{"class":801},"native",[746,1369,974],{"class":756},[746,1371,1372],{"class":748,"line":1038},[746,1373,1254],{"emptyLinePlaceholder":1253},[746,1375,1376,1379],{"class":748,"line":1053},[746,1377,1378],{"class":752},"k8s",[746,1380,757],{"class":756},[746,1382,1383],{"class":748,"line":1059},[746,1384,1385],{"class":771},"  # We don't want\u002Fneed IPv4 Pod CIDR, so disable it.\n",[746,1387,1388,1391,1393],{"class":748,"line":1065},[746,1389,1390],{"class":752},"  requireIPv4PodCIDR",[746,1392,855],{"class":756},[746,1394,1339],{"class":858},[746,1396,1397],{"class":748,"line":1080},[746,1398,1399],{"class":771},"  # But require a IPv6 Pod CIDR to be present on the node.\n",[746,1401,1402,1405,1407],{"class":748,"line":1086},[746,1403,1404],{"class":752},"  requireIPv6PodCIDR",[746,1406,855],{"class":756},[746,1408,859],{"class":858},[746,1410,1411],{"class":748,"line":1101},[746,1412,1254],{"emptyLinePlaceholder":1253},[746,1414,1415],{"class":748,"line":1109},[746,1416,1417],{"class":771},"# Disable masquerading as the IPv6 networks are (publicly) routed\u002F\"accessible.\"\n",[746,1419,1420,1423,1425],{"class":748,"line":1116},[746,1421,1422],{"class":752},"enableIPv4Masquerade",[746,1424,855],{"class":756},[746,1426,1339],{"class":858},[746,1428,1429,1432,1434],{"class":748,"line":1122},[746,1430,1431],{"class":752},"enableIPv6Masquerade",[746,1433,855],{"class":756},[746,1435,1339],{"class":858},[746,1437,1438],{"class":748,"line":1128},[746,1439,1254],{"emptyLinePlaceholder":1253},[746,1441,1442,1445],{"class":748,"line":1141},[746,1443,1444],{"class":752},"cgroup",[746,1446,757],{"class":756},[746,1448,1449,1452],{"class":748,"line":1149},[746,1450,1451],{"class":752},"  autoMount",[746,1453,757],{"class":756},[746,1455,1456],{"class":748,"line":1156},[746,1457,1458],{"class":771},"    # Already done by Talos, no need to do it again in\u002Fby Cilium.\n",[746,1460,1461,1463,1465],{"class":748,"line":1162},[746,1462,852],{"class":752},[746,1464,855],{"class":756},[746,1466,1339],{"class":858},[746,1468,1469],{"class":748,"line":1167},[746,1470,1471],{"class":771},"  # This is the path on Talos Linux.\n",[746,1473,1474],{"class":748,"line":1173},[746,1475,1476],{"class":771},"  # In non-Talos clusters you might need to adjust it and\u002For enable autoMount again.\n",[746,1478,1480,1483,1485],{"class":748,"line":1479},39,[746,1481,1482],{"class":752},"  hostRoot",[746,1484,855],{"class":756},[746,1486,1487],{"class":801}," \u002Fsys\u002Ffs\u002Fcgroup\n",[746,1489,1491],{"class":748,"line":1490},40,[746,1492,1254],{"emptyLinePlaceholder":1253},[746,1494,1496],{"class":748,"line":1495},41,[746,1497,1498],{"class":771},"# Make sure the Cilium DaemonSet runs in privileged mode to be able to create everything it needs.\n",[746,1500,1502,1505],{"class":748,"line":1501},42,[746,1503,1504],{"class":752},"securityContext",[746,1506,757],{"class":756},[746,1508,1510,1513,1515],{"class":748,"line":1509},43,[746,1511,1512],{"class":752},"  privileged",[746,1514,855],{"class":756},[746,1516,859],{"class":858},[746,1518,1520],{"class":748,"line":1519},44,[746,1521,1254],{"emptyLinePlaceholder":1253},[746,1523,1525,1528],{"class":748,"line":1524},45,[746,1526,1527],{"class":752},"ipv4",[746,1529,757],{"class":756},[746,1531,1533],{"class":748,"line":1532},46,[746,1534,1535],{"class":771},"  # Who needs that anyway? :-)\n",[746,1537,1539,1542,1544],{"class":748,"line":1538},47,[746,1540,1541],{"class":752},"  enabled",[746,1543,855],{"class":756},[746,1545,1339],{"class":858},[746,1547,1549],{"class":748,"line":1548},48,[746,1550,1254],{"emptyLinePlaceholder":1253},[746,1552,1554,1557],{"class":748,"line":1553},49,[746,1555,1556],{"class":752},"ipv6",[746,1558,757],{"class":756},[746,1560,1562],{"class":748,"line":1561},50,[746,1563,1564],{"class":771},"  # IPv6-only, let's go!\n",[746,1566,1568,1570,1572],{"class":748,"line":1567},51,[746,1569,1541],{"class":752},[746,1571,855],{"class":756},[746,1573,859],{"class":858},[746,1575,1577],{"class":748,"line":1576},52,[746,1578,1254],{"emptyLinePlaceholder":1253},[746,1580,1582],{"class":748,"line":1581},53,[746,1583,1584],{"class":771},"# Use native routing mode as Hetzner Cloud already routes the \u002F64 networks to the respective servers,\n",[746,1586,1588],{"class":748,"line":1587},54,[746,1589,1590],{"class":771},"# If you intend to enable both IPv4 and IPv6 you might need to adjust this mode accordingly, but\n",[746,1592,1594],{"class":748,"line":1593},55,[746,1595,1596],{"class":771},"# otherwise the IPv4 networks need to be routable to each server as well.\n",[746,1598,1600,1603,1605,1607,1609],{"class":748,"line":1599},56,[746,1601,1602],{"class":752},"routingMode",[746,1604,855],{"class":756},[746,1606,968],{"class":756},[746,1608,1367],{"class":801},[746,1610,974],{"class":756},[522,1612,1613,1614,1617],{},"The helm install\u002Fupgrade command I used to install Cilium CNI version 1.17.2 with the above config in the ",[566,1615,1616],{},"cilium-values.yaml"," file.:",[737,1619,1623],{"className":1620,"code":1621,"language":1622,"meta":742,"style":742},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","helm upgrade -i \\\n    --namespace=kube-system \\\n    --version=1.18.2 \\\n    -f cilium-values.yaml \\\n    cilium \\\n    cilium\u002Fcilium\n","bash",[566,1624,1625,1641,1648,1655,1665,1672],{"__ignoreMap":742},[746,1626,1627,1631,1634,1637],{"class":748,"line":749},[746,1628,1630],{"class":1629},"sBMFI","helm",[746,1632,1633],{"class":801}," upgrade",[746,1635,1636],{"class":801}," -i",[746,1638,1640],{"class":1639},"sTEyZ"," \\\n",[746,1642,1643,1646],{"class":748,"line":760},[746,1644,1645],{"class":801},"    --namespace=kube-system",[746,1647,1640],{"class":1639},[746,1649,1650,1653],{"class":748,"line":768},[746,1651,1652],{"class":801},"    --version=1.18.2",[746,1654,1640],{"class":1639},[746,1656,1657,1660,1663],{"class":748,"line":775},[746,1658,1659],{"class":801},"    -f",[746,1661,1662],{"class":801}," cilium-values.yaml",[746,1664,1640],{"class":1639},[746,1666,1667,1670],{"class":748,"line":783},[746,1668,1669],{"class":801},"    cilium",[746,1671,1640],{"class":1639},[746,1673,1674],{"class":748,"line":789},[746,1675,1676],{"class":801},"    cilium\u002Fcilium\n",[534,1678,1680],{"id":1679},"cloud-controller-to-the-rescue-allocating-ipv6-cidrs","Cloud Controller To The Rescue - Allocating IPv6 CIDRs",[522,1682,1683,1684,1686,1687,1689],{},"As mentioned before, Hetzner Cloud gives each server a routed ",[566,1685,593],{}," network. But how do we make sure that the pods on each node get use IPs from the ",[566,1688,593],{}," network assigned to them?\nThat's where the Talos Cloud Controller Manager (CCM) comes into play.",[522,1691,1692,1693,1696,1697,594],{},"With the following config it will allocate ",[566,1694,1695],{},"\u002F80"," networks to each node from their respective ",[566,1698,593],{},[737,1700,1702],{"className":739,"code":1701,"language":741,"meta":742,"style":742},"# Enable the node IPAM controller to allocate a network based on each node's \u002F64 network.\nenabledControllers:\n  - cloud-node\n  - node-ipam-controller\n\nextraArgs:\n  # Enable allocating node CIDRs based on each node's \u002F64 network.\n  - --allocate-node-cidrs\n  - --cidr-allocator-type=CloudAllocator\n  # Make sure to allocate \u002F80 networks to each node from their \u002F64 network.\n  - --node-cidr-mask-size-ipv6=80\n\ndaemonSet:\n  # Run as a DaemonSet on each node.\n  enabled: true\n\n# Needs to run when the node(s) is not ready yet to be able to allocate the CIDR before Cilium can start up.\ntolerations:\n  - effect: NoSchedule\n    operator: Exists\n",[566,1703,1704,1709,1716,1724,1731,1735,1742,1747,1754,1761,1766,1773,1777,1784,1789,1797,1801,1806,1813,1825],{"__ignoreMap":742},[746,1705,1706],{"class":748,"line":749},[746,1707,1708],{"class":771},"# Enable the node IPAM controller to allocate a network based on each node's \u002F64 network.\n",[746,1710,1711,1714],{"class":748,"line":760},[746,1712,1713],{"class":752},"enabledControllers",[746,1715,757],{"class":756},[746,1717,1718,1721],{"class":748,"line":768},[746,1719,1720],{"class":756},"  -",[746,1722,1723],{"class":801}," cloud-node\n",[746,1725,1726,1728],{"class":748,"line":775},[746,1727,1720],{"class":756},[746,1729,1730],{"class":801}," node-ipam-controller\n",[746,1732,1733],{"class":748,"line":783},[746,1734,1254],{"emptyLinePlaceholder":1253},[746,1736,1737,1740],{"class":748,"line":789},[746,1738,1739],{"class":752},"extraArgs",[746,1741,757],{"class":756},[746,1743,1744],{"class":748,"line":795},[746,1745,1746],{"class":771},"  # Enable allocating node CIDRs based on each node's \u002F64 network.\n",[746,1748,1749,1751],{"class":748,"line":805},[746,1750,1720],{"class":756},[746,1752,1753],{"class":801}," --allocate-node-cidrs\n",[746,1755,1756,1758],{"class":748,"line":813},[746,1757,1720],{"class":756},[746,1759,1760],{"class":801}," --cidr-allocator-type=CloudAllocator\n",[746,1762,1763],{"class":748,"line":821},[746,1764,1765],{"class":771},"  # Make sure to allocate \u002F80 networks to each node from their \u002F64 network.\n",[746,1767,1768,1770],{"class":748,"line":829},[746,1769,1720],{"class":756},[746,1771,1772],{"class":801}," --node-cidr-mask-size-ipv6=80\n",[746,1774,1775],{"class":748,"line":835},[746,1776,1254],{"emptyLinePlaceholder":1253},[746,1778,1779,1782],{"class":748,"line":841},[746,1780,1781],{"class":752},"daemonSet",[746,1783,757],{"class":756},[746,1785,1786],{"class":748,"line":849},[746,1787,1788],{"class":771},"  # Run as a DaemonSet on each node.\n",[746,1790,1791,1793,1795],{"class":748,"line":862},[746,1792,1541],{"class":752},[746,1794,855],{"class":756},[746,1796,859],{"class":858},[746,1798,1799],{"class":748,"line":868},[746,1800,1254],{"emptyLinePlaceholder":1253},[746,1802,1803],{"class":748,"line":876},[746,1804,1805],{"class":771},"# Needs to run when the node(s) is not ready yet to be able to allocate the CIDR before Cilium can start up.\n",[746,1807,1808,1811],{"class":748,"line":1014},[746,1809,1810],{"class":752},"tolerations",[746,1812,757],{"class":756},[746,1814,1815,1817,1820,1822],{"class":748,"line":1020},[746,1816,1720],{"class":756},[746,1818,1819],{"class":752}," effect",[746,1821,855],{"class":756},[746,1823,1824],{"class":801}," NoSchedule\n",[746,1826,1827,1830,1832],{"class":748,"line":1026},[746,1828,1829],{"class":752},"    operator",[746,1831,855],{"class":756},[746,1833,1834],{"class":801}," Exists\n",[522,1836,1837,1838,1841],{},"The helm install\u002Fupgrade command I used to install Talos CCM version 0.5.2 with the above config in the ",[566,1839,1840],{},"talos-ccm-values.yaml"," file:",[737,1843,1845],{"className":1620,"code":1844,"language":1622,"meta":742,"style":742},"helm upgrade -i \\\n    --namespace=kube-system \\\n     -f talos-ccm-values.yaml \\\n    talos-cloud-controller-manager \\\n    oci:\u002F\u002Fghcr.io\u002Fsiderolabs\u002Fcharts\u002Ftalos-cloud-controller-manager \\\n    --version 0.5.2\n",[566,1846,1847,1857,1863,1873,1880,1887],{"__ignoreMap":742},[746,1848,1849,1851,1853,1855],{"class":748,"line":749},[746,1850,1630],{"class":1629},[746,1852,1633],{"class":801},[746,1854,1636],{"class":801},[746,1856,1640],{"class":1639},[746,1858,1859,1861],{"class":748,"line":760},[746,1860,1645],{"class":801},[746,1862,1640],{"class":1639},[746,1864,1865,1868,1871],{"class":748,"line":768},[746,1866,1867],{"class":801},"     -f",[746,1869,1870],{"class":801}," talos-ccm-values.yaml",[746,1872,1640],{"class":1639},[746,1874,1875,1878],{"class":748,"line":775},[746,1876,1877],{"class":801},"    talos-cloud-controller-manager",[746,1879,1640],{"class":1639},[746,1881,1882,1885],{"class":748,"line":783},[746,1883,1884],{"class":801},"    oci:\u002F\u002Fghcr.io\u002Fsiderolabs\u002Fcharts\u002Ftalos-cloud-controller-manager",[746,1886,1640],{"class":1639},[746,1888,1889,1892],{"class":748,"line":789},[746,1890,1891],{"class":801},"    --version",[746,1893,1895],{"class":1894},"sbssI"," 0.5.2\n",[534,1897,1899],{"id":1898},"heres-how-it-looks-in-action","Here's How It Looks In Action",[522,1901,1902,1903,1908],{},"I have deployed Cilium's Star Wars™ demo application to test out the basic behavior, see ",[526,1904,1907],{"href":1905,"rel":1906},"https:\u002F\u002Fdocs.cilium.io\u002Fen\u002Fstable\u002Fgettingstarted\u002Fdemo\u002F#deploy-the-demo-application",[530],"Getting Started with the Star Wars Demo - Cilium documentation",".",[737,1910,1912],{"className":1620,"code":1911,"language":1622,"meta":742,"style":742},"$ kubectl create -n default -f https:\u002F\u002Fraw.githubusercontent.com\u002Fcilium\u002Fcilium\u002FHEAD\u002Fexamples\u002Fminikube\u002Fhttp-sw-app.yaml\n# Wait till the pods are ready\n$ kubectl get -n default pods\n",[566,1913,1914,1937,1942],{"__ignoreMap":742},[746,1915,1916,1919,1922,1925,1928,1931,1934],{"class":748,"line":749},[746,1917,1918],{"class":1629},"$",[746,1920,1921],{"class":801}," kubectl",[746,1923,1924],{"class":801}," create",[746,1926,1927],{"class":801}," -n",[746,1929,1930],{"class":801}," default",[746,1932,1933],{"class":801}," -f",[746,1935,1936],{"class":801}," https:\u002F\u002Fraw.githubusercontent.com\u002Fcilium\u002Fcilium\u002FHEAD\u002Fexamples\u002Fminikube\u002Fhttp-sw-app.yaml\n",[746,1938,1939],{"class":748,"line":760},[746,1940,1941],{"class":771},"# Wait till the pods are ready\n",[746,1943,1944,1946,1948,1951,1953,1955],{"class":748,"line":768},[746,1945,1918],{"class":1629},[746,1947,1921],{"class":801},[746,1949,1950],{"class":801}," get",[746,1952,1927],{"class":801},[746,1954,1930],{"class":801},[746,1956,1957],{"class":801}," pods\n",[737,1959,1961],{"className":1620,"code":1960,"language":1622,"meta":742,"style":742},"$ kubectl get -A svc\nNAMESPACE     NAME                             TYPE        CLUSTER-IP          EXTERNAL-IP   PORT(S)                  AGE\ndefault       deathstar                        ClusterIP   fd40:10:100::b0da   \u003Cnone>        80\u002FTCP                   7m49s\ndefault       kubernetes                       ClusterIP   fd40:10:100::1      \u003Cnone>        443\u002FTCP                  13m\ndefault       talos                            ClusterIP   fd40:10:100::bbf3   \u003Cnone>        50000\u002FTCP                12m\nkube-system   cilium-envoy                     ClusterIP   None                \u003Cnone>        9964\u002FTCP                 11m\nkube-system   hubble-peer                      ClusterIP   fd40:10:100::e43b   \u003Cnone>        443\u002FTCP                  11m\nkube-system   kube-dns                         ClusterIP   fd40:10:100::a      \u003Cnone>        53\u002FUDP,53\u002FTCP,9153\u002FTCP   12m\nkube-system   talos-cloud-controller-manager   ClusterIP   None                \u003Cnone>        50258\u002FTCP                12m\n",[566,1962,1963,1977,2009,2041,2069,2096,2125,2151,2178],{"__ignoreMap":742},[746,1964,1965,1967,1969,1971,1974],{"class":748,"line":749},[746,1966,1918],{"class":1629},[746,1968,1921],{"class":801},[746,1970,1950],{"class":801},[746,1972,1973],{"class":801}," -A",[746,1975,1976],{"class":801}," svc\n",[746,1978,1979,1982,1985,1988,1991,1994,1997,2000,2003,2006],{"class":748,"line":760},[746,1980,1981],{"class":1629},"NAMESPACE",[746,1983,1984],{"class":801},"     NAME",[746,1986,1987],{"class":801},"                             TYPE",[746,1989,1990],{"class":801},"        CLUSTER-IP",[746,1992,1993],{"class":801},"          EXTERNAL-IP",[746,1995,1996],{"class":801},"   PORT",[746,1998,1999],{"class":756},"(",[746,2001,2002],{"class":1629},"S",[746,2004,2005],{"class":756},")",[746,2007,2008],{"class":801},"                  AGE\n",[746,2010,2011,2014,2017,2020,2023,2026,2029,2032,2035,2038],{"class":748,"line":768},[746,2012,2013],{"class":1629},"default",[746,2015,2016],{"class":801},"       deathstar",[746,2018,2019],{"class":801},"                        ClusterIP",[746,2021,2022],{"class":801},"   fd40:10:100::b0da",[746,2024,2025],{"class":756},"   \u003C",[746,2027,2028],{"class":801},"non",[746,2030,2031],{"class":1639},"e",[746,2033,2034],{"class":756},">",[746,2036,2037],{"class":801},"        80\u002FTCP",[746,2039,2040],{"class":801},"                   7m49s\n",[746,2042,2043,2045,2048,2051,2054,2057,2059,2061,2063,2066],{"class":748,"line":775},[746,2044,2013],{"class":1629},[746,2046,2047],{"class":801},"       kubernetes",[746,2049,2050],{"class":801},"                       ClusterIP",[746,2052,2053],{"class":801},"   fd40:10:100::1",[746,2055,2056],{"class":756},"      \u003C",[746,2058,2028],{"class":801},[746,2060,2031],{"class":1639},[746,2062,2034],{"class":756},[746,2064,2065],{"class":801},"        443\u002FTCP",[746,2067,2068],{"class":801},"                  13m\n",[746,2070,2071,2073,2076,2079,2082,2084,2086,2088,2090,2093],{"class":748,"line":783},[746,2072,2013],{"class":1629},[746,2074,2075],{"class":801},"       talos",[746,2077,2078],{"class":801},"                            ClusterIP",[746,2080,2081],{"class":801},"   fd40:10:100::bbf3",[746,2083,2025],{"class":756},[746,2085,2028],{"class":801},[746,2087,2031],{"class":1639},[746,2089,2034],{"class":756},[746,2091,2092],{"class":801},"        50000\u002FTCP",[746,2094,2095],{"class":801},"                12m\n",[746,2097,2098,2101,2104,2107,2110,2113,2115,2117,2119,2122],{"class":748,"line":789},[746,2099,2100],{"class":1629},"kube-system",[746,2102,2103],{"class":801},"   cilium-envoy",[746,2105,2106],{"class":801},"                     ClusterIP",[746,2108,2109],{"class":801},"   None",[746,2111,2112],{"class":756},"                \u003C",[746,2114,2028],{"class":801},[746,2116,2031],{"class":1639},[746,2118,2034],{"class":756},[746,2120,2121],{"class":801},"        9964\u002FTCP",[746,2123,2124],{"class":801},"                 11m\n",[746,2126,2127,2129,2132,2135,2138,2140,2142,2144,2146,2148],{"class":748,"line":795},[746,2128,2100],{"class":1629},[746,2130,2131],{"class":801},"   hubble-peer",[746,2133,2134],{"class":801},"                      ClusterIP",[746,2136,2137],{"class":801},"   fd40:10:100::e43b",[746,2139,2025],{"class":756},[746,2141,2028],{"class":801},[746,2143,2031],{"class":1639},[746,2145,2034],{"class":756},[746,2147,2065],{"class":801},[746,2149,2150],{"class":801},"                  11m\n",[746,2152,2153,2155,2158,2161,2164,2166,2168,2170,2172,2175],{"class":748,"line":805},[746,2154,2100],{"class":1629},[746,2156,2157],{"class":801},"   kube-dns",[746,2159,2160],{"class":801},"                         ClusterIP",[746,2162,2163],{"class":801},"   fd40:10:100::a",[746,2165,2056],{"class":756},[746,2167,2028],{"class":801},[746,2169,2031],{"class":1639},[746,2171,2034],{"class":756},[746,2173,2174],{"class":801},"        53\u002FUDP,53\u002FTCP,9153\u002FTCP",[746,2176,2177],{"class":801},"   12m\n",[746,2179,2180,2182,2185,2188,2190,2192,2194,2196,2198,2201],{"class":748,"line":813},[746,2181,2100],{"class":1629},[746,2183,2184],{"class":801},"   talos-cloud-controller-manager",[746,2186,2187],{"class":801},"   ClusterIP",[746,2189,2109],{"class":801},[746,2191,2112],{"class":756},[746,2193,2028],{"class":801},[746,2195,2031],{"class":1639},[746,2197,2034],{"class":756},[746,2199,2200],{"class":801},"        50258\u002FTCP",[746,2202,2095],{"class":801},[737,2204,2206],{"className":1620,"code":2205,"language":1622,"meta":742,"style":742},"$ kubectl get pod -o wide\nNAME                         READY   STATUS    RESTARTS   AGE     IP                         NODE             NOMINATED NODE   READINESS GATES\ndeathstar-86f85ffb4d-4mt6r   1\u002F1     Running   0          36s     2a01:4f8:c014:f084::3cd2   talos-worker-2   \u003Cnone>           \u003Cnone>\ndeathstar-86f85ffb4d-7jpb4   1\u002F1     Running   0          2m12s   2a01:4f8:c014:34b1::2f8f   talos-worker-1   \u003Cnone>           \u003Cnone>\ntiefighter                   1\u002F1     Running   0          2m12s   2a01:4f8:c014:f084::f280   talos-worker-2   \u003Cnone>           \u003Cnone>\nxwing                        1\u002F1     Running   0          8s      2a01:4f8:c014:34b1::c396   talos-worker-1   \u003Cnone>           \u003Cnone>\n",[566,2207,2208,2225,2260,2301,2337,2372],{"__ignoreMap":742},[746,2209,2210,2212,2214,2216,2219,2222],{"class":748,"line":749},[746,2211,1918],{"class":1629},[746,2213,1921],{"class":801},[746,2215,1950],{"class":801},[746,2217,2218],{"class":801}," pod",[746,2220,2221],{"class":801}," -o",[746,2223,2224],{"class":801}," wide\n",[746,2226,2227,2230,2233,2236,2239,2242,2245,2248,2251,2254,2257],{"class":748,"line":760},[746,2228,2229],{"class":1629},"NAME",[746,2231,2232],{"class":801},"                         READY",[746,2234,2235],{"class":801},"   STATUS",[746,2237,2238],{"class":801},"    RESTARTS",[746,2240,2241],{"class":801},"   AGE",[746,2243,2244],{"class":801},"     IP",[746,2246,2247],{"class":801},"                         NODE",[746,2249,2250],{"class":801},"             NOMINATED",[746,2252,2253],{"class":801}," NODE",[746,2255,2256],{"class":801},"   READINESS",[746,2258,2259],{"class":801}," GATES\n",[746,2261,2262,2265,2268,2271,2274,2277,2280,2283,2285,2287,2289,2291,2294,2296,2298],{"class":748,"line":768},[746,2263,2264],{"class":1629},"deathstar-86f85ffb4d-4mt6r",[746,2266,2267],{"class":801},"   1\u002F1",[746,2269,2270],{"class":801},"     Running",[746,2272,2273],{"class":1894},"   0",[746,2275,2276],{"class":801},"          36s",[746,2278,2279],{"class":801},"     2a01:4f8:c014:f084::3cd2",[746,2281,2282],{"class":801},"   talos-worker-2",[746,2284,2025],{"class":756},[746,2286,2028],{"class":801},[746,2288,2031],{"class":1639},[746,2290,2034],{"class":756},[746,2292,2293],{"class":756},"           \u003C",[746,2295,2028],{"class":801},[746,2297,2031],{"class":1639},[746,2299,2300],{"class":756},">\n",[746,2302,2303,2306,2308,2310,2312,2315,2318,2321,2323,2325,2327,2329,2331,2333,2335],{"class":748,"line":775},[746,2304,2305],{"class":1629},"deathstar-86f85ffb4d-7jpb4",[746,2307,2267],{"class":801},[746,2309,2270],{"class":801},[746,2311,2273],{"class":1894},[746,2313,2314],{"class":801},"          2m12s",[746,2316,2317],{"class":801},"   2a01:4f8:c014:34b1::2f8f",[746,2319,2320],{"class":801},"   talos-worker-1",[746,2322,2025],{"class":756},[746,2324,2028],{"class":801},[746,2326,2031],{"class":1639},[746,2328,2034],{"class":756},[746,2330,2293],{"class":756},[746,2332,2028],{"class":801},[746,2334,2031],{"class":1639},[746,2336,2300],{"class":756},[746,2338,2339,2342,2345,2347,2349,2351,2354,2356,2358,2360,2362,2364,2366,2368,2370],{"class":748,"line":783},[746,2340,2341],{"class":1629},"tiefighter",[746,2343,2344],{"class":801},"                   1\u002F1",[746,2346,2270],{"class":801},[746,2348,2273],{"class":1894},[746,2350,2314],{"class":801},[746,2352,2353],{"class":801},"   2a01:4f8:c014:f084::f280",[746,2355,2282],{"class":801},[746,2357,2025],{"class":756},[746,2359,2028],{"class":801},[746,2361,2031],{"class":1639},[746,2363,2034],{"class":756},[746,2365,2293],{"class":756},[746,2367,2028],{"class":801},[746,2369,2031],{"class":1639},[746,2371,2300],{"class":756},[746,2373,2374,2377,2380,2382,2384,2387,2390,2392,2394,2396,2398,2400,2402,2404,2406],{"class":748,"line":789},[746,2375,2376],{"class":1629},"xwing",[746,2378,2379],{"class":801},"                        1\u002F1",[746,2381,2270],{"class":801},[746,2383,2273],{"class":1894},[746,2385,2386],{"class":801},"          8s",[746,2388,2389],{"class":801},"      2a01:4f8:c014:34b1::c396",[746,2391,2320],{"class":801},[746,2393,2025],{"class":756},[746,2395,2028],{"class":801},[746,2397,2031],{"class":1639},[746,2399,2034],{"class":756},[746,2401,2293],{"class":756},[746,2403,2028],{"class":801},[746,2405,2031],{"class":1639},[746,2407,2300],{"class":756},[737,2409,2411],{"className":1620,"code":2410,"language":1622,"meta":742,"style":742},"$ kubectl get nodes -o wide\nNAME                    STATUS                     ROLES           AGE     VERSION   INTERNAL-IP             EXTERNAL-IP   OS-IMAGE          KERNEL-VERSION   CONTAINER-RUNTIME\ntalos-control-plane-1   Ready                      control-plane   8m24s   v1.32.3   2a01:4f8:c014:b0a7::1   \u003Cnone>        Talos (v1.11.2)   6.12.48-talos    containerd:\u002F\u002F2.1.4\ntalos-worker-1          Ready                      \u003Cnone>          8m14s   v1.32.3   2a01:4f8:c014:34b1::1   \u003Cnone>        Talos (v1.11.2)   6.12.48-talos    containerd:\u002F\u002F2.1.4\ntalos-worker-2          Ready,SchedulingDisabled   \u003Cnone>          4m18s   v1.32.3   2a01:4f8:c014:f084::1   \u003Cnone>        Talos (v1.11.2)   6.12.48-talos    containerd:\u002F\u002F2.1.4\n",[566,2412,2413,2428,2459,2493,2530],{"__ignoreMap":742},[746,2414,2415,2417,2419,2421,2424,2426],{"class":748,"line":749},[746,2416,1918],{"class":1629},[746,2418,1921],{"class":801},[746,2420,1950],{"class":801},[746,2422,2423],{"class":801}," nodes",[746,2425,2221],{"class":801},[746,2427,2224],{"class":801},[746,2429,2430,2432,2435,2438,2441,2444,2447,2450,2453,2456],{"class":748,"line":760},[746,2431,2229],{"class":1629},[746,2433,2434],{"class":801},"                    STATUS",[746,2436,2437],{"class":801},"                     ROLES",[746,2439,2440],{"class":801},"           AGE",[746,2442,2443],{"class":801},"     VERSION",[746,2445,2446],{"class":801},"   INTERNAL-IP",[746,2448,2449],{"class":801},"             EXTERNAL-IP",[746,2451,2452],{"class":801},"   OS-IMAGE",[746,2454,2455],{"class":801},"          KERNEL-VERSION",[746,2457,2458],{"class":801},"   CONTAINER-RUNTIME\n",[746,2460,2461,2464,2467,2470,2473,2476,2479,2481,2483,2485,2487,2490],{"class":748,"line":768},[746,2462,2463],{"class":1629},"talos-control-plane-1",[746,2465,2466],{"class":801},"   Ready",[746,2468,2469],{"class":801},"                      control-plane",[746,2471,2472],{"class":801},"   8m24s",[746,2474,2475],{"class":801},"   v1.32.3",[746,2477,2478],{"class":801},"   2a01:4f8:c014:b0a7::1",[746,2480,2025],{"class":756},[746,2482,2028],{"class":801},[746,2484,2031],{"class":1639},[746,2486,2034],{"class":756},[746,2488,2489],{"class":801},"        Talos",[746,2491,2492],{"class":1639}," (v1.11.2)   6.12.48-talos    containerd:\u002F\u002F2.1.4\n",[746,2494,2495,2498,2501,2504,2506,2508,2510,2513,2515,2518,2520,2522,2524,2526,2528],{"class":748,"line":775},[746,2496,2497],{"class":1629},"talos-worker-1",[746,2499,2500],{"class":801},"          Ready",[746,2502,2503],{"class":756},"                      \u003C",[746,2505,2028],{"class":801},[746,2507,2031],{"class":1639},[746,2509,2034],{"class":756},[746,2511,2512],{"class":801},"          8m14s",[746,2514,2475],{"class":801},[746,2516,2517],{"class":801},"   2a01:4f8:c014:34b1::1",[746,2519,2025],{"class":756},[746,2521,2028],{"class":801},[746,2523,2031],{"class":1639},[746,2525,2034],{"class":756},[746,2527,2489],{"class":801},[746,2529,2492],{"class":1639},[746,2531,2532,2535,2538,2540,2542,2544,2546,2549,2551,2554,2556,2558,2560,2562,2564],{"class":748,"line":783},[746,2533,2534],{"class":1629},"talos-worker-2",[746,2536,2537],{"class":801},"          Ready,SchedulingDisabled",[746,2539,2025],{"class":756},[746,2541,2028],{"class":801},[746,2543,2031],{"class":1639},[746,2545,2034],{"class":756},[746,2547,2548],{"class":801},"          4m18s",[746,2550,2475],{"class":801},[746,2552,2553],{"class":801},"   2a01:4f8:c014:f084::1",[746,2555,2025],{"class":756},[746,2557,2028],{"class":801},[746,2559,2031],{"class":1639},[746,2561,2034],{"class":756},[746,2563,2489],{"class":801},[746,2565,2492],{"class":1639},[522,2567,2568,2569,2571],{},"Scheduling has been disabled for ",[566,2570,2534],{}," so that the demo app is running \"50\u002F50\" on the two nodes in the cluster.",[737,2573,2575],{"className":1620,"code":2574,"language":1622,"meta":742,"style":742},"$ kubectl exec tiefighter -- curl -s -XPOST deathstar.default.svc.cluster.local\u002Fv1\u002Frequest-landing\nShip landed\n$ kubectl exec xwing -- curl -s -XPOST deathstar.default.svc.cluster.local\u002Fv1\u002Frequest-landing\nShip landed\n$ kubectl get pod -o wide\nNAME                         READY   STATUS    RESTARTS   AGE     IP                         NODE             NOMINATED NODE   READINESS GATES\ndeathstar-86f85ffb4d-7jpb4   1\u002F1     Running   0          6m19s   2a01:4f8:c014:34b1::2f8f   talos-worker-1   \u003Cnone>           \u003Cnone>\ndeathstar-86f85ffb4d-q6l6f   1\u002F1     Running   0          66s     2a01:4f8:c014:34b1::9811   talos-worker-1   \u003Cnone>           \u003Cnone>\ntiefighter                   1\u002F1     Running   0          6m19s   2a01:4f8:c014:f084::f280   talos-worker-2   \u003Cnone>           \u003Cnone>\nxwing                        1\u002F1     Running   0          4m15s   2a01:4f8:c014:34b1::c396   talos-worker-1   \u003Cnone>           \u003Cnone>\n",[566,2576,2577,2604,2612,2633,2639,2653,2677,2710,2745,2777],{"__ignoreMap":742},[746,2578,2579,2581,2583,2586,2589,2592,2595,2598,2601],{"class":748,"line":749},[746,2580,1918],{"class":1629},[746,2582,1921],{"class":801},[746,2584,2585],{"class":801}," exec",[746,2587,2588],{"class":801}," tiefighter",[746,2590,2591],{"class":801}," --",[746,2593,2594],{"class":801}," curl",[746,2596,2597],{"class":801}," -s",[746,2599,2600],{"class":801}," -XPOST",[746,2602,2603],{"class":801}," deathstar.default.svc.cluster.local\u002Fv1\u002Frequest-landing\n",[746,2605,2606,2609],{"class":748,"line":760},[746,2607,2608],{"class":1629},"Ship",[746,2610,2611],{"class":801}," landed\n",[746,2613,2614,2616,2618,2620,2623,2625,2627,2629,2631],{"class":748,"line":768},[746,2615,1918],{"class":1629},[746,2617,1921],{"class":801},[746,2619,2585],{"class":801},[746,2621,2622],{"class":801}," xwing",[746,2624,2591],{"class":801},[746,2626,2594],{"class":801},[746,2628,2597],{"class":801},[746,2630,2600],{"class":801},[746,2632,2603],{"class":801},[746,2634,2635,2637],{"class":748,"line":775},[746,2636,2608],{"class":1629},[746,2638,2611],{"class":801},[746,2640,2641,2643,2645,2647,2649,2651],{"class":748,"line":783},[746,2642,1918],{"class":1629},[746,2644,1921],{"class":801},[746,2646,1950],{"class":801},[746,2648,2218],{"class":801},[746,2650,2221],{"class":801},[746,2652,2224],{"class":801},[746,2654,2655,2657,2659,2661,2663,2665,2667,2669,2671,2673,2675],{"class":748,"line":789},[746,2656,2229],{"class":1629},[746,2658,2232],{"class":801},[746,2660,2235],{"class":801},[746,2662,2238],{"class":801},[746,2664,2241],{"class":801},[746,2666,2244],{"class":801},[746,2668,2247],{"class":801},[746,2670,2250],{"class":801},[746,2672,2253],{"class":801},[746,2674,2256],{"class":801},[746,2676,2259],{"class":801},[746,2678,2679,2681,2683,2685,2687,2690,2692,2694,2696,2698,2700,2702,2704,2706,2708],{"class":748,"line":795},[746,2680,2305],{"class":1629},[746,2682,2267],{"class":801},[746,2684,2270],{"class":801},[746,2686,2273],{"class":1894},[746,2688,2689],{"class":801},"          6m19s",[746,2691,2317],{"class":801},[746,2693,2320],{"class":801},[746,2695,2025],{"class":756},[746,2697,2028],{"class":801},[746,2699,2031],{"class":1639},[746,2701,2034],{"class":756},[746,2703,2293],{"class":756},[746,2705,2028],{"class":801},[746,2707,2031],{"class":1639},[746,2709,2300],{"class":756},[746,2711,2712,2715,2717,2719,2721,2724,2727,2729,2731,2733,2735,2737,2739,2741,2743],{"class":748,"line":805},[746,2713,2714],{"class":1629},"deathstar-86f85ffb4d-q6l6f",[746,2716,2267],{"class":801},[746,2718,2270],{"class":801},[746,2720,2273],{"class":1894},[746,2722,2723],{"class":801},"          66s",[746,2725,2726],{"class":801},"     2a01:4f8:c014:34b1::9811",[746,2728,2320],{"class":801},[746,2730,2025],{"class":756},[746,2732,2028],{"class":801},[746,2734,2031],{"class":1639},[746,2736,2034],{"class":756},[746,2738,2293],{"class":756},[746,2740,2028],{"class":801},[746,2742,2031],{"class":1639},[746,2744,2300],{"class":756},[746,2746,2747,2749,2751,2753,2755,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775],{"class":748,"line":813},[746,2748,2341],{"class":1629},[746,2750,2344],{"class":801},[746,2752,2270],{"class":801},[746,2754,2273],{"class":1894},[746,2756,2689],{"class":801},[746,2758,2353],{"class":801},[746,2760,2282],{"class":801},[746,2762,2025],{"class":756},[746,2764,2028],{"class":801},[746,2766,2031],{"class":1639},[746,2768,2034],{"class":756},[746,2770,2293],{"class":756},[746,2772,2028],{"class":801},[746,2774,2031],{"class":1639},[746,2776,2300],{"class":756},[746,2778,2779,2781,2783,2785,2787,2790,2793,2795,2797,2799,2801,2803,2805,2807,2809],{"class":748,"line":821},[746,2780,2376],{"class":1629},[746,2782,2379],{"class":801},[746,2784,2270],{"class":801},[746,2786,2273],{"class":1894},[746,2788,2789],{"class":801},"          4m15s",[746,2791,2792],{"class":801},"   2a01:4f8:c014:34b1::c396",[746,2794,2320],{"class":801},[746,2796,2025],{"class":756},[746,2798,2028],{"class":801},[746,2800,2031],{"class":1639},[746,2802,2034],{"class":756},[746,2804,2293],{"class":756},[746,2806,2028],{"class":801},[746,2808,2031],{"class":1639},[746,2810,2300],{"class":756},[522,2812,2813,2814,2816],{},"This seems to show that everything is working as expected! Pods are getting IPs from the ",[566,2815,593],{}," networks of the respective nodes and communication between pods is working as expected.",[534,2818,2820],{"id":2819},"summarizing-everything-and-some-notes","Summarizing Everything And Some Notes",[522,2822,2823,2824,2826,2827,2829,2830,594],{},"With the configs shown above, we have a working Talos Kubernetes cluster that runs using IPv6-only networking, using the ",[566,2825,593],{}," of each node for the pods running on that node.\nAdditionally we are using Cilium CNI in full kube-proxy replacement mode with Kubernetes-based IPAM to allocate the pod IPs and Talos CCM to allocate the respective ",[566,2828,1695],{}," networks from each node's ",[566,2831,593],{},[522,2833,2834],{},"In addition to that, to workaround the lack of IPv6 connectivity of some services we are using NAT64\u002FDNS64 resolvers to be able to pull container images from IPv4-only registries like GitHub Container Registry.",[522,2836,2837,855],{},[583,2838,2839],{},"Notes",[667,2841,2842,2851],{},[637,2843,2844,2845,2850],{},"You want to make sure that your nodes have proper firewall rules in place to only allow access from your nodes to each other. You might be able to use ",[526,2846,2849],{"href":2847,"rel":2848},"https:\u002F\u002Fdocs.cilium.io\u002Fen\u002Flatest\u002Fsecurity\u002Fhost-firewall\u002F",[530],"Cilium's Host Firewall feature"," for that though I haven't tested it yet.",[637,2852,2853,2854],{},"Make sure to double-check any application you deploy for proper IPv6 support. Some applications might still have issues with IPv6-only networking.\n",[667,2855,2856],{},[637,2857,2858,2859,2864],{},"In the past I had issues with Zalando's postgres-operator not being able to create proper IPv6 connections to the PostgreSQL instances it created. Might be fixed in the meantime, I haven't tested it recently. Haven't deployed it yet but stumbled upon ",[526,2860,2863],{"href":2861,"rel":2862},"https:\u002F\u002Fperconadev.atlassian.net\u002Fbrowse\u002FPXC-3638",[530],"this Percona Jira issue (PXC-3638)"," about \"manual\" configuration being needed to make nodes sync\u002Fjoin correctly.",[522,2866,2867],{},"P.S. In my tests I even deployed the cluster using ARM64 VMs\u002Fservers on Hetzner Cloud and everything worked as expected!",[534,2869,2871],{"id":2870},"the-cherry-on-top-github-repository-with-terraform-code-and-configs","The Cherry On Top - GitHub Repository with Terraform Code and Configs",[522,2873,2874,2875,1908],{},"The repository contains all the code and configs to deploy a Talos Kubernetes cluster with IPv6-only networking on Hetzner Cloud using Terraform (and Packer) is available at\n",[526,2876,2877],{"href":2877,"rel":2878},"https:\u002F\u002Fgithub.com\u002Fgalexrt\u002Fk8s-talos-ipv6-only",[530],[522,2880,2881,2882,2887],{},"Make sure to checkout the ",[526,2883,2886],{"href":2884,"rel":2885},"https:\u002F\u002Fgithub.com\u002Fgalexrt\u002Fk8s-talos-ipv6-only\u002Fblob\u002Fmain\u002FREADME.md",[530],"README.md"," for instructions on how to use it.",[2889,2890,2891],"style",{},"html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":742,"searchDepth":760,"depth":760,"links":2893},[2894,2895,2898,2903,2904,2905,2906,2907],{"id":536,"depth":760,"text":537},{"id":571,"depth":760,"text":572,"children":2896},[2897],{"id":614,"depth":768,"text":615},{"id":694,"depth":760,"text":695,"children":2899},[2900,2901,2902],{"id":731,"depth":768,"text":732},{"id":886,"depth":768,"text":887},{"id":1188,"depth":768,"text":1189},{"id":1195,"depth":760,"text":1196},{"id":1679,"depth":760,"text":1680},{"id":1898,"depth":760,"text":1899},{"id":2819,"depth":760,"text":2820},{"id":2870,"depth":760,"text":2871},"2025-10-13T14:09:13+02:00","Let's set up a Kubernetes cluster that runs using IPv6-only networking, using the \u002F64 networks of your machines, with Talos Linux and Cilium CNI.","md","\u002Fblog\u002F2025\u002Fkubernetes-ipv6-only-for-real-in-good-this-time.jpg",{},"\u002Fblog\u002F2025\u002Fkubernetes-ipv6-only-for-real-in-good-this-time",{"title":510,"description":2909},"3.blog\u002F2025\u002Fkubernetes-ipv6-only-for-real-in-good-this-time","67YCZTnZEdaS3UP9mLplxFbjtnzWeuEYvWCbhaCKmaw",[2918,517],{"title":2919,"path":2920,"stem":2921,"description":2922,"children":-1},"Docker for Devs - Workshop","\u002Fblog\u002F2024\u002Fdocker-for-devs-workshop-v3","3.blog\u002F2024\u002Fdocker-for-devs-workshop-v3","\"Docker for Devs\"-Workshop for getting started with Docker and containers.",1776935182859]