service网络

之前学下pod时,k8s集群所有node上的的pod在一个fannel搭建的一个互通的网络中,每一个pod的ip都是互通的,即使不同空间下的空间下。由kubectl exec 进入一个pod容器里面ping不同命名空间的ip也能ping通得知。
但是,service(即常说的svc)定义了一中抽象,是几个完全一样的pod(可能有多个副本的pod)的分组。这几个分组对外提供一种服务,也就是微服务。这种服务只到4层(运输层,ip:port)提供服务,所以不会到http接口层7层的服务。这种服务pod通过label-selector(一个或者多个标签)标识属于某一个svc。svc表示一种服务,有自己的一个虚拟ip,也是服务ip,这一层的网络是不同于fannel搭建的网络。外网要实际访问k8s集群的某一个pod,必须是通过svc网络进来的,不能通过fannel网络。当然svc网络也可以被集群内部的其他svc或者pod访问,例如schui访问sch
每个node上有自己的kube-proxy进程,有了ipvs规则使用NAT技术可以把访问svc虚拟。
ip的流量达到实在的pod上去
查看ipvs相关信息,可以使用ipvsadm指令,例如ipvsadm -Ln指令查看规则
在这里插入图片描述

svc代理模式理解:为svc下实实在在干事情的几个pod提供一个统一的访问方式(ip,端口)。根据实现的由iptable->ipvs的过程,ipvs有轮询调度,哈希存储等优点

service在k8s中有4种类型(注意前三者是递进关系):
CLusterIP类型:默认类型,自动分配一个仅允许k8s内部访问的虚拟IP
NodePort类型在ClusterIP基础上为svc在1每台机器上绑定一个端口,这样子就可以通过物理机ip加端口访问这个svc,类似外网访问docker容器内部容器作端口映射,个人理解这类型是外网进来的入口类型
LoadBalancer类型:在NodePort类型上借助云提供商服务在node之间再加一个负载均衡器并请求转发到NodePort上
ExternalName类型:把集群外部的服务引入到集群内部来在急群中可以直接使用,没有任何代理被创建

进入一个pod的容器ping访问svc的虚拟IP是可以通的
这个就是好像内部访问下游,sch访问schui

lqh-svc-dm1-54bc5d8f46-5rg45这个容器是进去安装了ping指令的,怎么安装见docker学习教程
在这里插入图片描述

clusterIP实践

新建deployment类型的pod,pod是通过label关联到控制器和service的

apiVersion: apps/v1
kind: Deployment
metadata:
  name: lqh-svc-dm1
  namespace: space02  #声明一个新的命名空间

spec:
  replicas: 3
  selector:
    matchLabels:
      lqhdm-lab: lqhdm-lab-value #绑定的lqh-svc-dm1的label
  template: # pod薪资嵌套在这个控制器的template里面
    metadata:
      labels:
        clusterIp-lab: clusterIp-lab-Value #绑定ClusterIp的label
        lqhdm-lab: lqhdm-lab-value #绑定的lqh-svc-dm1的label
        nodeport-lab: nodeport-lab-value #绑定selector的label
    spec:
      containers: #指定这个pod的容器 下面的中横杠是表示yaml格式的数组
      - name: redis01 #容器名
        image: redis  #镜像名字
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 6379
        - containerPort: 8080
      - name: nginx01  #容器名
        image: nginx  #镜像名字
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

clusterIp资源清单:
clusterIp不指定会自动分配,且要在固定的子网下,这个不是fannel下的
分配的ip,不用符合它的范围。这个ip可以在node下ping通,port,targetPort区别看下

apiVersion: v1
kind: Service
metadata:
  name: lqh-clusterip1
  namespace: space02

spec:
  type: ClusterIP
  selector:
    clusterIp-lab: clusterIp-lab-Value #绑定ClusterIp的label
  clusterIP: 10.96.12.13  #这个字段不填自动分配,且必须在10.96.0.0/12这个范围
  ports:
  - name: redis01p1
    port: 6378 #访问svc暴露的port
    targetPort: 6379 #svc访问pod使用port
  - name: redis01p2
    port: 8090
    targetPort: 8080
  - name: nginx01
    port: 81
    targetPort: 80
#  template: # pod薪资嵌套在这个控制器的template里面
#    metadata:
#      labels:
#        clusterIp-lab: clusterIp-lab-Value #绑定ClusterIp的label
#        lqhdm-lab: lqhdm-lab-value #绑定的lqh-svc-dm1的label
#        nodeport-lab: nodeport-lab-value #绑定selector的label
#    spec:
#      containers: #指定这个pod的容器 下面的中横杠是表示yaml格式的数组
#      - name: redis01 #容器名
#        image: redis  #镜像名字
#        imagePullPolicy: IfNotPresent
#        ports:
#        - containerPort: 6379
#        - containerPort: 8080
#      - name: nginx01  #容器名
#        image: nginx  #镜像名字
#        imagePullPolicy: IfNotPresent
#        ports:
#        - containerPort: 80

看效果:
在这里插入图片描述

在这里插入图片描述

NodePort实践

沿用上面clusterIP类型的svc下的deployment(lqh-svc-dm1)建一个10.96.12.14为IP的nodePort类型的svc.。

apiVersion: v1
kind: Service
metadata:
  name: lqh-nodeport1
  namespace: space02

spec:
  type: NodePort
  selector:
    nodeport-lab: nodeport-lab-value #绑定selector的label
  clusterIP: 10.96.12.14  #这个字段不填自动分配,且必须在10.96.0.0/12这个范围
  ports:
  - name: redis01p1
    port: 6378 #访问svc暴露的port
    targetPort: 6379 #svc访问pod使用port
  - name: redis01p2
    port: 8090
    targetPort: 8080
  - name: nginx01
    port: 81
    targetPort: 80
#  template: # pod薪资嵌套在这个控制器的template里面
#    metadata:
#      labels:
#        clusterIp-lab: clusterIp-lab-Value #绑定ClusterIp的label
#        lqhdm-lab: lqhdm-lab-value #绑定的lqh-svc-dm1的label
#        nodeport-lab: nodeport-lab-value #绑定selector的label
#    spec:
#      containers: #指定这个pod的容器 下面的中横杠是表示yaml格式的数组
#      - name: redis01 #容器名
#        image: redis  #镜像名字
#        imagePullPolicy: IfNotPresent
#        ports:
#        - containerPort: 6379
#        - containerPort: 8080
#      - name: nginx01  #容器名
#        image: nginx  #镜像名字
#        imagePullPolicy: IfNotPresent
#        ports:
#        - containerPort: 80


看效果:
自动在该node分配三个port和nodeport资源清单port作对应
在这里插入图片描述
ipvsadm -Ln查看规则表
在这里插入图片描述
同样也有本机nodeip与pod里面端口的映射关系
在这里插入图片描述
本机浏览器访问NodeIP+端口访问到这个nodeport下的实际pod的容器
类似于外网访问docker里面的容器,也必须要物理机作端口映射。nodeport这种svc是在每一个node上给出相同的端口
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ingress代理对外暴露方式

ingress暴露其实也是通过nodeport方式对外暴露的,他就一个用于集成nigix代理的东西,ingress-nginx安装其实就是新起一个nodePort的service服务他可以代理其他我们应用service。安装ingress-nginx的资源清单和镜像拿不到安装失败就不演示实验了。安装就成搜到的教程都失败。
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐