k8s-svc外界访问pod容器服务-4

1.service概述

1.1.service解决了什么问题

运行在docker中的业务,想要被外界访问,我们需要为它做端口映射才能被访问,那么运行在k8s中的容器,为什么不能直接为它做端口映射呢?

  • 解答k8s中的容器,为什么不能直接为它做端口映射
    在这里插入图片描述

在node节点上启动一个A容器,这个A容器配置好了端口映射,但是这个A容器挂了,重新起了一个B容器,这个B容器的IP地址与A容器并不一样,这样我们就没法为每个pod容器都配置端口映射。也就是为什么不能为k8s容器做端口映射访问。

1.2.service解决容器不能被外界访问原理

k8s中有三种IP地址类型:

  1. node IP:这个ip就是每个node节点上的ip地址。
  2. cluster IP:service ip地址。
  3. pod IP:每个pod容器内部的IP地址,这个地址只能在pod内部使用,在外部是不能被访问的。

在这里插入图片描述

service 创建一个clusterIP,集群中的node节点的地址都在在cluster上注册,当node节点上的pod容器启动后就会在cluster上注册自己的IP地址,外界访问node节点地址就会自动映射到对应的pod容器上,实现外界访问pod容器。

2.创建一个service

2.1.创建svc
# 创建一个目录存放svc文件
mkdir svc
cd svc

# 创建svc文件
vim nginx-svc.yaml

# 创建svc
kubectl create -f nginx-svc.yaml
apiVersion: v1
kind: Service  # 资源类型为Service
metadata:
  name: myweb   #service名称
spec:
  type: NodePort  # service类型是nodePort端口映射
  ports:
    - port: 80   # 访问cluster的端口
      nodePort: 30000   #访问宿主机node节点的端口
      targetPort: 80  # 访问pod容器的端口
  selector:
    app: myweb  # 通过标签绑定pod,只要是myweb标签的pod都由他管理。
2.2.查看svc详细信息
kubectl describe svc myweb

在这里插入图片描述
Endpoints: 后面的地址就是pod容器的IP地址,现在有两个pod已经注册到svc上。

2.3.访问pod容器

输入任何node节点的IP地址加端口号就可以访问pod容器内提供的服务。
在这里插入图片描述

3.service服务自动发现

service的服务自动发现不需要手动添加pod,他会自动检测新创建的pod,然后在cluster中注册新pod的IP地址。

  • rc中增加一个pod副本
kubectl scale rc myweb --replicas=3
  • 查看svc自动添加pod
    在这里插入图片描述

4.service 负载均衡

service内部实现了负载均衡功能,当我们部署了多个副本的nginx服务后,在访问的时候将请求均衡到每个副本的nginx上处理。service是一个长连接,当我们连续访问的时候不会切换到另一个pod上,需要稍等一会再次访问就会切换到另一个pod上。

  • 负载均衡访问多个nginx副本
echo 'nginx1' >index.html
kubectl cp index.html myweb-1kwx1:/usr/share/nginx/html/index.html
echo 'nginx2' >index.html
kubectl cp index.html myweb-dfkn9:/usr/share/nginx/html/index.html
  • 多次访问nginx
    在这里插入图片描述
    在这里插入图片描述

5.svc扩展知识

上面在创建svc配置文件中,nodePort: 30000 #访问宿主机node节点的端口 改参数配置的端口默认是30000,这个端口的范围是可以修改的。

-修改默认端口范围

#修改apiservver文件
vim /etc/kubernetes/apiserver
#添加端口访问范围
KUBE_API_ARGS="--service-node-port-range=10000-60000"
#重启apiserver
systemctl restart kube-apiserver.service

在这里插入图片描述

  • 查看apiserver有哪些配置
cat /usr/lib/systemd/system/kube-apiserver.service

在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐