K8S-Service 提供外部服务(7)
使用 Service 提供外部服务
Pod 使用的是一个集群内部的 IP 地址,如果用 Pod 来运行 nginx 是无法从集群外部访问到页面的。比如上面创建的 Pod,在 Master 节点上执行curl ip就可以访问到 nginx 页面。

但 exit 退出到 PowerShell 后就无法访问了。

另一个问题就是 Pod 并不是一个稳定的实体,经常会被创建或销毁,这里它的 IP 地址也会发生变化。
解决方案就是使用 Service 来提供外部服务。
- 创建一个 Service
sudo kubectl service nginx-service - 也可以直接将已存在的 Deployment 对外公开为一个服务
sudo kubectl expose deployment nginx-deployment

- 查看资源详细信息
sudo kubectl describe [资源类型] [资源名称]

- 通过配置文件创建 Service
新建一个配置文件 nginx-service.yaml
apiVersion: v1 # 使用的Kubernetes API版本,这里是v1。
kind: Service # 定义资源类型为Service,表示创建一个服务。
metadata: # 元数据部分,用于描述Service的基本信息。
name: nginx-service # Service的名称为nginx-service。
spec: # 规格部分,定义Service的规格。
selector: # 选择器部分,用于指定服务应该选择哪些Pod作为后端。
app: nginx # 选择具有标签app=nginx的Pod作为后端。
ports: # 端口配置,定义Service暴露的端口。
- protocol: TCP # 使用TCP协议。
port: 80 # Service暴露的端口号为80。
targetPort: 80 # 转发到后端Pod的端口号也为80。
这里需要先了解一下选择器 selector 的作用:选择特定的资源,一般和 label 标签一起使用,类似 CSS 的选择器,我们前面在创建 Deployment 时已经给 Deployment 绑定了一个选择器,回头看看配置文件里的 matchLabels,也可以sudo kubectl describe deployment nginx-deployment看一下 Deployment 信息,可以看到 Deployment 信息下有个 Selector

然后再看看 Pod 信息,创建的三个 Pod 都有 Labels 标签

总结一下就是,在 Deployment 声明一个选择器,在 Pod 里贴上一个标签,选择器与标签匹配的 Deployment 就可以管理 Pod。
保存配置文件后应用一下这个文件sudo kubectl apply -f nginx-service.yaml
但是这个服务还是一个集群内部的服务,无法从集群外部访问,这时我们就得用到 NodePort 类型的服务。

NodePort 可以将服务公开到集群的节点上,然后我们通过 IP 和端口就可以访问到服务了。
我们创建 Service 时没有指定服务的类型,那这个 Service 默认就是一个 ClusterIP 类型的服务,也就是集群内部的服务,现在我们来将 Service 的服务类型改为 NodePort,只要在配置文件里加上 type 和 nodePort 就好了。注意端口的范围在 30000~32767 之间(这个范围是由 Kubernetes 团队选择的,因为它们通常不会被其他应用或服务占用)
apiVersion: v1 # 使用的Kubernetes API版本,这里是v1。
kind: Service # 定义资源类型为Service,表示创建一个服务。
metadata: # 元数据部分,用于描述Service的基本信息。
name: nginx-service # Service的名称为nginx-service。
spec: # 规格部分,定义Service的规格。
type: NodePort # 指定服务类型
selector: # 选择器部分,用于指定服务应该选择哪些Pod作为后端。
app: nginx # 选择具有标签app=nginx的Pod作为后端。
ports: # 端口配置,定义Service暴露的端口。
- protocol: TCP # 使用TCP协议。
port: 80 # Service暴露的端口号为80。
targetPort: 80 # 转发到后端Pod的端口号也为80。
nodePort: 30080
保存后 apply 一下,sudo kubectl apply -f nginx-service.yaml
然后查看 Service 信息,可以看到服务类型变成了 NodePort,且端口号为 30080

查看一下 IP 地址sudo kubectl get nodes -o wide

然后打开浏览器,输入 nodeIP:port,可以访问了!

关于 Service 的类型还有其它各类和应用,LoadBalcancer、ExternalName、Headless,感兴趣上官网了解一下

浙公网安备 33010602011771号