跳转至

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