晚风吹人冷 發表於 2025-5-10 21:15:00

K8s新手系列之Endponit

<h2 id="概述">概述</h2>
<p>官方文档:https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/service-resources/endpoints-v1/</p>
<p><code>Endpoint</code>简称<code>ep</code></p>
<p>Endpoint是kubernetes中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址,它是根据service配置文件中selector描述产生的。</p>
<p>一个Service由一组Pod组成,这些Pod通过Endpoints暴露出来,Endpoints是实现实际服务的端点集合。换句话说,service和pod之间的联系是通过endpoints实现的。</p>
<p><img src="https://img2024.cnblogs.com/blog/3468887/202505/3468887-20250510154721378-1501340591.png" alt="image" loading="lazy"></p>
<h2 id="负载分发策略">负载分发策略</h2>
<p>对Service的访问被分发到了后端的Pod上去,目前kubernetes提供了两种负载分发策略:</p>
<ul>
<li>如果不定义,默认使用kube-proxy的策略,比如随机、轮询</li>
<li>基于客户端地址的会话保持模式,即来自同一个客户端发起的所有请求都会转发到固定的一个Pod上,此模式可以使在spec中添加sessionAffinity:ClientIP选项</li>
</ul>
<h2 id="验证endpoint">验证Endpoint</h2>
<h3 id="创建service和deploy">创建service和deploy</h3>
<pre><code># 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
</code></pre>
<h3 id="查看创建成功对应的资源">查看创建成功对应的资源</h3>
<pre><code># 查看pod
# 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   &lt;none&gt;         &lt;none&gt;
deployment-nginx-6d84458cd8-j8m6c   1/1   Running            0                35m    100.95.185.234    node02   &lt;none&gt;         &lt;none&gt;
deployment-nginx-6d84458cd8-znr7t   1/1   Running            0                35m    100.117.144.140   node01   &lt;none&gt;         &lt;none&gt;

# 查看svc详情,注意Endpoints列表是和pod的IP保持一致的
# kubectl describe svc nginx-svc-clusterip
Name:            nginx-svc-clusterip
Namespace:         default
Labels:            &lt;none&gt;
Annotations:       &lt;none&gt;
Selector:          app=nginx
Type:            ClusterIP
IP Family Policy:SingleStack
IP Families:       IPv4
IP:                10.96.1.52
IPs:               10.96.1.52
Port:            clusterip-nginx80/TCP
TargetPort:      80/TCP
Endpoints:         100.117.144.139:80,100.117.144.140:80,100.95.185.234:80
Session Affinity:None
Events:            &lt;none&gt;

# 查看endpoints资源
# 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
</code></pre>
<h3 id="当我们重启pod之后看看endpoints列表会发生什么">当我们重启Pod之后看看Endpoints列表会发生什么</h3>
<p>重启Pod</p>
<pre><code># 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
</code></pre>
<p>查看资源,发现对应的IP是会进行变化的</p>
<pre><code># 查看Pod
# 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   &lt;none&gt;         &lt;none&gt;
deployment-nginx-6d84458cd8-ht2z9   1/1   Running            0                7s   100.117.144.141   node01   &lt;none&gt;         &lt;none&gt;
deployment-nginx-6d84458cd8-ns47j   1/1   Running            0                7s   100.95.185.238    node02   &lt;none&gt;         &lt;none&gt;
# 查看service
# kubectl describe svc nginx-svc-clusterip
Name:            nginx-svc-clusterip
Namespace:         default
Labels:            &lt;none&gt;
Annotations:       &lt;none&gt;
Selector:          app=nginx
Type:            ClusterIP
IP Family Policy:SingleStack
IP Families:       IPv4
IP:                10.96.1.52
IPs:               10.96.1.52
Port:            clusterip-nginx80/TCP
TargetPort:      80/TCP
Endpoints:         100.117.144.141:80,100.95.185.236:80,100.95.185.238:80
Session Affinity:None
Events:            &lt;none&gt;
#查看endpoints
# 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

</code></pre>
<h2 id="编写一个属于自己endpoints">编写一个属于自己Endpoints</h2>
<p>Endpoints资源是通过name和namespace两个字段与Service进行关联的,所以Endpoints的名称和Service的名称相同.</p>
<p>示例:</p>
<pre><code># 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
</code></pre>
<h3 id="查看一下资源">查看一下资源</h3>
<pre><code># 查看service
# kubectl describe svc endpoint-huangsir
Name:            endpoint-huangsir
Namespace:         default
Labels:            &lt;none&gt;
Annotations:       &lt;none&gt;
Selector:          &lt;none&gt;
Type:            ClusterIP
IP Family Policy:SingleStack
IP Families:       IPv4
IP:                10.96.1.127
IPs:               10.96.1.127
Port:            &lt;unset&gt;80/TCP
TargetPort:      80/TCP
Endpoints:         10.0.0.250:80
Session Affinity:None
Events:            &lt;none&gt;
# 查看endpoint
# kubectl get ep endpoint-huangsir
NAME            ENDPOINTS       AGE
endpoint-huangsir   10.0.0.250:80   51s
</code></pre>


</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:huangSir-devops,转载请注明原文链接:https://www.cnblogs.com/huangSir-devops/p/18869685,微信Vac6666666,欢迎交流</p><br><br>
来源:https://www.cnblogs.com/huangSir-devops/p/18869685
頁: [1]
查看完整版本: K8s新手系列之Endponit