义乌正规自适应网站建设首选,wordpress防御插件,宁夏微信网站建设,徐州网站制作企业Kubernetes作为编排引擎管理着分布在不同节点上的容器和Pod。Pod、Service、外部组件之间需要⼀种可靠的方找到彼此并进行通信#xff0c;Kubernetes网络则负责提供这个保障。
1.1 Kubernetes网络模型
Container-to-Container的网络 当Pod被调度到某个节点#xff0c;Pod中…Kubernetes作为编排引擎管理着分布在不同节点上的容器和Pod。Pod、Service、外部组件之间需要⼀种可靠的方找到彼此并进行通信Kubernetes网络则负责提供这个保障。
1.1 Kubernetes网络模型
Container-to-Container的网络 当Pod被调度到某个节点Pod中的所有容器都在这个节点上运行这些容器共享相同的本地问件系统、IPC和网络命名空间。不同Pod之间不存在端口冲突的问题因为每个Pod都有自己的IP地址。当某个容器使用localhost时意味着使用的是容器所属Pod的地址空间。 2. Pod之间的通信 Pod的IP是集群可见的即集群中的任何其他Pod和节点都可以通过IP直接与Pod通信这种通信不需要借助任何网络地址转换、隧道或代理技术。Pod内部和外部使用的是同⼀个IP这也意味着标准的命名服务和发现机制比如如DNS可以直接使用
数据包的传递Pod-to-Pod同节点 在 network namespace 将每一个 Pod 隔离到各自的网络堆栈的情况下虚拟以太网设备virtual Ethernet device将每一个 namespace 连接到 root namespace网桥将 namespace 又连接到一起此时Pod 可以向同一节点上的另一个 Pod 发送网络报文了。下图演示了同节点上网络报文从一个Pod传递到另一个Pod的情况。 数据包的传递Pod-to-Pod跨节点 在了解了如何在同节点上 Pod 之间传递数据包之后我们接下来看看如何在跨节点的 Pod 之间传递数据包。Kubernetes 网络模型要求 Pod 的 IP 在整个网络中都可访问但是并不指定如何实现这一点。实际上这是所使用网络插件相关的但是仍然有一些模式已经被确立了。 3. Pod与Service的通信 在Kubernetes集群中Pod可能会频繁地销毁和创建也就是说Pod的IP不是固定的。为了解决这个问题Service提供了访问Pod的抽象层。无论后端的Pod如何变化Service都作为稳定的前端对外提供服务。同时Service还提供了高可用和负载均衡功能Service负责将请求转发给正确的Pod。 外部访问 无论是Pod的IP还是Service的Cluster IP它们只能在Kubernetes集群中可见对集群之外的世界这些IP都是私有的。
Kubernetes提供了两种方式让外界能够与Pod通信
NodePort。Service通过Cluster节点的静态端口对外提供服务。 外部可以通过:访问Service。LoadBalancer。Service利用cloudprovider提供的loadbalancer对外提供服务cloudprovider负责将loadbalancer的流量导向Service。目前支持的cloudprovider有GCP、AWS、Azur等。
参考kubernetes基本概念
1.2 各种网络方案
为了保证网络方案的标准化、扩展性和灵活性K8S采用了CNIContainer Networking Interface规范。CNI是一个Pod网络集成标准简化了K8S和不同Pod网络实现技术的集成。
CNI最大的优点就是支持多种容器runtime而不仅仅是Docker。目前已经有多种支持K8S的网络方案包括 Flannel、Calico、Canal等它们都实现了CNI规范因此无论我们选择哪种具体方案它们的网络模型都是一致的。
1.3 Network Policy
Network Policy是K8S的一种资源它使K8S可以通过Label选择Pod并指定其他Pod或外界如何与这些Pod通信。换句话说当Pod被定义了Network Policy时只有Policy允许的流量才能访问Pod默认情况下任何来源的流量都可以访问Pod是没有限制的即帮助K8S实现更为精细的流量控制实现租户隔离机制。
但是并不是所有K8S网络方案都支持Network Policy比如Flannel就不支持而Calico是支持的。
1.4 Network Policy实践
1.5 部署Canal
想要部署Canal需要切换网络方案这里我们使用最简单粗暴的方式重建当前K8S集群
kubeadm reset # 在每个节点上执行一次然后重新对Master节点进行初始化
kubeadm init \
--apiserver-advertise-address192.168.200.128 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.0 \
--service-cidr10.1.0.0/16 \
--pod-network-cidr10.244.0.0/16在两个Node节点上执行以下命令重新加入集群 kubeadm join 192.168.200.160:6443 --token ekqxk2.iiu5wx5bbnbdtxsw --discovery-token-ca-cert-hash sha256:c50bb83d04f64f4a714b745f04682b27768c1298f331e697419451f3550f2d05
最后通过以下命令部署Canal kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/canal.yaml
1.6 部署测试应用
这里通过一个httpd应用来演示Network Policy该应用的yaml定义如下
apiVersion: apps/v1
kind: Deployment
metadata:name: httpd
spec:replicas: 3selector:matchLabels:name: networkpolicy-demotemplate:metadata:labels:name: networkpolicy-demospec:containers:- name: httpdimage: httpd:latestports:- containerPort: 80imagePullPolicy: IfNotPresent---kind: Service
apiVersion: v1
metadata:name: httpd-svc
spec:type: NodePortports:- protocol: TCPnodePort: 33000port: 8080targetPort: 80selector:name: networkpolicy-demo通过kubectl将其部署到K8S集群
kubectl apply -f httpd-demo.yaml[rootk8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpd-595dc58589-c4hcv 1/1 Running 5 2d2h 10.244.1.157 k8s-node1 none none
httpd-595dc58589-lxj9w 1/1 Running 6 2d2h 10.244.1.156 k8s-node1 none none
httpd-595dc58589-v6wzw 1/1 Running 11 4d20h 10.244.1.153 k8s-node1 none none
1.7 测试Network Policy有效性
现在我们创建一个Network Policy其配置文件yaml如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: access-httpd
spec:podSelector:matchLabels:name: networkpolicy-demoingress:- from:- podSelector:matchLabels:access: trueports:- protocol: TCPport: 80该Network Policy定义了如下规则 1应用于所有 label 为 name : networkpolicy-demo 的Pod这里即刚刚创建的三个httpd pod。 2ingress中定义了只有 label 为 access : “true” 的Pod才能访问应用。 3即使通过Policy也只能访问80端口 通过kubectl将其应用到K8S集群中
kubectl apply -f networkpolicy.yaml下面再次在busybox pod中验证Network Policy的有效性
[rootk8s-master ~]# kubectl run busvbox --rm -it --imagebusybox bin/sh
/ # wget httpd-svc:8080
Connecting to httpd-svc:8080 (10.1.216.8:8080)
wget: cant connect to remote host (10.1.216.8) Connection timed out从上可以看到已经无法再成功访问Service也无法再ping通三个Pod节点。 这个时候集群外也无法再通过NodePort访问到Service。 如果想要让测试Podbusybox能访问到应用了Network Policy的httpd应用我们可以对busybox pod加一个label就可以
[rootk8s-master ~]# kubectl run busybox --rm -it --imagebusybox --labelsaccesstrue /bin/sh
/ # wget httpd-svc:8080
Connecting to httpd-svc:8080 (10.1.216.8:8080)
saving to index.html
index.html 100% |**************************************************************************************************| 45 0:00:00 ETA
index.html saved
运行后的验证结果如下可以访问到Service但Ping却被禁止
/ # ping -c 3 10.244.1.150
PING 10.244.1.150 (10.244.1.150): 56 data bytes
--- 10.244.1.150 ping statistics ---
3 packets transmitted, 0 packets received, 100% packet loss但是此时集群节点k8s-master与两个node与集群仍然无法访问到应用了Network Policy的httpd应用如果想要让它们也访问到则需要修改Network Policy做一个类似于开防火墙白名单的操作注意下面的ipBlock配置
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: access-httpd
spec:podSelector:matchLabels:name: networkpolicy-demoingress:- from:- podSelector:matchLabels:access: true- ipBlock:cidr: 192.168.200.0/24ports:- protocol: TCPport: 80再次应用到K8S集群后再来通过集群访问试试
[rootk8s-master ~]# kubectl exec -it busvbox -- /bin/sh
/ # ping -c 3 10.244.1.150
PING 10.244.1.150 (10.244.1.150): 56 data bytes
64 bytes from 10.244.1.150: seq0 ttl62 time2.633 ms
64 bytes from 10.244.1.150: seq1 ttl62 time0.288 ms
64 bytes from 10.244.1.150: seq2 ttl62 time0.319 ms--- 10.244.1.150 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max 0.288/1.080/2.633 ms