pod三种类型的网络
Node Netwoek: 与外部网络接口
Service Network: 出现在iptables或者ipadm中,仅仅做pods调度
Pod Network: 内部动态分配网络,如果发生故障 会自动重建 需要基于services通讯
请求方式 service->pods pods出现故障会自动重建,ip会发生改变 会自动重新到service中实现
service 是怎么实现识别后端的pods的
在Kubernetes中,Pods是有生命周期的。它们被创建、被终止,但不能被复活。在Kubernetes中通过ReplicationControllers动态的创建和删除Pod。然后,每一个Pod都拥有自己的IP地址,但是这些IP地址随着时间会发生变化。这会导致一个问题:如果在Kubernetes集群中,前端的Pod需要调用后端的Pod的功能,那么这些前端的Pod如何发现和跟踪后端的Pod?
在Kubernetes中,Service是一个抽象的概念,它定义了Pod逻辑集合和访问这些Pod的策略。Service通过Label Selector选择Pod。例如,在后端运行着有3个副本的Pod,这些副本是可互相替换的,前端不需要关注使用那个副本。Service抽象就用来实现此解耦的能力的。对于 Kubernetes-native的应用,当Service中的Pod发生变化时,Kubernetes通过了Endpoints API类进行更新。对于non-native applications, Kubernetes 提供了virtual-IP-based桥,通过它重定向后端的Pod。在本文中,描述如何定义Service、发布Service和发现Serivce的整个过程。
pod是动态的,随时可能发生故障,重建等。ip地址基本上都会发生改变,所有出现了service来接入客户端的请求,同时使用pods的控制器(Pod Controller)来进行pod的识别,但是service是怎么实现负载识别过滤 是当前后端pod的。
是通过标签来识别的(label,label selector)。
创建pod的时候,可以附加标签来实现区分各个pod
.
例如创建: test:testing,app:nginx,version=v1512等标签
标签选择器
定义标签选择器的方式
pod标签的使用和命名方式
之前创建过的pod,查看pod的标签
[root@k8s-master01 ~]# kubectl get pods/nginx-7db9fccd9b-dq9wz --show-labels
添加新的标签
[root@k8s-master01 ~]# kubectl get pods -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-demo1 1/1 Running 0 2d4h <none>
例如我在创建一个pod-demo3,添加标签为:
[root@k8s-master01 ~]# cat nginx_pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-demo3
namespace: prod
labels:
app: nginx
rel: stable
version: v11512
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: nginx-3
ports:
- protocol: TCP
containerPort: 80
hostPort: 8888
name: http-nginx
hostIP: 192.168.1.101
[root@k8s-master01 ~]# kubectl apply -f nginx_pods.yaml
pod/pod-demo3 created
[root@k8s-master01 ~]# kubectl get pods -n prod --show-labels -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod-demo1 1/1 Running 0 2d4h 172.17.77.4 192.168.1.29 <none> <none> <none>
pod-demo3 0/1 ContainerCreating 0 10s <none> 192.168.1.73 <none> <none> app=nginx,rel=stable,version=v11512
也可以使用label直接管理各个pod的label
[root@k8s-master01 ~]# kubectl label -h 来查看使用方式
给pod-demo1来添加一个status=healthy
[root@k8s-master01 ~]# kubectl label pods/pod-demo1 status=healthy -n prod
pod/pod-demo1 labeled
[root@k8s-master01 ~]# kubectl get pods -n prod --show-labels -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod-demo1 1/1 Running 0 2d4h 172.17.77.4 192.168.1.29 <none> <none> status=healthy
pod-demo3 0/1 ContainerCreating 0 4m44s <none> 192.168.1.73 <none> <none> app=nginx,rel=stable,version=v11512
修改label的话 需要添加--overwrite参数
[root@k8s-master01 ~]# kubectl label pods/pod-demo1 --overwrite status=unhealthy -n prod
pod/pod-demo1 labeled
[root@k8s-master01 ~]# kubectl get pods -n prod --show-labels -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
pod-demo1 1/1 Running 0 2d4h 172.17.77.4 192.168.1.29 <none> <none> status=unhealthy
删除label
[root@k8s-master01 ~]# kubectl label pods/pod-demo1 status- -n prod
建立多个label的时候 需要多个标签空格隔开
[root@k8s-master01 ~]# kubectl label pods/pod-demo1 status=healthy rel=stated verson=v11512 -n prod
按照指定label查询pod
-L, --label-columns=[]: Accepts a comma separated list of labels that are going to be presented as columns. Names are case-sensitive. You can also use multiple flag options like -L label1 -L label2...
-l, --selector='': Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)
上述可以看出 -L 是针对label显示 -l是针对指定key:value显示
显示status不等于healthy的
.
显示status等于healthy的
.
显示rel包含(stated,stable)
.
显示rel不包含(stable)
.
显示只要有rel键的 或者 去没有rel键的(此处需要使用''单引号 !对于shell有特殊意义 此处需要弱引用)
.
组合显示包含(stated,stable) 和rel的键值