摘要:通过由选择器的service的创建,当匹配到对应合适的pod以后,就会创建一个同名字的命名空间、一个同名字的端点对象endpoints,去记录后端pod的端点值,也就是IP地址和端口。对应的每个节点的kubelet再将端点对象同步到本节点的ipvs规则中去,就
kubernetes service和pod的关联中间层叫endpoints 服务端点。
通过由选择器的service的创建,当匹配到对应合适的pod以后,就会创建一个同名字的命名空间、一个同名字的端点对象endpoints,去记录后端pod的端点值,也就是IP地址和端口。对应的每个节点的kubelet再将端点对象同步到本节点的ipvs规则中去,就可以查看到负载均衡的局面。
公开未就绪的地址信息,也就是就绪探测readiness probe未就绪的pod,使用service进行公开pod中的应用。service如果要匹配pod的话,必须有两个指标:
①:service的标签选择器必须得是pod标签的子集。
②:pod必须是就绪状态的。
可以添加就绪状态,去保障每一个能够就绪的pod可以被访问。
Pod就绪service才关联pod是一个可选项,只有默认情况下pod必须就绪,但是我们可以修改。
创建未就绪状态pod的资源清单:
apiVersion: v1
kind: Pod
metadata:
name: readiness-httpget-pod
namespace: default
labels:
app: my-app
env: test
spec:
- name: readiness-httpget-container
path: /index1.html
protocol: TCP
以pod的资源清单创建pod:
kubectl create -f pod-xxx.yaml
以service的资源清单创建service:
kubectl create -f service-xxx.yaml
可以发现创建的pod处于running状态,但是READY是未就绪状态,默认这种情况是不会匹配到负载均衡的规则里面的。
查看pod的标签:
kubectl get pod -n $namespace_name --show-labels
创建服务:
kubectl create svc clusterip my-app --tcp=80:80
查看服务:
kubectl get svc --all-namespaces | grep my-app
curl $CLUSTER-IP:80
会发现是没有办法访问成功的,因为这个服务的真实服务器处于未就绪状态,因为不抓取未就绪状态的pod写入endpoints。
服务要调用请求到后端pod需要满足两个条件:
①:service的标签选择器是pod 标签的子集。
②:pod处于就绪状态。
如果环境要求比较高,可以不管pod是否就绪,都可以抓取到服务端点,这时可以去开启一个服务的特殊选项。这样在当前的service里可以把publishNotReadyAddresses 改成true。
修改步骤:
kubectl edit svc $svc_name -n $namespace_name
然后在spec下面添加:
publishNotReadyAddresses: true
添加publishNotReadyAddresses: true,也可以:
kubectl patch service myapp -p '{"spec":{"publishNotReadyAddresses": true}}'
然后设置这个选项生效之后,再访问服务就可以访问了。
将publishNotReadyAddresses选项开启后,可以去捕获那些未就绪的pod,只要标签匹配就可以抓取端点信息并且创建service了。
服务service的类型:
①:ClusterIP
②:NodePort
③:LoadBalancer
④:ExternalName
endpoints是pod和service的中间关联。
开启未就绪的pod的service捕获:
publishNotReadyAddresses: true
service:对已有的pod做四层负载均衡。
ingress:实现七层负载均衡。
彩虹
鼓励的话语:人生没有白走的路,每走一步都算数!
来源:小倩说科技