1、概述
我们都知道Kubernetes会为每个pod分配一个独立的IP,然而却存在如下问题:
- Deployment控制的3个pod,其中一个Pod出现问题,这个时候给销毁重新创建后Pod Ip会变化
- Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问
这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。
Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。
通过上图可以看出,Service也是通过标签选择器控制一组Pod的对外访问。
2、通过命令创建集群内部可以访问的Service
2.1、ClusterIP方式:
此方式会为Service分配固定IP,在Service整个生命周期内这个IP是不变化的,但是这个IP只能在集群内部访问
#创建deploy
kubectl create deploy mynginx --image=nginx -n dev
#暴露service
kubectl expose deploy mynginx --name=mynginx-service -n dev --port=80 --target-port=80 --type=ClusterIP
#查看service
kubectl get deploy,svc -n dev -owide
实例:
注意:10.1.203.180这个IP只能在集群内部访问,在集群任意几个节点都可访问,此为--type=ClusterIP 这个类型导致
2.2、NodePort
此方式会为Service分配IP和对外暴露端口,通过此端口可以在外部访问
#创建deploy
kubectl create deploy mynginx --image=nginx -n dev
#暴露service
kubectl expose deploy mynginx --name=mynginx-service -n dev --port=80 --target-port=80 --type=NodePort
#查看service
kubectl get deploy,svc -n dev -owide
集群内部访问地址:http://10.6.72.235
集群外部访问地址:http://10.6.72.235:32536
3、删除service
涉及命令:
kubectl delete svc mynginx-service -n dev
4、通过yaml暴露service
4.1、生成service的yaml模板mynginx-service.yaml 并修改
#创建模板
kubectl expose deploy mynginx --name=mynginx-service -n dev --port=80 --target-port=80 --type=NodePort -o yaml --dry-run=client > mynginx-service.yaml
yaml内容:
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: mynginx
name: mynginx-service
namespace: dev
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: mynginx
type: NodePort
status:
loadBalancer: {}