当前位置:   article > 正文

K8s---service_k8s svc地址

k8s svc地址

目录

一、service简介

二、IPVS模式的service

 三、创建service

【ClusterIP方式】

headless service“无头服务”

NodePort方式

外部访问service的第二种方式(使用于公网)

外部访问service的第三种方式:ExternalName。


一、service简介

Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应
用可以方便地实现服务发现和负载均衡。
Service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

Service的类型:

  • ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问。
  • NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个
  • NodeIP:nodePort都将路由到ClusterIP。
  • LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负 载均衡器,并将请求转发到<NodeIP>:NodePort,此模式只能在云服务器上使用。
  • ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定)

二、IPVS模式的service

  • Service 是由 kube-proxy 组件,加上 iptables 来共同实现的.
  • kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的iptables规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源。
  • IPVS模式的service,可以使K8s集群支持更多量级的Pod。
  1. kubectl get pod
  2. kubectl get pod -n kube-system 
  3. #查看状态是否就绪
  4. kubectl get all
  5. kubectl delete svc liveness-http 
  6. iptables -t nat -nL
  7. kubectl get svc

开启kube-proxy的ipvs模式:

  1. yum install -y ipvsadm
  2. ipvsadm -ln
  3. #查看策略,目前是空的
  4. kubectl -n kube-system get pod
  5. kubectl -n kube-system get svc
  6. kubectl -n kube-system get cm
  7. #所有服务的配置都存在cm里,里面有一个kube-proxy
  8. kubectl -n kube-system edit cm kube-proxy 
  9. #编辑kube-proxy:【mode: "ipvs"】
  10. kubectl -n kube-system get pod
  11. kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
  12. //更新kube-proxy podservice【原理是删除pod,控制器自动创建一份,类似于刷新】
  13. kubectl -n kube-system get pod
  14. #运行可以看到已经生效
  15. ipvsadm -ln
  16. lsmod | grep ip_vs
  17. 内核里的ip_vs模块

server3:

lsmod | grep ip_vs


server2: 

  1. ip addr
  2. 换成ipvs模式之后,系统会出现kube-ipvs0接口,集群内每隔节点都有,会出现相应的vip
  3. kubectl get pod -n kube-system 
  4. 可以看到在kube-system 里面有两个coredns
  5. kubectl get  pod -n kube-system  -o wide 
  6. #出现的两个coredns其实就是dns pod
  7. kubectl -n kube-system get svc
  8. 有一个svc的ip地址
  9. kubectl -n kube-system describe svc kube-dns 
  10. 可以看到有两个Endpoints
  11. ipvsadm -ln

 三、创建service

【ClusterIP方式】

  1. mkdir service
  2. cd service/
  3. vim clusterip.yml
  4. cd ..
  5. cd pod/
  6. ls
  7. kubectl apply -f  deploy.yml 
  8. kubectl get pod
  9. 用deploy控制器创建3个pod
  10. kubectl get pod --show-labels 
  11. 可以看到标签是myapp

 

  1. cd ..
  2. cd service/
  3. kubectl apply -f clusterip.yml 
  4. kubectl get svc
  5. 可以看到创建的svc获得的集群地址10.96.125.96
  6. ip addr
  7. 刚获取的集群地址会出现在kube-ipvs0
  8. ipvsadm -ln
  9. 也会创建出相应的策略【10.96.125.96地址地下有三个pod】
  10. kubectl get pod
  11. kubectl get pod --show-labels
  12. 是通过标签匹配的 
  13. kubectl describe svc web-service 
  14. 【service选择的后端是通过标签匹配的】
  15. kubectl get pod -o wide

注意: ClusterIP仅限集群内部

  1. curl 10.96.125.96  #访问集群地址
  2. curl 10.96.125.96/hostname.html
  3. #此命令多执行几次可以看到是均衡的【轮叫,不是随机均衡的】
  4. ipvsadm -ln
  5. 可以看到有调度过程

可以通过dns来访问

  1. kubectl get pod -n kube-system 
  2. kubectl get svc -n kube-system 
  3. #dns的ip地址是由svc来提供的
  4. kubectl run -it demo --image=busyboxplus --restart=Never
  5. --/ # curl 10.96.125.96
  6. 在集群内部可以访问到
  7. --/ # curl 10.96.125.96/hostname.html
  8. 多执行几次可以发现是负载均衡的
  9. --/ # curl web-service
  10. 不知道ip的情况下,可以访问服务
  11. --/ # curl web-service/hostname.html
  12. 多执行几次可以发现是负载均衡的
  13. --/ # nslookup web-service
  14. 直接访问服务名字是因为有解析的
  15. --/ # cat /etc/resolv.conf 
  16. 可以看到dns的svc
  17. kubectl delete pod demo #回收

headless service“无头服务”

  1. kubectl edit svc web-service 
  2. kubectl delete -f clusterip.yml 
  3. vim clusterip.yml 【clusterIP: None】
  4. kubectl apply -f clusterip.yml 
  5. kubectl get svc
  6. 可以看到服务没有ip
  7. kubectl describe svc web-service 
  8. #服务后边还有后端
  9. kubectl run -it demo --image=busyboxplus --restart=Never
  10. --/ # curl web-service
  11. 直接访问svc名称也可以【完全通过dns来实现的】
  12. --/ # curl web-service/hostname.html
  13. 负载均衡
  14. --/ # cat /etc/resolv.conf 
  15. kubectl delete pod demo 
  16. yum install -y bind-utils
  17. dig -t A web-service.default.svc.cluster.local. @10.96.0.10
  18. #web-service的A记录 service是10.96.0.10
  19. kubectl -n kube-system get svc
  20. kubectl -n kube-system get pod
  21. kubectl -n kube-system get pod -o wide 
  22. dig -t A web-service.default.svc.cluster.local. @10.244.0.4
  23. 【访问的svc地址其实是负载到后端的两个pod上】
  24. kubectl delete -f clusterip.yml 

 

NodePort方式

  1. cp clusterip.yml svc.yml
  2. vim svc.yml 【type: NodePort】
  3. kubectl apply -f svc.yml 
  4. kubectl get pod
  5. kubectl get svc
  6. #NodePort实际上是在ClusterIP的基础之上,又绑定了32516端口
  7. ipvsadm -ln

 

 

集群外部访问:
真机:

  1. curl 172.25.70.2:32516
  2. curl 172.25.70.2:32516/hostname.html
  3. 负载均衡
  4. curl 172.25.70.3:32516/hostname.html
  5. 访问任何一个节点都可以

server3:

  1. yum install -y ipvsadm
  2. ipvsadm -ln


外部访问service的第二种方式(使用于公网)

  1. kubectl edit svc web-service 
  2. 编辑【type:LoadBalancer 】
  3. kubectl get svc
  4. 可以看到已经生效了
  5. kubectl edit configmap -n kube-system kube-proxy
  6. 编辑:strictARP: true
  7. kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
  8. #刷新使刚才修改的生效
  9. mkdir metallb
  10. cd metallb/

下载metallb-v0.11.0.yaml文件【本次网速太慢,从其他电脑传过来的】

  1. ls
  2. vim metallb-v0.11.0.yaml 
  3. #查看文件中镜像

网页:建立一个新项目

 

server1:
下载镜像并上传到私有仓库
注意:路径要跟server2的metallb-v0.11.0.yaml这个文件中镜像的路径吻合

  1. docker load -i metallb-v0.11.0.tar
  2. 导入镜像
  3. docker push reg.westos.org/metallb/controller:v0.11.0 
  4. docker push reg.westos.org/metallb/speaker:v0.11.0 
  5. 上传镜像

  1. kubectl apply -f metallb-v0.11.0.yaml 
  2. kubectl -n metallb-system get pod
  3. kubectl -n metallb-system get pod -o wide 
  4. 查看状态是否就绪
  5. vim configmap.yml
  6. ip addr
  7. kubectl apply -f configmap.yml 
  8. #生效
  9. kubectl get svc
  10. 生效之后可以获得刚才的172.25.70.100这个地址


真机中:

  1. curl 172.25.70.100
  2. 可以访问成功
  3. curl 172.25.70.100/hostname.html


外部访问service的第三种方式:ExternalName。

  1. vim ex-svc.yml
  2. kubectl apply -f  ex-svc.yml 
  3. kubectl get svc
  4. 可以看到又建立了一个svc(my-service),没有ip地址,有一个外部的域名
  5. dig -t A my-service.default.svc.cluster.local. @10.96.0.10
  6. 访问my-service访问的域名是test.westos.org
  7. vim ex-svc.yml 
  8. 外部域名变更为:www.baidu.com
  9. kubectl apply -f ex-svc.yml 
  10. kubectl get svc
  11. 外部域名发生变化,但集群内的svc不变
  12. dig -t A my-service.default.svc.cluster.local. @10.96.0.10
  13. 访问svc又变为www.baidu.com

 

分配一个共有ip
【这个必须手工管理】

  1. vim ex-ip.yml
  2. #分配的地址确保没有被占用
  3. kubectl get pod --show-labels 
  4. kubectl apply -f ex-ip.yml 
  5. kubectl get svc
  6. kubectl delete svc my-service 
  7. kubectl delete svc web-service 
  8. #删除掉不需要的svc
  9. kubectl get svc
  10. 可以看到外部分配了一个地址

真机: 

ping 172.25.70.111 【不通,需要手动创建】

  1. ip addr
  2. 可以看到已经加了地址,负载均衡策略有了但是外部访问不料
  3. curl 172.25.70.111
  4. 集群内部可以访问
  5. curl 172.25.70.111/hostname.html
  6. 负载均衡
  7. ip addr add 172.25.70.111/24 dev eth0
  8. 手动添加地址

真机中

  1. ping 172.25.70.111
  2. curl 172.25.70.111
  3. curl 172.25.70.111/hostname.html
  4. 【手动添加地址之后外部可以访问了】

  1. kubectl describe svc ex-ip
  2. ip addr del 172.25.70.111/24 dev eth0
  3. kubectl delete svc ex-ip 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/189836
推荐阅读
相关标签
  

闽ICP备14008679号