随笔 - 91  文章 - 0  评论 - 2  阅读 - 44255

k8s之service

 K8s三种网络: node network

pod network

cluster network --> virtual ip --> service 规则

 

 

service:  kube-proxy监控api-server,api-server数据发生改变,相应的kube-proxy就会改变service规则,

service有三种工作模式:userspace, 1.1版本之前

                                     iptables, 1.10之前

                                     ipvs 1.11版本之后

 

kubectl delete svc redis

                    service  service

 

 

kubectl explain service

kubectl explain service.spec

 

 

service类型:

ExternalName, 集群外的服务引用到集群内 外部服务名称

ClusterIP, 仅用于集群内通信

NodePort, 用于与集群外通信

LoadBalancer,部署到虚拟机,虚拟机工作在环境中,云环境支持负载均衡,lbaas, 类似nodeport负载均衡

 

 

清单文件创建service

ClusterIP, 仅用于集群内通信  访问时service先指向clusterip,在指向pod ip

kubectl explain service.spec.ports

vim redis-svc.yaml

apiVersion: v1

kind: Service

metadata:

  name: redis  service名称

  namespace: default

spec:

  selector:  选取的pod标签 关联到pod

    app: redis 

    role: logstor

  clusterIP: 10.97.97.97 设定clusterip

  type: ClusterIP 选取clusterip类型的service

  ports:

  - port: 6379  service端口 引用的service端口与后端pod建立关系

    targetPort: 6379  指定的pod的端口

 

kubectl apply -f redis-svc.yaml 创建service

kubectl get svc 查询service

kubectl describe svc redis   service-redis的详细信息

Endpoints:         10.244.1.66:6379  后端地址,即关联的pod地址

 

 

资源记录:SVC_NAMe.NS_NAME.DOMAIN.LTD.

          服务名  名称空间    集群域名后缀

 

 

       集群域名默认后缀  svc.cluster.local.

      比如:刚创建的service 名为redis,  那么域名为:

           redis.default.svc.cluster.local.

 

       直接访问域名就可以访问服务了,并解析pod地址了

 

nodeport默认分配端口 30000-32797

创建nodeport服务

引用前面deploy控制器myapp-deploy创建的pod

cp redis-svc.yaml myapp-svc.yaml

vim myapp-svc.yaml

apiVersion: v1

kind: Service

metadata:  service属性

  name: myapp

  namespace: default

spec:

  selector:

    app: myapp 关联pod

    release: canary

  clusterIP: 10.99.99.99 指定clusterip

  type: NodePort  指定service类型

  ports:

  - port: 80  service端口

   targetPort: 80 关联的pod端口

   nodePort: 30080  外部访问node的端口

 

  

kubectl create -f myapp-svc.yaml  创建service

kubectl get svc

80:30080/TCP

service端口80  映射  node端口30080

测试

在外面访问任一节点 比如192.168.81.10:30080

while true; do curl http://192.168.81.30:30080/hostname.html;sleep 1;done

 

 

ExternalName

集群内的pod访问集群外的资源,

kubectl explain svc.spec.externalName

 

 

sessionAffinity

kubectl explain svc.spec

 sessionAffinity <string>  保持会话IP 同一个IP请求始终发往同一个后端pod

kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"ClientIP"}}'

 

kubectl describe svc myapp 查看是否加上sessionAffinity

 

kubectl patch svc myapp -p '{"spec":{"sessionAffinity":"None"}}' 改回None,就不会始终发往一个pod

 

 

headless  无头service 无头服务 service直接指向pod IP

cp myapp-svc.yaml myapp-headless.yaml

vim myapp-headless.yaml

apiVersion: v1

kind: Service

metadata:

  name: myapp-svc

  namespace: default

spec:

  selector:

    app: myapp

    release: canary

  clusterIP: None

  ports:

  - port: 80

targetPort: 80

 

 kubectl apply -f myapp-headless.yaml

kubectl get svc

 

安装dig命令 yum install bind-utils -y

查询coreDns

kubectl get svc -n kube-system

解析service

    dig -t A myapp-svc.default.svc.cluster.local. @10.96.0.10

                    服务域名             @指定coredns

解析的结果为后端podip

        

 

对于前面service类型为clusterip

dig -t A myapp.default.svc.cluster.local. @10.96.0.10

解析结果为CLUSTER-IP

posted on   SZ_文彬  阅读(892)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示