Kubernetes Service服务

最简单的已经通过yaml文件把容器跑起来了,这个时候就是网络通讯的问题了

  1. K8s是基于扁平化的网络,也就是所有的Pod和node节点都是互通的
  2. docker run 是基于-p 作为映射端口,而yaml文件里写的ports并不是这个功能,前面也说了扁平化,说明这个参数并没有用,只是为了方便Pod中查看而已
  3. Pod也有一个单独IP地址的

IT产品的解决方案通常都是加一层,那么这层就是K8s的Service服务

哪些场景需要Service服务?

  • 集群外部需要访问到Pod应用
  • 集群内部Pod与Pod之间

这点可能就一点奇怪了,k8s不是扁平化的网络为什么还集群内Pod之间还需要使用Service

因为Pod生命周期太短,随时都可能被销毁,重建,那么使用Pod的IP应用到服务上是不可取的,Pod的IP其实是给IPVS或者iptable负载策略使用

Service服务

三种类型的Service

  • ClusterIP:默认,提供集群内通讯IP
  • NodePort:提供集群内通讯IP和把节点的IP地址映射出去(类似docker run -p 做的作用)
  • LoadBalancer:Kubernetes 结合云平台的组件,如国外 GCE、AWS、国内阿里云等,将流量导向Service

Yaml文件格式

apiVersion: v1   
kind: Service     
metadata:         
  name: ldap-svc
  labels:
    app: ldap
spec:
  type: NodePort   #Service类型
  ports:     
    - port: 8888
      targetPort: 8080
      protocol: TCP
      nodePort: 30000    #映射节点的端口号,默认不写为随机端口30000-32767
  selector:            #非常重要,选择器的标签就是Pod定义的,可以为多个标签条件,只要符合这个标签的Pod都会被选中
    app: ldap-web       

帮助信息:

kubectl explain service   #层级一,顶头写
kubectl explain service.spec  #层级二,查看层级详情只要加上点+参数

这里直接就能看到版本号和kind
在这里插入图片描述

命令使用

kubectl get svc #svc为service缩写

在这里插入图片描述

NAME:定义的用户名,DNS就是使用这个域名
TYPE:NodePort类型
CLUSTER-IP:分配的集群内IP
EXTERNAL-IP:针对外部访问集群的IP,NodePort的none意思就是随便一个节点的IP+port
PORT:8888是集群内的映射,32032就是node节点的端口(包含主节点)

ipvsadm -ln

我使用的IPVS所以可以看到RR就是轮询的意思,一次访问3.8,一次访问4.8这样的轮询访问,映射信息是会随着Pod的消失而消失,新建而新建
在这里插入图片描述

kubectl describe service ldap-svc

在这里插入图片描述

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页