04-Kubernetes中的Service

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 的端口

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值