【2021年４月版】Kubernetes ナビ その２: ネットワーク・サービス関連

# Kubernetes ナビ

本シリーズでは kubernetes クラスタを構成する様々なコンポーネント・技術をざっとご紹介しております。

- [【2021年４月版】Kubernetes ナビ その１: ディストリいろいろ](https://qiita.com/koinori/items/3eeea1ce1bd5420ac09c)
- [【2021年４月版】Kubernetes ナビ その２: ネットワーク・サービス関連](https://qiita.com/koinori/items/ef66ce6b1dd0a27a5fa4)
- [【2021年４月版】Kubernetes ナビ その３: ストレージ関連](https://qiita.com/koinori/items/20c71563dcd2c14f0058)
- [【2021年４月版】Kubernetes ナビ その４: コンテナ関連](https://qiita.com/koinori/items/43aabffddce01938e80d)
- [【2021年４月版】Kubernetes ナビ その５: Serverless](https://qiita.com/koinori/items/1b3850cd922d06eda528)


今回はその２となります。

# Kubernetes のネットワーク・サービス関連のコンポーネントについてざっくり

k8s のネットワーク・サービス関連コンポーネントはさらに以下の分類にざっくり分かれています。

1. LB/Ingress … ロードバランサー(LB)、Ingress は**クラスタの外から**の通信を受けてをクラスタ内に転送する層です。特にLBは"クラスタの外"にあるため、K8sとは別に置かれる場合が多いです。または Ingress のコンポーネントがLBを兼ねる場合もあります。
1. DNS/サービスディスカバリ … **クラスタ内部**のポッド、コンテナの名前解決と監視を行います。クラスタ内の交通整理役です。k8sでは大抵、DNS単体ではなくDNS兼サービスディスカバリのコンポーネントになります。
1. CNI … **コンテナ間**の通信をトンネリングする、コンテナネットワークインタフェース(CNI)に対応したコンポーネントです。
1. サービスメッシュ … 上記のいずれかを組み合わせてPod群とサービスを包括的に一元管理できる仕組みがサービスメッシュです。

それでは以下でそれぞれの分類について代表的なコンポーネントをご紹介いたします。

# LB/Ingress 系コンポーネント

## クラウドサービスのK8sについて

まず上で書いた通り、LBはクラスタの外と中のつなぎ込み箇所なので、クラウドサービスとして提供されるk8sサービスの場合は、各社の持つ自社インフラのネットワークとクラスタを接続するために、各社独自のLB/Ingressが専用コンポーネントもしくはサービスとして提供されています。

以下に代表３社のヘルプページを記載しておきます。

- Google GKE … [GKE Ingress](https://cloud.google.com/kubernetes-engine/docs/concepts/ingress?hl=ja)
- AWS EKS … [AWS Network Load Balancer (NLB), Classic Load Balancer (CLB)](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/load-balancing.html)
- Azure AKS … [パブリック Standard Load Balancer](https://docs.microsoft.com/ja-jp/azure/aks/load-balancer-standard)

これ、クラスタの一番の外側にあるサービスのエンドポイントであるLBの設定がクラウド各社によってガチガチなのはある程度は仕方ないことですが、k8sを運用する上で意外と問題になるので要注意です。
クラウドサービスによってサービスとLBの構成がキメキメになってしまうので、Podの構成によってクラウドの移行がまったくできなくなってしまう場合もあります。マルチクラウドのクラスタ管理は相当の沼です。。。

## ロードバランサー(LB)

LBの比較には以下のブログ記事を発見いたしましたのでリンクと比較表を載せておきます。ありがとうございます。

- [Comparing Open Source k8s Load Balancers](https://medium.com/thermokline/comparing-k8s-load-balancers-2f5c76ea8f31)

この記事では [MetalLB](https://metallb.universe.tf/), [PureLB](https://purelb.gitlab.io/docs/), [Porter](https://porterlb.io/) の比較を行っています。

| |MetalLB|PureLB|Porter|
|--|-----|----|----|
|IPAM|integrated|integrated & external|integrated|
|Uses Linux network Subsystem|no|yes|no|
|Local Addresses|yes|yes|incomplete|
|Routed addresses|yes|yes|yes|
|Protocol Support|BGP|any (BGP,OSPF,ISIS,RIP)| BGP partial|
|IPv4 & IPv6|no|yes|no|
|Integration with routed CNI|Difficult|easy|possible|
|Config using CRD|no|yes|yes|
|Redundancy & failover|good|good|poor|

Porterは2020年の夏にCNCF に加えられた新しいプロジェクトなのでまだまだこれからが期待、といった感じです。

## Ingress コントローラー

Kubernetes 標準搭載の Ingress コントローラーは、[GCE](https://github.com/kubernetes/ingress-gce/blob/master/README.md)と[nginx](https://github.com/kubernetes/ingress-nginx)の2つです。

追加のIngress コントローラーはかなり多くあります。 公式サイトにある以下にリストを転載いたします。

- [Kubernetes: Ingressコントローラー](https://kubernetes.io/ja/docs/concepts/services-networking/ingress-controllers/)


>- [AKS Application Gateway Ingress Controller](https://github.com/Azure/application-gateway-kubernetes-ingress)は[Azure Application Gateway](https://docs.microsoft.com/ja-jp/azure/application-gateway/overview)を利用して[AKSクラスター](https://docs.microsoft.com/ja-jp/azure/aks/kubernetes-walkthrough-portal)でIngressを実行可能にするIngressコントローラーです。
>- [Ambassador](https://www.getambassador.io/) API Gatewayは[Envoy](https://www.envoyproxy.io/)ベースのIngressコントローラーで、[Datawire](https://www.datawire.io/)による[コミュニティ版](https://www.getambassador.io/docs)または[商用版](https://www.getambassador.io/pro/)のサポートがあります。
>- [AppsCode Inc.](https://appscode.com)では、最も広く使用されている[HAProxy](https://www.haproxy.org/)ベースのIngressコントローラーである[Voyager](https://appscode.com/products/voyager)のサポートと保守を提供しています。
>- [AWS ALB Ingress Controller](https://github.com/kubernetes-sigs/aws-alb-ingress-controller)は[AWS Application Load Balancer](https://aws.amazon.com/elasticloadbalancing/)を使用したIngressを有効にします。
>- [Contour](https://projectcontour.io/)は、VMwareが提供し、サポートしている[Envoy](https://www.envoyproxy.io/)ベースのIngressコントローラーです。
>- Citrixは、[ベアメタル](https://github.com/citrix/citrix-k8s-ingress-controller/tree/master/deployment/baremetal)と[クラウド](https://github.com/citrix/citrix-k8s-ingress-controller/tree/master/deployment)のデプロイ用に、ハードウェア(MPX）、仮想化(VPX)、[フリーコンテナ化(CPX) ADC用](https://www.citrix.com/products/citrix-adc/cpx-express.html)の[Ingressコントローラー](https://github.com/citrix/citrix-k8s-ingress-controller)を提供しています。
>- F5 Networksは[F5 BIG-IP Container Ingress Services for Kubernetes](https://clouddocs.f5.com/containers/latest/userguide/kubernetes/)の[サポートと保守](https://support.f5.com/csp/article/K86859508)を提供しています。
>- [Gloo](https://gloo.solo.io)は[Envoy](https://www.envoyproxy.io/)をベースにしたオープンソースのIngressコントローラーで、[solo.io](https://www.solo.io)からのエンタープライズサポートでAPI Gateway機能を提供しています。
>- [HAProxy Ingress](https://haproxy-ingress.github.io)は、HAProxy用の高度にカスタマイズ可能なコミュニティ主導のIngressコントローラーです。
> - [HAProxy Technologies](https://www.haproxy.com/)は[HAProxy Ingress Controller for Kubernetes](https://github.com/haproxytech/kubernetes-ingress)のサポートと保守を提供しています。[公式ドキュメント](https://www.haproxy.com/documentation/hapee/1-9r1/traffic-management/kubernetes-ingress-controller/)を参照してください。
>- [Istio](https://istio.io/)ベースのIngressコントローラー[Control Ingress Traffic](https://istio.io/docs/tasks/traffic-management/ingress/)。
>- [Kong](https://konghq.com/)は、[Kong Ingress Controller for Kubernetes](https://github.com/Kong/kubernetes-ingress-controller)の[コミュニティ版](https://discuss.konghq.com/c/kubernetes)と[商用版](https://konghq.com/kong-enterprise/)のサポートと保守を提供しています。
>- [NGINX, Inc.](https://www.nginx.com/)は[NGINX Ingress Controller for Kubernetes](https://www.nginx.com/products/nginx/kubernetes-ingress-controller)のサポートと保守を提供しています。
>- [Skipper](https://opensource.zalando.com/skipper/kubernetes/ingress-controller/)は、カスタムプロキシーを構築するためのライブラリーとして設計された、Kubernetes Ingressなどのユースケースを含む、サービス構成用のHTTPルーターとリバースプロキシーです。
>- [Traefik](https://github.com/containous/traefik)はフル機能([Let's Encrypt](https://letsencrypt.org), secrets, http2, websocket)のIngressコントローラーで、[Containous](https://containo.us/services)による商用サポートもあります。

Ingressコントローラーのこの量ですよ。。だいたいL4/L7のLBとリバプロを兼ねているので色々です。
どれだけその製品の**ヘルプページのメニューに親しんでいるか**で決めればいいと思います。ヘルプが見にくい製品はもうアレですから。といっても個人的には Nginx で困ったら Traefik で、って感じなので Traefik のヘルプページは慣れました。~~traefik が使いやすいとは言ってないです。~~

# DNS/サービスディスカバリ/サービスメッシュ

DNS/サービスディスカバリ単体のOSSプロジェクトとしては現状 [CoreDNS](https://coredns.io/) 一択なのではないでしょうか。というか、大抵はサービスディスカバリとサービスメッシュは一体としてプロジェクトで開発されています。
というわけでここではサービスメッシュのOSSを紹介しますが、それよりもありがたい記事がありましたので以下にリンクを貼っておきます。ありがとうございます。

- [サービスメッシュについて調査してみた件](https://qiita.com/mamomamo/items/92085e0e508e18bc8532)

深い内容については上記の記事をご覧ください。以下に記事に紹介されているプロジェクトのリストとリンクだけ貼っておきます

## Istio

https://istio.io/

## Envoy

https://www.envoyproxy.io/

## Linkerd

https://linkerd.io/

## Consul 

https://www.consul.io/

# CNI(コンテナネットワークインタフェース)

[CNI](https://github.com/containernetworking/cni)そのものも CNCF 傘下のプロジェクトです

https://github.com/containernetworking/cni

このページにて[サードパーティのプラグイン](https://github.com/containernetworking/cni#3rd-party-plugins)が列挙されています。

>- [Project Calico - a layer 3 virtual network](https://github.com/projectcalico/calico-cni)
>- [Weave - a multi-host Docker network](https://github.com/weaveworks/weave)
>- [Contiv Networking - policy networking for various use cases](https://github.com/contiv/netplugin)
>- [SR-IOV](https://github.com/hustcat/sriov-cni)
>- [Cilium - BPF & XDP for containers](https://github.com/cilium/cilium)
>- [Infoblox - enterprise IP address management for containers](https://github.com/infobloxopen/cni-infoblox)
>- [Multus - a Multi plugin](https://github.com/Intel-Corp/multus-cni)
>- [Romana - Layer 3 CNI plugin supporting network policy for Kubernetes](https://github.com/romana/kube)
>- [CNI-Genie - generic CNI network plugin](https://github.com/Huawei-PaaS/CNI-Genie)
>- [Nuage CNI - Nuage Networks SDN plugin for network policy kubernetes support](https://github.com/nuagenetworks/nuage-cni)
>- [Silk - a CNI plugin designed for Cloud Foundry](https://github.com/cloudfoundry-incubator/silk)
>- [Linen - a CNI plugin designed for overlay networks with Open vSwitch and fit in SDN/OpenFlow network environment](https://github.com/John-Lin/linen-cni)
>- [Vhostuser - a Dataplane network plugin - Supports OVS-DPDK & VPP](https://github.com/intel/vhost-user-net-plugin)
>- [Amazon ECS CNI Plugins - a collection of CNI Plugins to configure containers with Amazon EC2 elastic network interfaces (ENIs)](https://github.com/aws/amazon-ecs-cni-plugins)
>- [Bonding CNI - a Link aggregating plugin to address failover and high availability network](https://github.com/Intel-Corp/bond-cni)
>- [ovn-kubernetes - an container network plugin built on Open vSwitch (OVS) and Open Virtual Networking (OVN) with support for both Linux and Windows](https://github.com/openvswitch/ovn-kubernetes)
>- [Juniper Contrail](https://www.juniper.net/cloud) / [TungstenFabric](https://tungstenfabric.io) - Provides overlay SDN solution, delivering multicloud networking, hybrid cloud networking, simultaneous overlay-underlay support, network policy enforcement, network isolation, service chaining and flexible load balancing
>- [Knitter - a CNI plugin supporting multiple networking for Kubernetes](https://github.com/ZTE/Knitter)
>- [DANM - a CNI-compliant networking solution for TelCo workloads running on Kubernetes](https://github.com/nokia/danm)
>- [VMware NSX – a CNI plugin that enables automated NSX L2/L3 networking and L4/L7 Load Balancing; network isolation at the pod, node, and cluster level; and zero-trust security policy for your Kubernetes cluster.](https://docs.vmware.com/en/VMware-NSX-T/2.2/com.vmware.nsxt.ncp_kubernetes.doc/GUID-6AFA724E-BB62-4693-B95C-321E8DDEA7E1.html)
>- [cni-route-override - a meta CNI plugin that override route information](https://github.com/redhat-nfvpe/cni-route-override)
>- [Terway - a collection of CNI Plugins based on alibaba cloud VPC/ECS network product](https://github.com/AliyunContainerService/terway)
>- [Cisco ACI CNI - for on-prem and cloud container networking with consistent policy and security model.](https://github.com/noironetworks/aci-containers)
>- [Kube-OVN - a CNI plugin that bases on OVN/OVS and provides advanced features like subnet, static ip, ACL, QoS, etc.](https://github.com/alauda/kube-ovn)
>- [Project Antrea - an Open vSwitch k8s CNI](https://github.com/vmware-tanzu/antrea)
>- [OVN4NFV-K8S-Plugin - a OVN based CNI controller plugin to provide cloud native based Service function chaining (SFC), Multiple OVN overlay networking](https://github.com/opnfv/ovn4nfv-k8s-plugin)
>- [Azure CNI - a CNI plugin that natively extends Azure Virtual Networks to containers](https://github.com/Azure/azure-container-networking)

いや、多いですね。。。そこでちょっと古いですがCNIを比較するスライドを発見いたしましたので以下にご紹介いたします。

- [Kubernetes CNI 結局どれを使えばいいのか / Kubernetes CNI Which Should We Choose](https://speakerdeck.com/line_developers/kubernetes-cni-which-should-we-choose?slide=22)

ここでは [flannel](https://github.com/flannel-io/flannel), [Cilium](https://cilium.io/), [Calico](https://docs.projectcalico.org/getting-started/kubernetes/), [Contiv](https://github.com/contiv/vpp), [TungstenFabric](https://tungsten.io/) の５つを比較しております。

まぁちょっと古いですが・・・ご参考になればと。

それでは今回はここまでといたします。