Kubernetes :网络;网络模型;网络通信场景;kubectl命令
Kubernetes 网络

Kubernetes 网络与 Network Policy;Kubernetes 网络模型 ===================================================================================================== Kubernetes 网络与 Network Policy Kubernetes 网络 为了保证网络方案的标准化、扩展性和灵活性,Kubernetes 采用了 Container Networking Interface(CNI)规范。 CNI 是由 CoreOS 提出的容器网络规范,它使用了插件(Plugin)模型创建容器的网络栈。 目前已有多种支持 Kubernetes 的网络方案,比如 Flannel、Calico、Canal、Weave Net 等。因为它们都实现了 CNI 规范,用户无论选择哪种方案,得到的网络模型都一样,即每个 Pod 都有独立的 IP,可以直接通信。区别在于不同方案的底层实现不同,有的采用基于 VxLAN 的 Overlay 实现,有的则是 Underlay,性能上有区别。再有就是是否支持 Network Policy。 Network Policy Canal 这个开源项目很有意思,它用 Flannel 实现 Kubernetes 集群网络,同时又用 Calico 实现 Network Policy。 ----------------------------------------------------------------------------------------------------- Kubernetes 网络模型 Kubernetes 采用的是基于扁平地址空间的网络模型,集群中的每个 Pod 都有自己的 IP 地址,Pod 之间不需要配置 NAT 就能直接通信。另外,同一个 Pod 中的容器共享 Pod 的 IP,能够通过 localhost 通信。 Pod 内容器之间的通信 当 Pod 被调度到某个节点,Pod 中的所有容器都在这个节点上运行,这些容器共享相同的本地文件系统、IPC 和网络命名空间。 Pod 之间的通信 Pod 的 IP 是集群可见的,即集群中的任何其他 Pod 和节点都可以通过 IP 直接与 Pod 通信,这种通信不需要借助任何的网络地址转换、隧道或代理技术。Pod 内部和外部使用的是同一个 IP,这也意味着标准的命名服务和发现机制,比如 DNS 可以直接使用。 Pod 与 Service 的通信 Pod 间可以直接通过 IP 地址通信,但前提是 Pod 得知道对方的 IP。在 Kubernetes 集群中, Pod 可能会频繁的销毁和创建,也就是说 Pod 的 IP 不是固定的。 为了解决这个问题,Service 提供了访问 Pod 的抽象层。无论后端的 Pod 如何变化,Service 都作为稳定的前端对外提供服务。同时,Service 还提供了高可用和负载均衡功能,Service 负责将请求转发给正确的 Pod。 Kubernetes 提供了两种方式让外界能够与 Pod 通信: 1.NodePort Service 通过 Cluster 节点的静态端口对外提供服务。外部可以通过 <NodeIP>:<NodePort> 访问 Service。 2.LoadBalancer Service 利用 cloud provider 提供的 load balancer 对外提供服务,cloud provider 负责将 load balancer 的流量导向 Service。目前支持的 cloud provider 有 GCP、AWS、Azur 等。

kubernetes网络通信场景: ============================================================================================== 1.host内部pod互访:(基于docker0网桥) 无论pod是否基于相同的k8s namespace,pod都处于相同的docker0网段,通过docker网桥直接通信 2.host间pod互访:(基于docker0网桥和flannel隧道) 与是否相同的k8s namespace无关; host间互访场景下,流量走指向flannel tun设备的路由,通过隧道到达目标host; 目标host的flannel tun设备剥离外层,根据内层报头流量暴露到docker0网络,最终完成通信 测试相同k8s namespace、不同node节点的pod互访:ping包成功,通过flannel隧道进行跨设备通信 测试相同k8s namespace、相同node节点的pod互访:ping包成功,处于docker0网段内,通过docker0进行通信 测试不同k8s namespace、相同node节点的pod互访:ping包成功,处于docker0网段内,通过docker0进行通信 测试不同k8s namespace、不同node节点的pod互访:ping包成功,通过flannel隧道进行跨设备通信 3.k8s集群设备访问本host的pod: 源IP为docker0网桥的IP,直接通信 4.k8s集群设备访问跨host的pod: 源IP为flannel0 tun设备的IP,走隧道完成通信 5.pod直接访问k8s集群外部网络(基于iptables的SNAT) 就是源生的docker容器访问外网的场景,例如百度 容器的默认网关为docker0网桥,然后走宿主机路由出网,iptables在POSTROUTING链中进行SNAT 6.外部网络直接访问pod docker容器可以映射宿主机的端口或docker网桥直接接入到底层网络完成通信 但是在k8s场景中可能不存在这种方式 7.pod访问service cluster IP(基于iptables) service cluster IP是虚拟IP,对于非node节点的设备(包括master和外部网络),是无法访问的 这是基于iptables的,仅配置在node节点的iptables中;master节点的iptables是没有配置的 通过iptables完成了负载均衡和DNAT转换 之后的通信逻辑见其他场景 8.node节点访问service cluster IP(同上) 9.非node节点访问service cluster IP(无法访问) 因为对于非node节点设备而言,service cluster IP是不存在的 因为service cluster IP仅存在于node节点的iptables中 10.外部网络访问service nodeport(基于iptables) 暴露的是host的port 基于iptables完成了负载均衡和DNAT转换 之后的通信逻辑见其他场景
kubectl命令

kubectl命令:集群、调度配置、操作资源(资源部署、更新、删除等) ======================================================================================= 集群: kubectl get cs # 集群健康情况 kubectl cluster-info # 集群核心组件运行情况 kubectl cluster-info dump # k8s集群的详细信息 kubectl get namespaces # 表空间名 kubectl get ns # 表空间名 kubectl version # 版本 kubectl get events # 查看事件 kubectl get nodes # 获取全部节点 kubectl delete node k8s2 # 删除节点 kubectl rollout status deploy nginx-test kubectl api-versions # API kubectl explain DaemonSet.apiVersion #K8S的apiVersion该用哪个 https://www.jianshu.com/p/457cf0835f88 调度配置 kubectl cordon k8s-node # 标记 my-node 不可调度 kubectl drain k8s-node # 清空 my-node 以待维护 kubectl uncordon k8s-node # 标记 my-node 可调度 kubectl top node k8s-node # 显示 my-node 的指标度量 kubectl cluster-info dump # 将当前集群状态输出到 stdout kubectl cluster-info dump --output-directory=/path/to/cluster-state # 将当前集群状态输出到 /path/to/cluster-state #如果该键和影响的污点(taint)已存在,则使用指定的值替换 kubectl taint nodes foo dedicated=special-user:NoSchedule 操作资源(资源部署、更新、删除等): kubectl apply 是个全面型的操作,可以完成大多数工作,例如创建资源、更新资源、伸缩资源等。 # 创建 kubectl create -f ./nginx.yaml # 创建资源 kubectl create -f . # 创建当前目录下的所有yaml资源 kubectl create -f ./nginx1.yaml -f ./mysql2.yaml # 使用多个文件创建资源 kubectl create -f ./dir # 使用目录下的所有清单文件来创建资源 kubectl create -f https://git.io/vPieo # 使用 url 来创建资源 kubectl run -i --tty busybox --image=busybox ----创建带有终端的pod kubectl run nginx --image=nginx # 启动一个 nginx 实例 kubectl run mybusybox --image=busybox --replicas=5 ----启动多个pod kubectl explain pods,svc # 获取 pod 和 svc 的文档 # 更新 kubectl rolling-update python-v1 -f python-v2.json # 滚动更新 pod frontend-v1 kubectl rolling-update python-v1 python-v2 --image=image:v2 # 更新资源名称并更新镜像 kubectl rolling-update python --image=image:v2 # 更新 frontend pod 中的镜像 kubectl rolling-update python-v1 python-v2 --rollback # 退出已存在的进行中的滚动更新 cat pod.json | kubectl replace -f - # 基于 stdin 输入的 JSON 替换 pod 强制替换,删除后重新创建资源。会导致服务中断。 kubectl replace --force -f ./pod.json 为 nginx RC 创建服务,启用本地 80 端口连接到容器上的 8000 端口 kubectl expose rc nginx --port=80 --target-port=8000 更新单容器 pod 的镜像版本(tag)到 v4 kubectl get pod nginx-pod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f - kubectl label pods nginx-pod new-label=awesome # 添加标签 kubectl annotate pods nginx-pod icon-url=http://goo.gl/XXBTWq # 添加注解 kubectl autoscale deployment foo --min=2 --max=10 # 自动扩展 deployment “foo” # 编辑资源 kubectl edit svc/docker-registry # 编辑名为 docker-registry 的 service KUBE_EDITOR="nano" kubectl edit svc/docker-registry # 使用其它编辑器 # 动态伸缩pod kubectl scale --replicas=3 rs/foo # 将foo副本集变成3个 kubectl scale --replicas=3 -f foo.yaml # 缩放“foo”中指定的资源。 kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # 将deployment/mysql从2个变成3个 kubectl scale --replicas=5 rc/foo rc/bar rc/baz # 变更多个控制器的数量 kubectl rollout status deploy deployment/mysql # 查看变更进度 kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2 #当前应用使用的 image 版本为 v1,执行如下命令将其升级到 v2 #通过 kubectl get pods 可以观察滚动更新的过程:v1 的 Pod 被逐个删除,同时启动了新的 v2 Pod。 kubectl rollout undo deployments/kubernetes-bootcamp #回退上一步操作;回退到 v1 版本 # 删除 kubectl delete -f ./pod.json # 删除 pod.json 文件中定义的类型和名称的 pod kubectl delete pod,service baz foo # 删除名为“baz”的 pod 和名为“foo”的 service kubectl delete pods,services -l name=myLabel # 删除具有 name=myLabel 标签的 pod 和 serivce kubectl delete pods,services -l name=myLabel --include-uninitialized # 删除具有 name=myLabel 标签的 pod 和 service,包括尚未初始化的 kubectl -n my-ns delete po,svc --all # 删除 my-ns namespace下的所有 pod 和 serivce,包括尚未初始化的 kubectl delete pods prometheus-7fcfcb9f89-qkkf7 --grace-period=0 --force 强制删除

kubectl命令:交互资源、查看日志、操作资源(deployment、job、pod、services等) ====================================================================================== 交互资源 kubectl run -i --tty busybox --image=busybox -- sh # 交互式 shell 的方式运行 pod kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword kubectl attach nginx-pod -i # 连接到运行中的容器 kubectl port-forward nginx-pod 5000:6000 # 转发 pod 中的 6000 端口到本地的 5000 端口 kubectl top pod POD_NAME --containers # 显示指定 pod和容器的指标度量 kubectl exec nginx-pod -- ls / # 在已存在的容器中执行命令(只有一个容器的情况下) kubectl exec nginx-pod -c my-container -- ls / # 在已存在的容器中执行命令(pod 中有多个容器的情况下) kubectl exec my-nginx-5j8ok -- printenv | grep SERVICE # 查看pod变量 kubectl exec mypod1 touch /mydata/hello ------------------------------------------------------------------------------------- 查看日志 kubectl logs nginx-pod # dump 输出 pod 的日志(stdout) kubectl logs nginx-pod -c my-container # dump 输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用) kubectl logs -f nginx-pod # 流式输出 pod 的日志(stdout) kubectl logs -f nginx-pod -c my-container # 流式输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用) -------------------------------------------------------------------------------------- 操作资源(deployment、job、pod、services等) kubectl get deployment,pod #支持一个命令查看多个资源 操作node kubectl label node k8s-node-2 disktype=ssd_label #为node节点设置标签 kubectl label node k8s-node-2 disktype- #删除node节点的指定标签 kubectl get node --show-labels #查看node节点的标签 操作deployment kubectl get deployment #查看deployment 概况,查看副本数 kubectl get deployment httpd-app kubectl describe deployment #了解更详细的信息 kubectl delete deployment nginx-deployment #删除这个才会真正地删除应用 kubectl get deployment --all-namespaces # 获取所有deployment 操作replicaset kubectl get replicaset #查看replicaset kubectl delete replicaset nginx-deployment-3954615459 #删除了会自动拉起的- -,,, kubectl describe replicaset #了解更详细的信息 kubectl describe rs #各种缩写。。。 kubectl describe rs nginx-deployment 操作daemonset kubectl get daemonset kubectl get daemonset --namespace=kube-system kubectl delete daemonset --namespace=kube-system nginx-deamonset 操作job kubectl get job 操作cronjob kubectl get cronjob 操作pod kubectl get pods #查看当前的 Pod kubectl get pod --all-namespaces -o wide #查看 Pod 的状态 --all-namespaces:显示pod所属的namespace;如果不指定则只返回默认 namespace default 中的资源 -o wide:显示更多的内容,pod IP以及相应的node节点 kubectl get pod -o wide nginx-deployment-3954615459-1gbdv #加上pod名称,即查看指定的pod kubectl get pod kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system #查看具体pod,记得后边跟namespace名字哦 kubectl get pod -o wide kubernetes-dashboard-76479d66bb-nj8wr --namespace=kube-system ## 查看pod具体信息 kubectl get pod -o wide kubectl get pod --all-namespaces -o wide kubectl get pod --show-all kubectl get pod --include-uninitialized # 列出该 namespace 中的所有 pod 包括未初始化的 kubectl describe pod nginx-deployment-3954615459-xw6xn #查看pods结构信息(重点,通过这个看日志分析错误) kubectl edit pod producer-consumer #此处这个应用就是pod类型 kubectl exec mypod1 touch /mydata/hello kubectl logs nginx-pod # dump 输出 pod 的日志(stdout) kubectl logs nginx-pod -c my-container # dump 输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用) kubectl logs -f nginx-pod # 流式输出 pod 的日志(stdout) kubectl logs -f nginx-pod -c my-container # 流式输出 pod 中容器的日志(stdout,pod 中有多个容器的情况下使用) 操作service kubectl get services #查看应用被映射到节点的哪个端口。 kubectl get service 操作 secret、configmap kubectl get secret #查看存在的 secret。 kubectl describe secret #查看条目的 Key kubectl edit secret mysecret #查看 Value,可以看到数据是密文的形式保存,使用了base64编码 kubectl get configmap #查看存在的 configmap。 kubectl describe configmap #查看条目的 Key kubectl edit configmap myconfigmap #查看 Value,可以看到数据是明文的形式保存!

argo -n ark-system get XXX #查看工作流具体信息 argo -n ark-system list |head -10 #查看工作流状态, -n为指定ark-system命名空间,所有工作流均在ark-system的命名空间中。 argo -n ark-system logs -w XXXX #查看某个工作流日志,可以执行参数--tail 100查看最后100行 argo -n ark-system terminate xxxx # 终止某个工作流 argo -n ark-system retry XXXX #重试失败或者错误的工作流 #kubectl 所有get指令均可以加上-A查看所有命名空间 kubectl get po -A|grep -Ev '1/1|2/2|3/3|4/4|Com' #查看异常POD列表,高频使用 kubectl get ns #查看命名空间列表 kubectl get statefulset #查看statefulset列表,中间件与底座大量使用该类型控制器 kubectl get daemonset #查看daemonset列表,基础组件大量使用该类型控制器 kubectl get deployment #查看deployment 列表,大部分组件使用该类型控制器 kubectl delete pods XXX -n XXX #静态POD直接删除,非静态POD(statefulset/daemonset/deployment管理的POD)重启-n指定命名空间 kubectl get node #查看节点列表,可以加上--show-labels查看label,可以加上-o wide查看IP kubectl describe po XXXX -n $namespaces #查看指定命名空间POD状态,可加上-o wide参数显示详细信息 kubectl get svc #查看服务列表,可指定参数-A参看所有命名空间中的服务 kubectl get ingress -A #查看域名列表,可指定参数-A参看所有命名空间中的对外域名列表 kubectl get crd -A #查看自定义资源列表 kubectl logs xxxx --tail 50 #查看某个PO日志的最后50行,加上参数-p 可以查看更详细日志。 kubectl label node $nodename XXXXXX=YYYY #给节点增加标签 kubectl label node $nodename XXXXXX- #给节点去掉标签 kubectl taint node $nodename XXXXX=true:NoSchedule #给节点增加污点 kubectl taint node $nodename XXXXX:NoSchedule- #给节点去掉污点 kubectl get machine.infrastructure -A #查看machine初始化状态 kubectl get appset -A #查看产品部署状态 kubectl get appinstances -A #查看feature部署状态 kubectl get network -A #查看网络分配状态 kubectl get subnet -A #查看网络子网状态 kubectl get pod -naso 查询异常pod,-n指定pod名 kubectl get pods -o wide|grep broker-mq查询pod kubectl cp -nXXX 镜像名称:/usr/local/rds/metadb/1.txt ./1.txt 从pod中取出文件 kubectl cp -nXXX ./Desktop/ asapiapiserver-1:/alidata/从pod中考入文件 查询单个pod所有 kubectl get pod -A |grep ** 查看ark的pod地址 kubectl get pod -owide 查询ark部署机器 Kubectl get node ———————————————— 原文链接:https://blog.csdn.net/m0_54357014/article/details/122196131
grep service-cluster-ip-range /etc/kubernetes/manifests/kube-apiserver.yaml # 查看k8s services 网段
kubectl get configmap -A -o yaml|grep "ServiceCIDR" # 查看k8s services 网段
================================================================================================
一个docker容器占用一个network namespace
ln -s /var/run/docker/netns /var/run/netns之后
ip netns就可以查看到容器占用的namespace了
其实docker inspect 容器;是可以看到docker容器占用的namespace的
[root@centos7 k8s_yml]# docker inspect d9eb10488a29 |grep 13684d3098aa
"SandboxID": "13684d3098aa34adff4afe827564281e930f9f2e47f6db4e6313068aaf9cc88d",
"SandboxKey": "/var/run/docker/netns/13684d3098aa",
-----------------------------------------------------------------
/var/run/docker/netns目录下都是文件,一个文件对应一个namespace,居然还是空文件!!!
k8s namespace 和docker namespace 应该是没有直接关系的
猜测:k8s namespace是相对于k8s集群的namespace,是用来划分项目的
node节点的pod则是基于一个个network namespace,是相对于host的
k8s集群中的每个 Pod 都有自己的 IP 地址,真正运行应用的容器则是container方式,共用pod的网络空间
==============================================================
参考文章:
一文看懂k8s的Flannel网络 https://zhuanlan.zhihu.com/p/140711132
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!