1. 认识Service
Service 的意思是服务,在 Kubernetes 中,它被用来做服务发现功能,是将一组 Pods 公开为网络服务的抽象方法。
2. Service的类型
2.1 ClusterIP
ClusterIP 是Service的默认类型,在不做任何声明的情况下,默认是这种类型。这种类型的特点是,只允许在集群内访问,无法通过外部浏览器访问。
下面通过两种方式,暴露服务
方式一:命令行方式
#暴露服务
kubectl expose deployment my-dep --port=8000 --target-port=80
#或者
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=ClusterIP
#使用标签检索Pod
kubectl get pod -l app=my-dep
方式二:yaml文件方式
(1)写一个 yaml 文件,如 service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep # 服务名
spec:
ports:
- port: 8000 # 服务暴露的端口
protocol: TCP
targetPort: 80 # Pod端口
selector:
app: my-dep # 部署的标签,要于deployment中的一致
type: ClusterIP # 类型
(2)执行命令
kubectl apply -f service.yaml
(3)查看服务
kubectl get service
#或者
kubectl get svc
注意点:
- service的域名组成:服务名.所在命名空间.svc
- 在集群内的任一个结点上,都可以通过
serviceIp:port
的方式访问到 Pod ,具体访问到哪一个 Pod,负载均衡随机 - 在集群内的任一个结点上,都无法通过
service域名:port
的方式访问到 Pod - 进入到一个 Pod 内部后,可以通过
serviceIp:port
或者service域名:port
访问到某个服务下的 Pod(如,进入到 Vue 前端所在的 Pod 内部访问后端服务的 Pod)
2.2 NodePort
NodePort 这种类型在实际生产中,用的比较多,是为每个结点暴露出一个端口。
同样的,也可以通过两种方式,暴露服务
方式一:命令行方式
#暴露服务
kubectl expose deployment my-dep --port=8000 --target-port=80 --type=NodePort
方式二:yaml文件方式
(1)写一个 yaml 文件,如 service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: my-dep
name: my-dep
spec:
ports:
- port: 8000
protocol: TCP
targetPort: 80
selector:
app: my-dep
type: NodePort
(2)执行命令
kubectl apply -f service.yaml
(3)查看服务
kubectl get service
#或者
kubectl get svc
以上面这个图为例,如果 Service 的类型是 NodePort ,那么在执行暴露服务的命令后,k8s 会相应地为每个结点开一个端口,这个端口的范围在 30000-32767 之间,如上图的是 30948 ,这个 30948 与我们指定的 8000 有个关联关系,对于集群外部而言,访问 30948 与在集群内部访问 8000,有一样的效果。
由于每个结点都有自己的一个公网 ip ,因此这个时候就可以通过外部浏览器访问 Pod 了。在浏览器中输入结点的公网 ip 以及 暴露的结点的端口,如 137.198.164.238:30948,然后回车,就会负载均衡地访问 Pod。
3. 几种端口的含义
port
port 是 k8s 集群内部访问 service 的端口
nodePort
nodePort 是外部访问 k8s 集群中 service 的端口
targetPort
targetPort 是 pod 的端口,从 port 和 nodePort 来的流量经过 kube-proxy 流入到后端 pod 的 targetPort
containerPort
containerPort 是 pod 内部容器的端口
注意:在 deployment.yaml 文件中,containerPort 指的是容器对外暴露的端口,这个时候也可以理解为该端口就是 pod 的端口