K8S学习笔记|10-Network

Kubernetes

Posted by Claire on September 6, 2023

前面聊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.yamlkubectl 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流量路由到不同的应用