概述
Google Cloud 使用先进的 Andromeda 网络来实现 VPC 内实例之间的相互访问,以及 Google Kubernetes Engine (GKE) 的 Pod 的跨节点互访,避免了配置静态路由或者 Overlay 网络带来的运维复杂度以及性能瓶颈。使用 Google Cloud 的 VPC Native(使用 IP Alias 而非静态路由)方式来实现 Pod 间网络通讯的集群称作为 VPC 原生(VPC Native)集群。VPC 原生集群具有以下优势。
Pod IP 地址可在集群的 VPC 网络和通过 VPC 网络对等互连与之相连的其他 VPC 网络中进行原生路由。
在集群中创建 Pod 之前,Pod IP 会预留在 VPC 网络中。这可防止与 VPC 网络中其他资源发生冲突,让您更好地规划 IP 地址分配。
Pod IP 地址范围不依赖于自定义静态路由。它们不会消耗系统生成的路由配额和自定义静态路由配额。自动生成的子网路由处理 VPC 原生集群的路由。
您可以创建仅应用于 Pod IP 地址范围而不是集群节点上任何 IP 地址的防火墙规则。
通常,Pod IP 地址范围和子网次要 IP 地址范围可以通过 Cloud Router 与连接到 Cloud VPN 或 Cloud Interconnect 的本地网络访问。
这些先进的网络功能,也可以提供给用户在 Google Cloud 虚机实例上自建的 Kubernetes 集群来使用。本文介绍了相关的配置和测试方法。
1 创建 K8s 集群的 Master 和 Node 虚机。
4 关闭 IP Alias 的 local route table
一、创建 VPC
1、创建 VPC
首先创建 VPC:
2、创建 VPC 防火墙规则
在 VPC 中添加防火墙规则:
创建子网 asia-southeast1-sub-1。为其规划如下网段。
Node 网段:10.122.16.0/21
Pod 网段:192.168.16.0/21
Service 网段:172.16.16.0/21
给子网配置从属网段
二、创建虚拟机
1、创建 K8s 集群的 Master 和 Node 虚机。
每个 Node 会有一个由 Master 自动分配的 Pod CIDR,需要根据这个网段来配置每个 Node 虚机实例的 Alias IP Range,本例分配的情况如下。
Node-1
o Pod CIDR: 192.168.17.0/24
o Alias IP: 192.168.17.0/24
Node2
o Pod CIDR: 192.168.18.0/24
o Alias IP: 192.168.18.0/24
注意打开 IP Forward 并配置 Alias IP 网段给 Pod 使用。
A Master
注意 Master 需要绑定一个有权限创建负载均衡的 Service Account,以及 Google Cloud API 调用范围,否则,创建 Kubernetes 的 Service 时自动创建 Google Cloud 负载均衡会失败。
B Node-1
2、安装 Docker
在所有的 VM 上安装 Docker:
3、安装 kubeadm 及其工具
系统设置,以及工具安装:
4、关闭 IP Alias 的 local route table
在 GCE 中,GCE agent 的 network Daemon 会监控 IP Alias 地址,并添加相应的路由。但在这种情况下,会造成 container 通讯的故障。通过下面的命令在 Master 和各个 Node 系统内修改 GCE agent 配置,并重启 google guest agent 服务。目的是 Pod 通过 Alias IP 地址互访时,不通过虚机实例的 Nat,而访问其他地址时,采用 NAT 的方式。
三、通过 kubeadm 安装 kubernetes
1、安装配置 Master 节点
A 配置 Master 节点
C 配置 kubectl 配置文件
默认配置下, Pod-Pod 访问时会进行 SNAT。使用 Alias IP 方式直接路由方式时,可以通过部署 ip-masq-agent 的方式关闭 SNAT。
2、安装配置 Node
A Join
在两个 Node 节点上运行 join 命令:
B 查看 Node 状态
此时 Node 是 NotReady 状态,因为 kubelet 的网络插件配置有问题。
D 修改 Node providerID
为了 Service 能自动创建和配置 Google Cloud 负载均衡,需要配置每个 Node 的 providerID 参数。对于 Google Cloud 上的 Node,providerID 的格式是 gce://<Project ID>/<Zone>/<Instance Name>。
在 Master 节点,运行 kubectl 修改每个 Node 的 prividerID:
E 给 GCE 添加 Network Tag
在 Kubernetes 通过 cloud-provider 创建实现 Service 的 Google Cloud 负载均衡的时候,需要通过 network tag 创建 firewall rules。所以需要给 GCE 实例添加 network tag。创建的规则是所有 node 相同的前缀,比如这里两台VM相同的前缀是 kub-n
F 给 Node 虚机实例添加 Alias IP
使用 Google Cloud 命令行工具,根据上面的打印结果,分别更新各个 Node 的 Alias IP,使其与该 Node 的 Pod CIDR 一致。
Node-1
Node-2
3、检测配置
A 创建 deployment 和 service
现在集群上的 Pod 除了可以同一子网内互相访问,也可以让 VPC 下其它子网(同一区域或者不同区域都可以)以及通过专线或 VPN 与本 VPC 互通的线下机房网络里的虚机来访问。下面在不同区域创建一个新子网,以及该子网下的虚机,来访问集群上的 Pod。
如果检测结果与下面的结果有差异,确认执行 Master 节点配置的“安装 ip-masq-agent”一节。
四、总结
在 GCE 上通过 kubeadm 可以非常方便的安装 kubernetes 集群,通过 GCP VPC 的各种网络功能,配合 Kubernetes 本身 cloud-provider 的功能,可以非常方便的实现 Kubernetes 网络的各种功能。
Appendix
1、kubeadm 创建 token
2、alias IP 模式下的配置
确认删除 Alias IP 的本地路由:
通过 GCP Alias IP 实现跨 Node 的 Pod 互通
3、K8s 网络针对 GCP 的配置注意事项
https://kubernetes.io/docs/concepts/cluster-administration/networking/#google-compute-engine-gce
4、Node, Pod 和 Service 网段配置参考表
https://cloud.google.com/kubernetes-engine/docs/concepts/alias-ips#cluster_sizing_secondary_range_pods
5、Kubadmin 安装步骤
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
Kubeadmin init 参数
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/
Ip-masq-agent 部署
https://kubernetes.io/docs/tasks/administer-cluster/ip-masq-agent/
文章信息
相关推荐
