• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gys001
博客园    首页    新随笔    联系   管理    订阅  订阅

ClusterIP类型的Service

Service使用

实验环境准备

在使用service之前,首先利用Deployment创建出3个pod,注意要为pod设置`app=nginx-pod`的标签

创建deployment.yaml,内容如下:

apiVersion: apps/v1
kind: Deployment      
metadata:
  name: pc-deployment
  namespace: dev
spec: 
  replicas: 3
  selector:
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

创建并查看

[root@master ~]# kubectl create -f deployment.yaml

# 查看pod详情
[root@master ~]# kubectl get pods -n dev -o wide

# 为了方便后面的测试,修改下三台nginx的index.html页面(三台修改的IP地址不一致)

[root@master ~]# kubectl exec -it pc-deployment-7d7dd5499b-8ld77 -n dev -- bash -c "echo nginx1 > /usr/share/nginx/html/index.html"
[root@master ~]# kubectl exec -it pc-deployment-7d7dd5499b-czkzj -n dev -- bash -c "echo nginx2 > /usr/share/nginx/html/index.html"
[root@master ~]# kubectl exec -it pc-deployment-7d7dd5499b-ndrcp -n dev -- bash -c "echo nginx3 > /usr/share/nginx/html/index.html"

[root@master ~]# curl 10.244.2.71
[root@master ~]# curl 10.244.1.87
[root@master ~]# curl 10.244.1.86

ClusterIP类型的Service
创建

创建service-clusterip.yaml文件

apiVersion: v1
kind: Service
metadata:
  name: service-clusterip
  namespace: dev
spec:
  selector:
    app: nginx-pod
  clusterIP: 10.97.97.97 # service的ip地址,如果不写,默认会生成一个
  type: ClusterIP
  ports:
  - port: 80  # Service端口       
    targetPort: 80 # pod端口

创建并查看

# 创建service
[root@master ~]# kubectl create -f service-clusterip.yaml

# 查看service
[root@master ~]# kubectl get svc -n dev -o wide

# 查看service的详细信息
# 在这里有一个Endpoints列表,里面就是当前service可以负载到的服务入口

[root@master ~]# kubectl describe svc service-clusterip -n dev
[root@master ~]# kubectl get endpoints -n dev #一般不用该命令,因为上面命令已包含

# 查看ipvs的映射规则
[root@ master ~]# ipvsadm -Ln

# 访问10.97.97.97:80观察效果
Endpoint

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

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

image-20200509191917069

负载分发策略

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

- 如果不定义,默认使用kube-proxy的策略,比如随机、轮询
- 基于客户端地址的会话保持模式,即来自同一个客户端发起的所有请求都会转发到固定的一个Pod上

此模式可以使在spec中添加`sessionAffinity:ClientIP`选项

查看svc
[root@master ~]# kubectl get svc service-clusterip -n dev

查看pod
[root@master ~]# kubectl get pod -n dev -owide

# 查看ipvs的映射规则【rr 轮询】
[root@master ~]# ipvsadm -Ln

# 循环访问测试
[root@master ~]# while true;do curl 10.97.97.97:80; sleep 1; done;

会话保持模式
# 修改分发策略----sessionAffinity:ClientIP

[root@master ~]# kubectl describe svc service-clusterip -n dev

 

# 查看ipvs规则【persistent 代表持久】

[root@master ~]# ipvsadm -Ln

# 循环访问测试

[root@master ~]# while true;do curl 10.97.97.97; sleep 1; done;

# 删除service
[root@master ~]# kubectl delete -f service-clusterip.yaml

参考

黑马B站k8s课程https://www.bilibili.com/video/BV1Qv41167ck/
https://gitee.com/yooome/golang/blob/main/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B-%E8%B0%83%E6%95%B4%E7%89%88/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B.md
https://www.yuque.com/fairy-era/yg511q/xyqxge
posted @ 2022-11-28 13:19  gys001  阅读(118)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3