服务 Service
服务将运行在一组 Pod
上的应用程序公开为网络服务.
服务给一组 Pod
提供相同的 DNS
名, 并在其间进行负载均衡.
原因:
K8s
为Pod
分配IP
的, 但IP
伴随运行是变化的.- 一旦
IP
变化, 对外访问就会成为问题.
一旦有了服务, 集群内就可以通过服务名来访问, 而不用 IP
.
K8s Service
可以看成微服务的抽象模型:
- 服务后有一组可以互相替换的
Pod
, 通常称为微服务. - 服务对应
Pod
集合, 通常使用选择算符来确定.
逻辑上每一个
Pod
服务都是一样, 不用考虑区分是哪一个Pod
提供的响应处理.
将部署导出为服务
使用命令:
kubectl expose deploy/部署名 --name=服务名 --port=服务端口 --target-port=Pod的端口
注意:
--name
是服务的名字, 它将部署导出为服务--port
是导出的服务端口, 即对外的端口--target-port
是pod
的端口
这里导出的 服务, 在集群内部允许直接通过 IP
互联
可以在本级直接访问该 10.43.126.165:8080
, 也可以在 节点机器上访问, 也可以进入容器后访问.
而在集群内部, 可以使用 服务名
+ 端口
进行访问.
查看 Service 的信息
使用 describe
子命令查看
kubectl describe service nginx-server
可以看到后端端点 (Endpoints
) 有 三个. 服务已然支持负载均衡. 然后查看 Pod
, 带上 -owide
参数:
kubectl get pod -owide
可以看到每一个节点上对应一个 IP
验证负载均衡
进入其中一个节点
kubectl exec -it d-nginx-6d68f4cb59-tgqq6 -- bash
进入到 nginx
存储静态页面的目录
cd /usr/share/nginx/html/
然后将首页进行修改
echo 'Hello JK' > index.html
然后退出 Pod
容器, 再次访问该 url
curl 10.43.126.165:8080
多访问几次, 即可看到刚刚修改的内容
会发现两个页面内容会交替呈现. 则表示存在负载均衡.
服务类型与外部访问
现在可以在集群内部访问 Pod
中的容器了. 但是在外部还无法访问.
此时需要配置服务类型:
- 默认, 不指定时, 服务的类型是:
ClusterIP
K8s
会为服务分配一个集群内部的IP
. 在集群内部的所有主机, 可以直接使用这个IP
访问.- 而在集群内部的
Pod
中, 甚至可以直接使用服务名来访问服务.
NodePort
, 通过每一个节点的IP
与 节点端口 (NodePort
) 暴露服务.- 即使用节点的
IP
+端口
外部可以访问到该服务.
- 即使用节点的
ExternalName
暂略. 表示将集群外部的网络引入到集群内部.LoadBalancer
暂略. 表示使用云供应商的负载均衡器向外暴露服务.
下面重新创建一个服务 (关联到部署上)
kubectl expose deploy/d-nginx \
--name=nginx-server2 \
--type=NodePort \
--port=8081 \
--target-port=80
内部端口与之前的用法一样, 外部端口是可以用来在外部利用节点 IP
来访问的.
注意存在负载均衡, 不是每次都一样. 可以等一下刷新.
小结
- 服务有三个端口:
NodePort
,Port
,Target-Port
NodePort
会映射到每一个节点主机上, 共外部访问Port
是服务暴露的端口, 供集群内部主机之间互相访问Target-Port
是容器内部应用的端口
.