Slide 1

Slide 1 text

ちょっと⼤きめのOSSにコントリビュート しかけた話 2023/09/16 ⼩江⼾らぐ 9⽉のオフな集まり(第254回) 世良泰明

Slide 2

Slide 2 text

⾃⼰紹介 名前: 世良 泰明 (せら やすあき) 職業: ひよっこインフラエンジニア (3年⽬) 名古屋の某SIer所属 AWSでインフラ基盤の開発・運⽤ twitter: @y_sera15 ⾃宅K8sクラスター (intel nuc 3台) ESXi Master node1 Worker node1 ESXi Master node2 Worker node2 ESXi Master node3 Worker node3 Master 3台, worker 3台のHA構成 CNI: Ciliumを利⽤

Slide 3

Slide 3 text

今⽇の話 kubesprayというkubernetesクラスタ構築ツールでバグを踏んだため、 修正プルリクエストを投げてみました ⽬次 1. きっかけ 2. Kubesprayとは 3. Ciliumとは 4. やろうとしたこと 5. ハマったバグ 6. バグ修正 7. コントリビュートまでの準備 8. プルリクエスト 9. 結果 10.まとめ

Slide 4

Slide 4 text

きっかけ お家k8sを育てているものの、なるべく構築を⾃動化したい èAnsibleベースの構築⾃動化ツールでkubesprayというツールがあるので採⽤ èeBPFベースのCNIであるCiliumをkubesprayからインストール èついでにciliumの諸々の機能の有効化してみた…ところバグにハマる

Slide 5

Slide 5 text

kubesprayとは - AnsibleによるKubernetesクラスター構築ツール - Kubernetes-sigs配下のプロジェクト あらかじめ⽤意されたパラメータ⽤yamlをいじって諸々の機能をインストール/有効化する

Slide 6

Slide 6 text

Ciliumとは Kubernetesのネットワークプラグインの1つ - eBPFという機構を⽤いて、効率的なコンテナ間ネットワークを構築 - ciliumの中に、hubbleというネットワーク, セキュリティの可視化ツールも提供 ※eBPF(拡張バークレーパケットフィルター) カーネルに動的にプログラムを埋め込む仕組み. カーネルのイベントをフックして⾃由度の⾼い処理を実装できる. Hubble UI https://docs.cilium.io/en/latest/get tingstarted/hubble/

Slide 7

Slide 7 text

やろうとしたこと Kubesprayでciliumをインストール, hubbleを有効化 diff --git a/mycluster/group_vars/k8s_cluster/k8s-cluster.yml b/mycluster/group_vars/k8s_cluster/k8s-cluster.yml index 211a350..a4ae5e1 100644 --- a/mycluster/group_vars/k8s_cluster/k8s-cluster.yml +++ b/mycluster/group_vars/k8s_cluster/k8s-cluster.yml @@ -67,7 +67,7 @@ credentials_dir: "{{ inventory_dir }}/credentials" # Choose network plugin (cilium, calico, kube-ovn, weave or flannel. Use cni for generic cni plugin) # Can also be set to 'cloud', which lets the cloud provider setup appropriate routing -kube_network_plugin: calico +kube_network_plugin: cilium Ciliumの有効化

Slide 8

Slide 8 text

やろうとしたこと Kubesprayでciliumをインストール, hubbleを有効化 diff --git a/mycluster/group_vars/k8s_cluster/k8s-net-cilium.yml b/mycluster/group_vars/k8s_cluster/k8s-net-cilium.yml index a170484..96a493e 100644 --- a/mycluster/group_vars/k8s_cluster/k8s-net-cilium.yml +++ b/mycluster/group_vars/k8s_cluster/k8s-net-cilium.yml @@ -52,7 +52,7 @@ # Only effective when monitor aggregation is set to "medium" or higher. # cilium_monitor_aggregation_flags: "all" # Kube Proxy Replacement mode (strict/partial) -# cilium_kube_proxy_replacement: partial +cilium_kube_proxy_replacement: strict # If upgrading from Cilium < 1.5, you may want to override some of these options # to prevent service disruptions. See also: @@ -117,7 +117,7 @@ # IP Masquerade Agent # https://docs.cilium.io/en/stable/concepts/networking/masquerading/ # By default, all packets from a pod destined to an IP address outside of the cilium_native_routing_cidr range are masqueraded -# cilium_ip_masq_agent_enable: false +cilium_ip_masq_agent_enable: true ### A packet sent from a pod to a destination which belongs to any CIDR from the nonMasqueradeCIDRs is not going to be masqueraded # cilium_non_masquerade_cidrs: CiliumでeBPFの有効化(1/2)

Slide 9

Slide 9 text

やろうとしたこと Kubesprayでciliumをインストール, hubbleを有効化 @@ -224,13 +224,13 @@ # cilium_enable_ipv6_masquerade: true # -- Enable native IP masquerade support in eBPF -# cilium_enable_bpf_masquerade: false +cilium_enable_bpf_masquerade: true # -- Configure whether direct routing mode should route traffic via # host stack (true) or directly and more efficiently out of BPF (false) if # the kernel supports it. The latter has the implication that it will also # bypass netfilter in the host namespace. -# cilium_enable_host_legacy_routing: true +cilium_enable_host_legacy_routing: false CiliumでeBPFの有効化(2/2)

Slide 10

Slide 10 text

やろうとしたこと Kubesprayでciliumをインストール, hubbleを有効化 diff --git a/mycluster/group_vars/k8s_cluster/k8s-net-cilium.yml b/mycluster/group_vars/k8s_cluster/k8s-net-cilium.yml index 96a493e..cc6dcd7 100644 --- a/mycluster/group_vars/k8s_cluster/k8s-net-cilium.yml +++ b/mycluster/group_vars/k8s_cluster/k8s-net-cilium.yml @@ -140,21 +140,22 @@ cilium_ip_masq_agent_enable: true # Hubble ### Enable Hubble without install -# cilium_enable_hubble: false +cilium_enable_hubble: true ### Enable Hubble Metrics -# cilium_enable_hubble_metrics: false +cilium_enable_hubble_metrics: true ### if cilium_enable_hubble_metrics: true ### Enable Hubble install -# cilium_hubble_install: false +cilium_hubble_install: true ### Enable auto generate certs if cilium_hubble_install: true -# cilium_hubble_tls_generate: false +cilium_hubble_tls_generate: true +#cilium_hubble_tls_generate: false # IP address management mode for v1.9+. # https://docs.cilium.io/en/v1.9/concepts/networking/ipam/ Hubbleの有効化

Slide 11

Slide 11 text

ハマったバグ Ciliumのインストールまではできたものの、hubbleを有効化するとエラーになる 原因: パラメータの条件分岐に伴うテンプレートファイルのインデントのズレ パラメータファイル (yaml) こっちをいじる テンプレートファイル (jinja2) 基本的に触らない マニフェストファイル (yaml) Kubernetes クラスターへ適⽤

Slide 12

Slide 12 text

ハマったバグ Ciliumのインストールまではできたものの、hubbleを有効化するとエラーになる 原因: パラメータの条件分岐に伴うテンプレートファイルのインデントのズレ パラメータファイル (yaml) こっちをいじる テンプレートファイル (jinja2) 基本的に触らない マニフェストファイル(yaml) ⽣成 Kubernetes クラスターへ適⽤ ここがおかしい

Slide 13

Slide 13 text

ハマったバグ(もうちょい具体的に) Ciliumのインストールまではできたものの、hubbleを有効化するとエラーになる 原因: パラメータの条件分岐に伴うテンプレートファイルのインデントのズレ Kubespray/roles/network_plugin/cilium/templates/hubble/deploy.yml.j2 cilium_hubble_tls_generateパラメータの条件分岐でインデントがずれる 59 {% if cilium_hubble_tls_generate -%} 60 - mountPath: /var/lib/hubble-relay/tls 61 name: tls 62 readOnly: true 63 {% endif -%} 64 restartPolicy: Always 65 serviceAccount: hubble-relay 58 readOnly: true 59 - mountPath: /var/lib/hubble-relay/tls 60 name: tls 61 readOnly: true 62 restartPolicy: Always 63 serviceAccount: hubble-relay cilium_hubble_tls_generate:trueの場合 条件分岐の次の⾏のインデントがずれる…

Slide 14

Slide 14 text

バグ修正 Jinja2テンプレートのインデントがずれないように修正 {% if something %} Aaa {% endif %} White space controlで制御する https://jinja.palletsprojects.com/en/3.1.x/templates/ {% if something -%} Aaa {% endif -%} {%- if something -%} Aaa {%- endif -%} {% if something +%} Aaa {% endif +%} {%- if something +%} Aaa {%- endif +%} などなど {% %}の前後に”-”もしくは”+”を記述することで前後の空⽩を制御 → 挙動がよくわからないので総当たりで調査 ⇨ 解決!!

Slide 15

Slide 15 text

コントリビュートまでの準備 まずはお作法を学ぶ - プルリクエストを観察 - CNCF-CLAというものがいるらしい 何やらbotに怒られているらしいプルリクエスト

Slide 16

Slide 16 text

コントリビュートまでの準備 まずはお作法を学ぶ - プルリクエストを観察 - プルリクエストを投げるのに、CNCF-CLAというものがいるらしい 何やらbotに怒られているらしいプルリクエスト

Slide 17

Slide 17 text

コントリビュートまでの準備 CLA(Contributor License Agreement)というものがいるらしい 組織⽤(左)と個⼈⽤(右) 個⼈なので右側

Slide 18

Slide 18 text

プルリクエスト作成 作業の流れ 1. ⾃分のアカウントでkubesprayリポジトリをfork 2. ⾃分のローカルでブランチ作成/コミット 3. ⾃分のリモートリポジトリへpush 4. Githubからプルリクエスト作成 - プルリクエスト作成⽤のコメントはテンプレートが⽤意されているので、 それをいい感じに加⼯ - プルリクエスト作成すると、⾃動でCIテストが⾛る - CIテスト後, 2⼈以上のレビュアーから承認を受ければマージできるらしい

Slide 19

Slide 19 text

プルリクエスト作成 作成したプルリクエスト

Slide 20

Slide 20 text

プルリクエスト作成 可読性の観点で、レビュアーから指摘 {%- if something +%} Aaa {%- endif +%} +%}じゃなくて、 -%}で⼗分では?(意訳)

Slide 21

Slide 21 text

結果 1週間ほどドタバタして放置してたら、別のプルリクがマージされてた 泣く泣くクローズへ 後続⾏インデントのズレは1⾏空⾏を⼊れることで解決

Slide 22

Slide 22 text

まとめ Kubernetesクラスター構築ツールのkubesprayにバグ修正プルリクエストを投げてみた - Kubernetes-sigs配下のプロジェクトはプルリクエスト前にCLAの署名が必要 - 割としょうもないバグも埋もれてたりする - 作ったプルリクエストは最後まで責任を持つ(放置すると他のプルリクが採⽤されるかも) 所感 - 意外としょーもないバグが混⼊してたりする - リリースバージョンではなく、直接マスターブランチの内容を使ってたから遭遇したのかも。。。 今後 他にもドキュメントでもう少し説明が欲しいところがあったので、 気が向いたら再度プルリクチャレンジしてみる