前面聊Service的时候有聊到部分网络,Service是访问容器,ClusterIp
的模式可以让Pod在k8s内通过IP互相访问,NodePort
可以让Pod被外部所访问,Service的配置方式可以让Pod直接不同IP通过label就可以互相访问
每个Pod都有一个独立IP,用于K8S集群内容相互访问,同一个Pod上的容器可以localhost直接通信
Pod与外部通信,除了NodePort方式,还可以通过Cloud Provider的方式,目前支持cloud provider的有GCP\SWS\Azure等
K8S采用Container Network Interface的规范 CNI,进行网络方案的标准化、扩展性、灵活性
目前可选的网络方案有Flannel\calico\cannel\weave net等
Network Policy
目前Flannel不支持,calico支持,cannel底层采用flannel搭建K8S底层网络架构使用calico实现network policy
--pod-netword-cidr=指定了网段
后
通过 kubectl apply -f http://11111/rbac.yaml
,kubectl apply -f http://11111/cannel.yaml
可以安装Cannel组件,Cannel作为DaemonSet部署到每一个Node上,属于kube-system的空间下
port
port是k8s集群内部访问service的端口,即通过clusterIP: port可以访问到某个service
NodePort
nodePort是外部访问k8s集群中service的端口,通过nodeIP: nodePort可以从外部访问到某个service。
targetPort
targetPort是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器。
containerPort
containerPort是pod内部容器的端口,targetPort映射到containerPort
创建Network Policy
apiVersion:networking.k8s.io/v1
kind:NetworkPolicy
metadata:
name: net-httpd
spec:
podSelector:
matchLabels:
run:httpd
ingress:
- from:
- podSelector:
matchLabels;
access: "true"
ports:
- protocol: TCP
port:80
pod label为run:httpd ingress 的label为access: “true” 的才能访问应用 对外开放80端口
通过Network Policy能够对Pod的访问配置设置 ipBlock:cidr指定可访问的网络段
Service
从逻辑上将pod分组,允许它们直接通过IP或者DNS的名字访问特定端口
ServiceTypes: 用于指定Service的类型,主要有ClusterIP/NodePort/LoadBalancer/ExternalName
- ClusterIp是默认的形式
- NodePort是创建一个30000+的端口,与底层Node节点做做映射,允许应用直接通过Node的IP地址和端口进行访问
- LoadBalancer是通过额外的IP地址,连接Pod和复杂均衡池
- ExternalName,创建一个特定的DNS项供更为简单的应用访问
可以通过load balance来分散流量。7层应用流量路由(https)可以通过ingress controller配置。可以控制集群Node的对外流量 ingress。可以通过网络策略,管理对Pod网络流量的安全和过滤
kubenet
- 节省IP地址空间
- 使用 Kubernetes 内部或外部负载均衡器从集群外部访问 Pod
- 手动管理和维护用户定义的路由
Ingress Controller
LoadBalancer通常工作在第四层,无法感知真实的应用,不能制定更多的路由事项
IngressController 能工作在第七层,可以使用更多智能的规则来分散应用流量,主要根据访问进来的URL来将HTTP流量路由到不同的应用