jk's notes
  • 服务 Service

服务 Service

服务将运行在一组 Pod 上的应用程序公开为网络服务.

服务给一组 Pod 提供相同的 DNS 名, 并在其间进行负载均衡.

原因:

  1. K8s 为 Pod 分配 IP 的, 但 IP 伴随运行是变化的.
  2. 一旦 IP 变化, 对外访问就会成为问题.

一旦有了服务, 集群内就可以通过服务名来访问, 而不用 IP.

K8s Service 可以看成微服务的抽象模型:

  • 服务后有一组可以互相替换的 Pod, 通常称为微服务.
  • 服务对应 Pod 集合, 通常使用选择算符来确定.

逻辑上每一个 Pod 服务都是一样, 不用考虑区分是哪一个 Pod 提供的响应处理.

将部署导出为服务

使用命令:

kubectl expose deploy/部署名 --name=服务名 --port=服务端口 --target-port=Pod的端口

注意:

  • --name 是服务的名字, 它将部署导出为服务
  • --port 是导出的服务端口, 即对外的端口
  • --target-port 是 pod 的端口

这里导出的 服务, 在集群内部允许直接通过 IP 互联

image-20230728231529400

可以在本级直接访问该 10.43.126.165:8080, 也可以在 节点机器上访问, 也可以进入容器后访问.

image-20230729000023981

image-20230729000037154

image-20230729000101715

image-20230729001208109

而在集群内部, 可以使用 服务名 + 端口进行访问.

image-20230729001316742

查看 Service 的信息

使用 describe 子命令查看

kubectl describe service nginx-server

image-20230729001845408

可以看到后端端点 (Endpoints) 有 三个. 服务已然支持负载均衡. 然后查看 Pod, 带上 -owide 参数:

kubectl get pod -owide

image-20230729002156813

可以看到每一个节点上对应一个 IP

验证负载均衡

进入其中一个节点

kubectl exec -it d-nginx-6d68f4cb59-tgqq6 -- bash

进入到 nginx 存储静态页面的目录

cd /usr/share/nginx/html/

然后将首页进行修改

echo 'Hello JK' > index.html

image-20230729002532568

然后退出 Pod 容器, 再次访问该 url

curl 10.43.126.165:8080

多访问几次, 即可看到刚刚修改的内容

image-20230729002732770

会发现两个页面内容会交替呈现. 则表示存在负载均衡.

服务类型与外部访问

现在可以在集群内部访问 Pod 中的容器了. 但是在外部还无法访问.

此时需要配置服务类型:

  • 默认, 不指定时, 服务的类型是: ClusterIP
    • K8s 会为服务分配一个集群内部的 IP. 在集群内部的所有主机, 可以直接使用这个 IP 访问.
    • 而在集群内部的 Pod 中, 甚至可以直接使用服务名来访问服务.
  • NodePort, 通过每一个节点的 IP 与 节点端口 (NodePort) 暴露服务.
    • 即使用节点的 IP + 端口 外部可以访问到该服务.
  • ExternalName 暂略. 表示将集群外部的网络引入到集群内部.
  • LoadBalancer 暂略. 表示使用云供应商的负载均衡器向外暴露服务.

image-20230729003558909

下面重新创建一个服务 (关联到部署上)

kubectl expose deploy/d-nginx \
        --name=nginx-server2 \
        --type=NodePort \
        --port=8081 \
        --target-port=80

image-20230729004226406

内部端口与之前的用法一样, 外部端口是可以用来在外部利用节点 IP 来访问的.

image-20230729005013721

注意存在负载均衡, 不是每次都一样. 可以等一下刷新.

小结

  • 服务有三个端口: NodePort, Port, Target-Port
    • NodePort 会映射到每一个节点主机上, 共外部访问
    • Port 是服务暴露的端口, 供集群内部主机之间互相访问
    • Target-Port 是容器内部应用的 端口.

image-20230729005509874

Last Updated:
Contributors: jk