16. 给myblog添加service
1. 为什么要引入service¶
# 通过以前的学习,我们已经能够通过Deployment来创建一组Pod来提供具有高可用性的服务。
#虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两个问题:
- Pod IP仅仅是集群内可见的虚拟IP,外部无法访问。
- Pod IP会随着Pod的销毁而消失,当ReplicaSet对Pod进行动态伸缩时,Pod IP可能随时随地都会变化,这样对于我们访问这个服务带来了难度。
2. service概念¶
###### Service 负载均衡之Cluster IP
service是一组pod的服务抽象,相当于一组pod的LB,负责将请求分发给对应的pod。
service会为这个LB提供一个IP,一般称为cluster IP 。
使用Service对象,通过selector进行标签选择,找到对应的Pod:
3. 生成svc模板¶
1. nodeport¶
kubectl create service nodeport myblog --tcp=8002:8002 --dry-run=client - oyaml > 1.myblog-svc-nodeport.yaml
root@k8s-master:/k8s/deployment/myblog# kubectl create service nodeport myblog --tcp=8002:8002 --dry-run=client -oyaml > 1.myblog-svc-nodeport.yaml
root@k8s-master:/k8s/deployment/myblog#
root@k8s-master:/k8s/deployment/myblog# cat 1.myblog-svc-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: myblog
name: myblog
spec:
ports:
- name: 8002-8002
port: 8002
protocol: TCP
targetPort: 8002
selector:
app: myblog
type: NodePort
status:
loadBalancer: {}
2. clusuterip¶
kubectl create service clusterip myblog --tcp=8002:8002 --dry-run=client -oyaml > 2.myblog-svc-clusterip.yaml
root@k8s-master:/k8s/deployment/myblog# kubectl create service clusterip myblog --tcp=8002:8002 --dry-run=client -oyaml > 2.myblog-svc-clusterip.yaml
root@k8s-master:/k8s/deployment/myblog#
root@k8s-master:/k8s/deployment/myblog# cat 2.myblog-svc-clusterip.yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: myblog
name: myblog
spec:
ports:
- name: 8002-8002
port: 8002
protocol: TCP
targetPort: 8002
selector:
app: myblog
type: ClusterIP
status:
loadBalancer: {}
4. svc-myblog.yaml¶
1. 从上步得到clusterip模板¶
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: myblog
name: myblog
spec:
ports:
- name: 8002-8002
port: 8002
protocol: TCP
targetPort: 8002
selector:
app: myblog
type: ClusterIP
status:
loadBalancer: {}
2. 修改模板¶
cd /k8s/deployment/myblog
vim myblog-svc.yaml
#原来老师的
apiVersion: v1
kind: Service
metadata:
name: myblog
namespace: demo
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8002
selector:
app: myblog
type: ClusterIP
#感觉生成的更好一些
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: myblog
name: myblog
namespace: demo #加上命名空间即可!!!
spec:
ports:
- name: myblog-port-name #这里可改可不改
port: 8002
protocol: TCP
targetPort: 8002
selector:
app: myblog
type: ClusterIP
status:
loadBalancer: {}
5. 创建svc¶
kubectl apply -f myblog-svc.yaml
kubectl -n demo get svc
6. 查看svc的endpoint¶
kubectl -n demo get svc
kubectl -n demo describe svc myblog
root@k8s-master:/k8s/deployment/myblog# vim myblog-svc.yaml
root@k8s-master:/k8s/deployment/myblog#
root@k8s-master:/k8s/deployment/myblog#
root@k8s-master:/k8s/deployment/myblog# kubectl apply -f myblog-svc.yaml
service/myblog created
root@k8s-master:/k8s/deployment/myblog#
root@k8s-master:/k8s/deployment/myblog# kubectl -n demo get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myblog ClusterIP 10.109.119.199 <none> 8002/TCP 4s
root@k8s-master:/k8s/deployment/myblog#
root@k8s-master:/k8s/deployment/myblog# kubectl -n demo describe svc myblog
Name: myblog
Namespace: demo
Labels: app=myblog
Annotations: <none>
Selector: app=myblog
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.109.119.199
IPs: 10.109.119.199
Port: myblog-port-name 8002/TCP
TargetPort: 8002/TCP
Endpoints: 10.244.0.38:8002 #得到一个ep!
Session Affinity: None
Events: <none>
7. 扩容deployment¶
kubectl -n demo scale deploy myblog --replicas=3
8. 再查看svc的endpoint¶
kubectl -n demo get svc
kubectl -n demo describe svc myblog
root@k8s-master:/k8s/deployment/myblog# kubectl -n demo get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
myblog 1/1 1 1 53m
mysql 1/1 1 1 53m
root@k8s-master:/k8s/deployment/myblog#
root@k8s-master:/k8s/deployment/myblog# kubectl -n demo get pod
NAME READY STATUS RESTARTS AGE
myblog-577746d94f-rr99h 1/1 Running 0 53m
mysql-f9bfdcfcc-9wzk8 1/1 Running 0 53m
root@k8s-master:/k8s/deployment/myblog#
root@k8s-master:/k8s/deployment/myblog# kubectl -n demo scale deploy myblog --replicas=3
deployment.apps/myblog scaled
root@k8s-master:/k8s/deployment/myblog# kubectl -n demo get pod
NAME READY STATUS RESTARTS AGE
myblog-577746d94f-jz5gz 1/1 Running 0 3m25s
myblog-577746d94f-rr99h 1/1 Running 0 57m
myblog-577746d94f-xckgn 1/1 Running 0 63s
mysql-f9bfdcfcc-9wzk8 1/1 Running 0 57m
root@k8s-master:/k8s/deployment/myblog#
root@k8s-master:/k8s/deployment/myblog# kubectl -n demo describe svc myblog
Name: myblog
Namespace: demo
Labels: app=myblog
Annotations: <none>
Selector: app=myblog
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.109.119.199
IPs: 10.109.119.199
Port: myblog-port-name 8002/TCP
TargetPort: 8002/TCP
Endpoints: 10.244.0.38:8002,10.244.0.39:8002,10.244.0.40:8002 ### 发现ep变成3个了,跟pod数目一致!!!
Session Affinity: None
Events: <none>
8.1 Service与Pod如何关联¶
# service对象创建的同时,会创建同名的endpoints对象,
# 若服务设置了readinessProbe, 当readinessProbe检测失败时,endpoints列表中会剔除掉对应的pod_ip,这样流量就不会分发到健康检测失败的Pod中
root@k8s-master:/k8s/deployment/myblog# kubectl -n demo get endpoints
NAME ENDPOINTS AGE
myblog 10.244.0.38:8002,10.244.0.39:8002,10.244.0.40:8002 5m30s
9. 总结¶
###### Service 负载均衡之Cluster IP
service相当于一组pod的LB,负责将请求分发给对应的pod。
每个pod对应一个endpoint!
最后更新:
2022-02-22 04:55:01