概述
Endpoint
简称ep
Endpoint是kubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址,它是根据service配置文件中selector描述产生的。
一个Service由一组Pod组成,这些Pod通过Endpoints暴露出来,Endpoints是实现实际服务的端点集合。换句话说,service和pod之间的联系是通过endpoints实现的。
负载分发策略
对Service的访问被分发到了后端的Pod上去,目前kubernetes提供了两种负载分发策略:
- 如果不定义,默认使用kube-proxy的策略,比如随机、轮询
- 基于客户端地址的会话保持模式,即来自同一个客户端发起的所有请求都会转发到固定的一个Pod上,此模式可以使在spec中添加sessionAffinity:ClientIP选项
验证Endpoint
创建service和deploy
[root@master01 ~/ingress]# cat nginx-deploy.yaml | |
# service | |
apiVersion: v1 | |
kind: Service | |
metadata: | |
namespace: default | |
name: nginx-svc-clusterip | |
spec: | |
type: ClusterIP | |
selector: | |
app: nginx | |
ports: | |
- name: clusterip-nginx | |
port: 80 | |
targetPort: 80 | |
protocol: TCP | |
--- | |
# deploy | |
apiVersion: apps/v1 | |
kind: Deployment | |
metadata: | |
name: deployment-nginx | |
namespace: default | |
spec: | |
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 wide | |
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES | |
deployment-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-clusterip | |
Name: nginx-svc-clusterip | |
Namespace: default | |
Labels: <none> | |
Annotations: <none> | |
Selector: app=nginx | |
Type: ClusterIP | |
IP Family Policy: SingleStack | |
IP Families: IPv4 | |
IP: 10.96.1.52 | |
IPs: 10.96.1.52 | |
Port: clusterip-nginx 80/TCP | |
TargetPort: 80/TCP | |
Endpoints: 100.117.144.139:80,100.117.144.140:80,100.95.185.234:80 | |
Session Affinity: None | |
Events: <none> | |
# 查看endpoints资源 | |
[root@master01 ~/ingress]# kubectl get endpoints | |
NAME ENDPOINTS AGE | |
nginx-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-znr7t | |
pod "deployment-nginx-6d84458cd8-g8lkv" deleted | |
pod "deployment-nginx-6d84458cd8-j8m6c" deleted | |
pod "deployment-nginx-6d84458cd8-znr7t" deleted |
查看资源,发现对应的IP是会进行变化的
# 查看Pod | |
[root@master01 ~/ingress]# kubectl get po -o wide | |
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES | |
deployment-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-clusterip | |
Name: nginx-svc-clusterip | |
Namespace: default | |
Labels: <none> | |
Annotations: <none> | |
Selector: app=nginx | |
Type: ClusterIP | |
IP Family Policy: SingleStack | |
IP Families: IPv4 | |
IP: 10.96.1.52 | |
IPs: 10.96.1.52 | |
Port: clusterip-nginx 80/TCP | |
TargetPort: 80/TCP | |
Endpoints: 100.117.144.141:80,100.95.185.236:80,100.95.185.238:80 | |
Session Affinity: None | |
Events: <none> | |
#查看endpoints | |
[root@master01 ~/ingress]# kubectl get endpoints | |
NAME ENDPOINTS AGE | |
kubernetes 10.0.0.30:6443 78m | |
nginx-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: v1 | |
kind: Endpoints | |
metadata: | |
name: harbor-huangxin | |
subsets: | |
- addresses: | |
- ip: 10.0.0.250 | |
ports: | |
- port: 80 | |
protocol: TCP | |
--- | |
# Service资源 | |
apiVersion: v1 | |
kind: Service | |
metadata: | |
name: harbor-huangxin | |
spec: | |
type: ClusterIP | |
ports: | |
- port: 80 | |
targetPort: 80 |
查看一下资源
# 查看service | |
[root@master01 ~]# kubectl describe svc endpoint-huangsir | |
Name: endpoint-huangsir | |
Namespace: default | |
Labels: <none> | |
Annotations: <none> | |
Selector: <none> | |
Type: ClusterIP | |
IP Family Policy: SingleStack | |
IP Families: IPv4 | |
IP: 10.96.1.127 | |
IPs: 10.96.1.127 | |
Port: <unset> 80/TCP | |
TargetPort: 80/TCP | |
Endpoints: 10.0.0.250:80 | |
Session Affinity: None | |
Events: <none> | |
# 查看endpoint | |
[root@master01 ~]# kubectl get ep endpoint-huangsir | |
NAME ENDPOINTS AGE | |
endpoint-huangsir 10.0.0.250:80 51s |
行业拓展
分享一个面向研发人群使用的前后端分离的低代码软件——JNPF。
基于 Java Boot/.Net Core双引擎,它适配国产化,支持主流数据库和操作系统,提供五十几种高频预制组件,内置了常用的后台管理系统使用场景和实用模版,通过简单的拖拉拽操作,开发者能够高效完成软件开发,提高开发效率,减少代码编写工作。
JNPF基于SpringBoot+Vue.js,提供了一个适合所有水平用户的低代码学习平台,无论是有经验的开发者还是编程新手,都可以在这里找到适合自己的学习路径。
此外,JNPF支持全源码交付,完全支持根据公司、项目需求、业务需求进行二次改造开发或内网部署,具备多角色门户、登录认证、组织管理、角色授权、表单设计、流程设计、页面配置、报表设计、门户配置、代码生成工具等开箱即用的在线服务。