Kubernetes没有提供默认可用的容器网络,但kubernetes网络的设计文档要求容器网络的实现能做到下面的三点:
即集群包含的每一个容器都拥有一个与其他集群中的容器和节点可直接路由的独立IP地址。但是Kubernetes并没有具体实现这样一个网络模型,而是实现了一个开放的容器网络标准CNI,可以自由选择使用开源的网络方案或者实现一套遵循CNI标准的网络,为用户提供两种网络类型:
为满足复杂应用容器化的特殊需求,大幅拓展了容器应用的场景,TKEStack利用Galaxy网络组件提供多种解决方案,支持overlay和underlay网络类型,支持高转发性能和高隔离性等场景应用。
Galaxy是一个Kubernetes网络项目,旨在为POD提供通用Overlay和高性能的Underlay网络。
TKEStack使用Galaxy网络组件,支持四种网络模式,并且可以为工作负载单独配置指定的网络模式,拓展了容器应用场景,满足复杂应用容器化的特殊需求。
Overlay网络
TKEStack的默认网络模式,基于IPIP和host gateway的flannel方案,同节点容器通信不走网桥,报文直接利用主机路由转发;跨节点容器通信利用IPIP协议封装, etcd记录节点间路由。该方案控制层简单稳定,网络转发性能优异,并且可以通过network policy实现多种网络策略。
Floating IP
容器IP由宿主机网络提供,打通了容器网络与underlay网络,容器与物理机可以直接路由,性能更好。容器与宿主机的二层连通, 支持了Linux bridge/MacVlan/IPVlan和SRIOV, 根据业务场景和硬件环境,具体选择使用哪种网桥
NAT
基于k8s中的hostPort配置,并且如果用户没有指定Port地址,galaxy会给实例配置容器到主机的随机端口映射
Host
利用k8s中的hostNetwork配置,直接使用宿主机的网络环境,最大的好处是其性能优势,但是需要处理端口冲突问题,并且也有安全隐患。
Galaxy在架构上由三部分组成:
tke-installer安装tkestack并自动配置galaxy为overlay网络模式,在该模式下:
如需配置underlay网络,需要启用Galaxy-ipam组件,Galaxy-ipam根据配置为POD分配或释放IP:
如果上述配置都正确,pod会被成功创建并运行,galaxy-ipam会自动为pod分配指定的Float IP
为pod配置float ip网络模式后,如何与其他pod和主机通信
Galaxy为pod配置float ip网络模式,pod的nic和ip由宿主机网络提供,此pod的就加入了underlay的网络,因此pod间的通信以及pod与主机的通信就需要网络管理员在相应的交换机和路由器上配置对应的路由。
本节展示了在一个正确配置了float-ip的deployment工作负载。
# cat /etc/kubernetes/scheduler-policy-config.json
{
"apiVersion" : "v1",
"extenders" : [
{
"apiVersion" : "v1beta1",
"enableHttps" : false,
"filterVerb" : "predicates",
"managedResources" : [
{
"ignoredByScheduler" : false,
"name" : "tencent.com/vcuda-core"
}
],
"nodeCacheCapable" : false,
"urlPrefix" : "http://gpu-quota-admission:3456/scheduler"
},
{
"urlPrefix": "http://127.0.0.1:32760/v1",
"httpTimeout": 10000000000,
"filterVerb": "filter",
"prioritizeVerb": "prioritize",
"BindVerb": "bind",
"weight": 1,
"enableHttps": false,
"managedResources": [
{
"name": "tke.cloud.tencent.com/eni-ip",
"ignoredByScheduler": true
}
]
}
],
"kind" : "Policy"
}
# kubectl get cm -n kube-system floatingip-config -o yaml
apiVersion: v1
data:
floatingips: '[{"routableSubnet":"172.21.64.0/20","ips":["192.168.64.200~192.168.64.251"],"subnet":"192.168.64.0/24","gateway":"192.168.64.1"}]'
kind: ConfigMap
metadata:
creationTimestamp: "2020-03-04T07:09:14Z"
name: floatingip-config
namespace: kube-system
resourceVersion: "2711974"
selfLink: /api/v1/namespaces/kube-system/configmaps/floatingip-config
uid: 62524e92-f37b-4db2-8ec0-b01d7a90d1a1
# kubectl get deploy nnn -o yaml
apiVersion: apps/v1
kind: Deployment
...
spec:
...
template:
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: galaxy-k8s-vlan
k8s.v1.cni.galaxy.io/release-policy: immutable
creationTimestamp: null
labels:
k8s-app: nnn
qcloud-app: nnn
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nnn
resources:
limits:
cpu: 500m
memory: 1Gi
tke.cloud.tencent.com/eni-ip: "1"
requests:
cpu: 250m
memory: 256Mi
tke.cloud.tencent.com/eni-ip: "1"
# kubectl get pod nnn-7df5984746-58hjm -o yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
k8s.v1.cni.cncf.io/networks: galaxy-k8s-vlan
k8s.v1.cni.galaxy.io/args: '{"common":{"ipinfos":[{"ip":"192.168.64.202/24","vlan":0,"gateway":"192.168.64.1","routable_subnet":"172.21.64.0/20"}]}}'
k8s.v1.cni.galaxy.io/release-policy: immutable
...
spec:
...
status:
...
hostIP: 172.21.64.15
phase: Running
podIP: 192.168.64.202
podIPs:
- ip: 192.168.64.202
# kubectl get floatingips.galaxy.k8s.io 192.168.64.202 -o yaml
apiVersion: galaxy.k8s.io/v1alpha1
kind: FloatingIP
metadata:
creationTimestamp: "2020-03-04T08:28:15Z"
generation: 1
labels:
ipType: internalIP
name: 192.168.64.202
resourceVersion: "2744910"
selfLink: /apis/galaxy.k8s.io/v1alpha1/floatingips/192.168.64.202
uid: b5d55f27-4548-44c7-b8ad-570814b55026
spec:
attribute: '{"NodeName":"172.21.64.15"}'
key: dp_default_nnn_nnn-7df5984746-58hjm
policy: 1
subnet: 172.21.64.0/20
updateTime: "2020-03-04T08:28:15Z"
# ip route
default via 172.21.64.1 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.21.64.0/20 dev eth0 proto kernel scope link src 172.21.64.15
...
192.168.64.202 dev v-hb21e7165d