今天我们来了解一下k8s的网络,上网搜了一下,原来k8s的网络水非常深,书上的介绍只是冰山一角。如果有兴趣继续了解的话,需要翻阅其他的资料才行。
可以看看这个,有介绍各种主流的cnihttps://www.sohu.com/a/304555150_618296
一、k8s网络模型
Kubernetes采用的是基于扁平地址空间的网络模型, 集群中的每个Pod都有自己的IP地址, Pod之间不需要配置NAT就能直接通信。 另外, 同一个Pod中的容器共享Pod的IP, 能够通过localhost通信。
这种网络模型对应用开发者和管理员相当友好, 应用可以非常方便地从传统网络迁移到Kubernetes。 每个Pod可被看作是一个个独立的系统, 而Pod中的容器则可被看作同一系统中的不同进程。
- .pod内容器之间的通信
每个pod都有属于自己的本地文件系统,ipc和namespace,而pod内的容器直接利用localhost来互相访问。 - pod之间的通信
pod的ip是集群可见的,即集群中的其他pod和节点都可以通过ip直接和pod通信。 - pod和service的通信
pod之间可以通过ip通信,但前提是知道对方的ip。在k8s中,service可以提供访问pod的抽象层,也就是让所有pod都可以从统一的ip地址来访问。同时service还提供了高可用和负载均衡功能,service负责将请求转发给正确的pod。 - 外部访问
k8s提供了两种方法让外界可以与pod通信,NodePort与LoadBalancer
二、各种网络方案
为了保证网络方案的标准化、 扩展性和灵活性, Kubernetes采用了Container Networking Interface(CNI)规范。CNI是由CoreOS提出的容器网络规范, 使用了插件(Plugin) 模型创建容器的网络栈,
目前已有多种支持Kubernetes的网络方案, 比如Flannel、Calico、 Canal、 Weave Net等。 因为它们都实现了CNI规范, 用户无
论选择哪种方案, 得到的网络模型都一样, 即每个Pod都有独立的IP, 可以直接通信。 区别在于不同方案的底层实现不同, 有的采用基于VxLAN的Overlay实现, 有的则是Underlay, 性能上有区别。 再有就是是否支持Network Policy
(Overlay网络是建立在现有网络之上的虚拟逻辑网络。Overlay网络通常用于在现有网络之上提供有用的抽象,并分离和保护不同的逻辑网络。)
三、network policy
Network Policy是Kubernetes的一种资源。 Network Policy通过Label选择Pod, 并指定其他Pod或外界如何与这些Pod通信。
默认情况下, 所有Pod是非隔离的, 即任何来源的网络流量都能够访问Pod, 没有任何限制。 当为Pod定义了Network Policy时, 只有Policy允许的流量才能访问Pod。
不过, 不是所有的Kubernetes网络方案都支持Network Policy。 比如Flannel(之前一直在用的)就不支持, Calico是支持的。 我们接下来将用Canal来演示Network Policy。 Canal这个开源项目很有意思, 它用Flannel实现Kubernetes集群网络, 同时又用Calico实现Network Policy
四、部署Canal
要先初始化k8s,执行kubeadm reset。接着初始化集群
kubeadm init --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
接着安装canal,这里的安装其实是要安装Calico。以下最新的连接要从官网找
https://docs.projectcalico.org/archive/v3.21/getting-started/kubernetes/flannel/flannel
curl https://docs.projectcalico.org/archive/v3.21/manifests/canal.yaml -O
(这里网络可能不是很好,可以多尝试几次)
接着是安装网络
sudo kubectl apply -f canal.yaml
检查一下网络的情况
done!
配置yaml文件
检查一下,搞定
由于现在没有定义任何networkpolicy,所以可以从各种方法来访问pod(内部外部等方法)。以下就不演示了。
现在创建network policy文件
matchLabels:将访问规则应用与label微run:httpd的pod上,在这里即httpd的三个副本pod
ingress:定义了只有label为access:"true"的pod才能访问应用
ports:只能访问80端口
不知道为啥一直报错…说access那一行缺少一个“-”的indicator…(如果有兄弟知道问题的话麻烦告诉我一下,我搜了好久都没找到答案)只能先挖坑了T_T
后面的监控和管理部分我就大概浏览了一下,这就算是勉强看完了这本书啦。体会是,总算对k8s有个很初步的了解,接下来打算看极客空间里面的k8s的课程,趁热打铁加深了解。
其实里面还有很多地方需要深入了解的,例如网络部分,调度的策略等等。
希望我做的笔记能帮到有看这本书的童鞋,希望我踩过的坑你不用在踩。如果看完我的笔记对你有一丁点帮助,那就最好了~