服务 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 中的容器了. 但是在外部还无法访问.
此时需要配置服务类型:
- 默认, 不指定时, 服务的类型是:
ClusterIPK8s会为服务分配一个集群内部的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-PortNodePort会映射到每一个节点主机上, 共外部访问Port是服务暴露的端口, 供集群内部主机之间互相访问Target-Port是容器内部应用的端口.
