Kubernetes(三) 如何从外部访问服务
Kubernetes教程之对外暴露服务
文章地址: [https://blog.piaoruiqing.com/blog/2019/10/20/kubernetes如何从外部访问服务/)
前言
通过前文的讲解,《跟着官方文档从零搭建K8S》、《应用部署》相信读者已经对Kubernetes安装及部署应用有了一定的了解. 接下来, 本文将针对如何将服务暴露给外部进行讲解.
阅读这篇文章你能收获到:
- 了解Kubernetes暴露服务的几种方案及其优缺点.
阅读本文你需要:
- 了解基本的Kubernetes命令.
- 有一个Kubernetes环境
将服务暴露给外部客户端的几种方式
- 通过
port-forward
转发, 这种方式在之前的文章中有提到过, 操作方便、适合调试时使用, 不适用于生产环境. - 通过
NodePort
, 此时集群中每一个节点(Node)都会监听指定端口, 我们通过任意节点的端口即可访问到指定服务. 但过多的服务会开启大量端口难以维护. - 通过
LoadBalance
来暴露服务.LoadBalance(负载均衡 LB)
通常由云服务商提供, 如果云环境中不提供LB服务, 我们通常直接使用Ingress
, 或使用MetalLB
来自行配置LB. - 通过
Ingress
公开多个服务.Ingress
公开了从群集外部到群集内services
的HTTP和HTTPS路由. 流量路由由Ingress
资源上定义的规则控制. 在云服务商不提供LB服务的情况下, 我们可以直接使用Ingress
来暴露服务. (另外, 使用LB + Ingress
的部署方案可以避免过多LB应用带来的花费).
准备
在开始之前, 笔者已经创建好了测试应用, 代码过长此处略去, 详见附录[1]和附录[2]
我们通过kubectl get pods
查看pod列表.
指的一提的是, 我们可以通过
--namespace
参数查看指定命名空间的pod列表, 也可以通过--all-namespaces
来查看全部命名空间的pod列表.由于没有指定命名空间,所以应用被放到
default
中了.
[root@nas-centos1 k8s-test]# kubectl get pods --namespace default
NAME READY STATUS RESTARTS AGE
k8s-test-578b77cd47-sw5pd 1/1 Running 0 6m29s
k8s-test-578b77cd47-v6kmp 1/1 Running 0 6m29s
port-forward
port-forward
这种方式访问pod, 可以指定pod实例, 简单方便, 很适合调试之用.
通过kubectl port-forward
来配置转发:
[root@nas-centos1 k8s-test]# kubectl port-forward --address 0.0.0.0 k8s-test-578b77cd47-sw5pd 9999:8080
Forwarding from 0.0.0.0:9999 -> 8080
此时, 我们可以通过通过访问宿主机的9999
端口来访问到k8s-test-578b77cd47-sw5pd
的8080
端口.
/k8s-test/timestamp
是该示例应用唯一一个api, 用于获取当前时间戳
[root@nas-centos1 k8s-test]# curl http://10.33.30.95:9999/k8s-test/timestamp
1571151584224
本文发布于 朴瑞卿的博客, 允许非商业用途转载, 但转载必须保留原作者 朴瑞卿 及链接: http://blog.piaoruiqing.com. 如有授权方面的协商或合作, 请联系邮箱: piaoruiqing@gmail.com.
NodePort
集群中每一个节点(Node)都会监听指定端口, 我们通过任意节点的端口即可访问到指定服务. 但过多的服务会开启大量端口难以维护.
参考文档: https://kubernetes.io/docs/concepts/services-networking/service/#nodeport
创建一个Service
, 并指定其类型为NodePort
.
k8s-test-service.yaml
apiVersion: v1
kind: Service
metadata:
name: k8s-test-service