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 网络与 Network Policy;Kubernetes 网络模型
复制代码

 

复制代码
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转换
    之后的通信逻辑见其他场景
kubernetes网络通信场景
复制代码

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命令:集群、调度配置、操作资源(资源部署、更新、删除等)
复制代码

 

复制代码
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,可以看到数据是明文的形式保存!
kubectl命令:交互资源、查看日志、操作资源(deployment、job、pod、services等)
复制代码

 

复制代码
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
kubectl
复制代码

 


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

 



posted @   雲淡風輕333  阅读(187)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示