从零搭建阿里云托管版k8s集群-service(五)

预备知识:

  • k8s基本操作命令
  • yaml文件格式
  • linux基础操作(增加执行权限,移动文件,执行命令)

创建service

什么是service呢,我说一下我的理解,不对的地方欢迎大家指正。

service是定义一种从pod内部,集群内部来访问pod的一种网络抽象层,以便于内部的服务可以被其他的服务或者外部系统访问到,它提供负载均衡和服务发现,屏蔽了pod变化的ip信息(每个pod创建的时候都会分配一个随机的ip)。具体的我就不多说了,下面讲解service文件。

apiVersion: v1
kind: Service
matadata:                                #元数据
  name: string                           #service的名称
  namespace: string                      #命名空间 不同命名空间之间相互隔离
  labels:                                #自定义标签属性列表
    - name: string
  annotations:                           #自定义注解属性列表
    - name: string
spec:                                    #详细描述
  selector: []                           #label selector配置,将选择具有label标签的Pod作为管理对象
  type: string                           #service的类型,指定service的访问方式,默认为clusterIp
  clusterIP: string                      #虚拟服务地址
  sessionAffinity: string                #是否支持session
  ports:                                 #service需要暴露的端口列表
  - name: string                         #端口名称
    protocol: string                     #端口协议,支持TCP和UDP,默认TCP
    port: int                            #服务监听的端口号
    targetPort: int                      #需要转发到后端Pod的端口号
    nodePort: int                        #指定映射到物理机的端口号
  status:                                #当spce.type=LoadBalancer时,设置外部负载均衡器的地址
    loadBalancer:                        #外部负载均衡器
      ingress:                           #外部负载均衡器
        ip: string                       #外部负载均衡器的Ip地址值
        hostname: string                 #外部负载均衡器的主机名

类型解析:

service一般有三种类型

  • ClusterIP: 默认方式。根据是否生成ClusterIP又可分为普通Service和Headless Service两类:

    • 普通Service:通过为Kubernetes的Service分配一个集群内部可访问的固定虚拟IP(Cluster IP),实现集群内的访问。为最常见的方式。
    • Headless Service:该服务不会分配Cluster IP,也不通过kube-proxy做反向代理和负载均衡。而是通过内部DNS提供稳定的络ID来访问,DNS会将headless service的后端直接解析为podIP列表。主要供StatefulSet使用。
  • NodePort :除了使用Cluster IP之外,还通过将service的port映射到集群内每个节点的相同一个端口,实现通过nodeIP:nodePort从集群外访问服务。

  • LoadBalancer:和nodePort类似,不过除了使用一个Cluster IP和nodePort之外,还会向所使用的公有云申请一个负载均衡器(负载均衡器后端映射到各节点的nodePort),实现从集群外通过LB访问服务。(阿里云的serverless类型的k8s,就是用的这种方式,其中只支持一个项目。)

端口解析

service的配置中会涉及到三种port
从port和nodePort上到来的数据最终经过kube-proxy流入到后端pod的targetPort上进入容器。

  • port:服务监听的端口号
  • targetPort:对应到需要转发到后端Pod的内部的端口
  • nodePort:指定映射到物理机的端口号,建议使用30000以上的端口,否则可能报错,这个可以不写,会自动分配,因为写了反而要注意每个文件不能重复。

实例

#文件名:c-api-svc.yml
apiVersion: v1
kind: Service
metadata:
  name: c-api-svc	
  labels:
   name: c-api-svc
spec:
  type: NodePort
  ports:
    - name: http
      protocol: TCP
      port: 8003
      targetPort: 80
  selector:
    name: c-api


service操作

申请service

kubectl create -f c-api-svc.yml 

查看实例

#简单版
kubectl get svc -n 【namespace】
#详细版本
kubectl get svc -o wide -n 【namespace】

你可能感兴趣的:(k8s,kubernetes,阿里云搭建k8s,k8s的service)