K8s新手系列之Endponit

0 阅读1分钟

回到顶部

概述

官方文档:kubernetes.io/zh-cn/docs/…

Endpoint简称ep

Endpoint是kubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址,它是根据service配置文件中selector描述产生的。

一个Service由一组Pod组成,这些Pod通过Endpoints暴露出来,Endpoints是实现实际服务的端点集合。换句话说,service和pod之间的联系是通过endpoints实现的。

image

回到顶部

负载分发策略

对Service的访问被分发到了后端的Pod上去,目前kubernetes提供了两种负载分发策略:

  • 如果不定义,默认使用kube-proxy的策略,比如随机、轮询
  • 基于客户端地址的会话保持模式,即来自同一个客户端发起的所有请求都会转发到固定的一个Pod上,此模式可以使在spec中添加sessionAffinity:ClientIP选项

回到顶部

验证Endpoint

创建service和deploy

[root@master01 ~/ingress]# cat nginx-deploy.yaml# serviceapiVersion: v1kind: Servicemetadata:  namespace: default  name: nginx-svc-clusteripspec:  type: ClusterIP  selector:    app: nginx  ports:  - name: clusterip-nginx    port: 80    targetPort: 80    protocol: TCP ---# deployapiVersion: apps/v1kind: Deploymentmetadata:  name: deployment-nginx  namespace: defaultspec:  replicas: 3  selector:    matchLabels:      app: nginx  template:    metadata:      name: pod-nginx      labels:        app: nginx    spec:      containers:      - name: container-nginx        image: nginx:1.14.1      restartPolicy: Always

查看创建成功对应的资源

# 查看pod[root@master01 ~/ingress]# kubectl get po -o wideNAME                                READY   STATUS             RESTARTS         AGE    IP                NODE     NOMINATED NODE   READINESS GATESdeployment-nginx-6d84458cd8-g8lkv   1/1     Running            0                35m    100.117.144.139   node01   <none>           <none>deployment-nginx-6d84458cd8-j8m6c   1/1     Running            0                35m    100.95.185.234    node02   <none>           <none>deployment-nginx-6d84458cd8-znr7t   1/1     Running            0                35m    100.117.144.140   node01   <none>           <none> # 查看svc详情,注意Endpoints列表是和pod的IP保持一致的[root@master01 ~/ingress]# kubectl describe svc nginx-svc-clusteripName:              nginx-svc-clusteripNamespace:         defaultLabels:            <none>Annotations:       <none>Selector:          app=nginxType:              ClusterIPIP Family Policy:  SingleStackIP Families:       IPv4IP:                10.96.1.52IPs:               10.96.1.52Port:              clusterip-nginx  80/TCPTargetPort:        80/TCPEndpoints:         100.117.144.139:80,100.117.144.140:80,100.95.185.234:80Session Affinity:  NoneEvents:            <none> # 查看endpoints资源[root@master01 ~/ingress]# kubectl get endpointsNAME                  ENDPOINTS                                                 AGEnginx-svc-clusterip   100.117.144.139:80,100.117.144.140:80,100.95.185.234:80   36m

当我们重启Pod之后看看Endpoints列表会发生什么

重启Pod

[root@master01 ~/ingress]# kubectl delete po deployment-nginx-6d84458cd8-g8lkv deployment-nginx-6d84458cd8-j8m6c deployment-nginx-6d84458cd8-znr7tpod "deployment-nginx-6d84458cd8-g8lkv" deletedpod "deployment-nginx-6d84458cd8-j8m6c" deletedpod "deployment-nginx-6d84458cd8-znr7t" deleted

查看资源,发现对应的IP是会进行变化的

# 查看Pod[root@master01 ~/ingress]# kubectl get po -o wideNAME                                READY   STATUS             RESTARTS         AGE    IP                NODE     NOMINATED NODE   READINESS GATESdeployment-nginx-6d84458cd8-4z4cb   1/1     Running            0                7s     100.95.185.236    node02   <none>           <none>deployment-nginx-6d84458cd8-ht2z9   1/1     Running            0                7s     100.117.144.141   node01   <none>           <none>deployment-nginx-6d84458cd8-ns47j   1/1     Running            0                7s     100.95.185.238    node02   <none>           <none># 查看service[root@master01 ~/ingress]# kubectl describe svc nginx-svc-clusteripName:              nginx-svc-clusteripNamespace:         defaultLabels:            <none>Annotations:       <none>Selector:          app=nginxType:              ClusterIPIP Family Policy:  SingleStackIP Families:       IPv4IP:                10.96.1.52IPs:               10.96.1.52Port:              clusterip-nginx  80/TCPTargetPort:        80/TCPEndpoints:         100.117.144.141:80,100.95.185.236:80,100.95.185.238:80Session Affinity:  NoneEvents:            <none>#查看endpoints[root@master01 ~/ingress]# kubectl get endpointsNAME                  ENDPOINTS                                                AGEkubernetes            10.0.0.30:6443                                           78mnginx-svc-clusterip   100.117.144.141:80,100.95.185.236:80,100.95.185.238:80   39m 

回到顶部

编写一个属于自己Endpoints

Endpoints资源是通过name和namespace两个字段与Service进行关联的,所以Endpoints的名称和Service的名称相同.

示例:

[root@master01 ~]# cat ep.yaml# Endpoints资源apiVersion: v1kind: Endpointsmetadata:    name: harbor-huangxinsubsets:    - addresses:      - ip: 10.0.0.250      ports:      - port: 80        protocol: TCP---# Service资源apiVersion: v1kind: Servicemetadata:    name: harbor-huangxinspec:    type: ClusterIP    ports:        - port: 80          targetPort: 80

查看一下资源

# 查看service[root@master01 ~]# kubectl describe svc endpoint-huangsirName:              endpoint-huangsirNamespace:         defaultLabels:            <none>Annotations:       <none>Selector:          <none>Type:              ClusterIPIP Family Policy:  SingleStackIP Families:       IPv4IP:                10.96.1.127IPs:               10.96.1.127Port:              <unset>  80/TCPTargetPort:        80/TCPEndpoints:         10.0.0.250:80Session Affinity:  NoneEvents:            <none># 查看endpoint[root@master01 ~]# kubectl get ep endpoint-huangsirNAME              ENDPOINTS       AGEendpoint-huangsir   10.0.0.250:80   51s

行业拓展

分享一个面向研发人群使用的前后端分离的低代码软件——JNPF

基于 Java Boot/.Net Core双引擎,它适配国产化,支持主流数据库和操作系统,提供五十几种高频预制组件,内置了常用的后台管理系统使用场景和实用模版,通过简单的拖拉拽操作,开发者能够高效完成软件开发,提高开发效率,减少代码编写工作。

JNPF基于SpringBoot+Vue.js,提供了一个适合所有水平用户的低代码学习平台,无论是有经验的开发者还是编程新手,都可以在这里找到适合自己的学习路径。

此外,JNPF支持全源码交付,完全支持根据公司、项目需求、业务需求进行二次改造开发或内网部署,具备多角色门户、登录认证、组织管理、角色授权、表单设计、流程设计、页面配置、报表设计、门户配置、代码生成工具等开箱即用的在线服务。