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实现的。
负载分发策略
对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标签:kubectl,Service,service,dev,类型,master,ClusterIP,pod,root From: https://www.cnblogs.com/gys001/p/16931935.html