Kubernetes--从集群外部访问Pod或Service

一、背景

   由于Pod和Service都是Kubernetes集群范围内的虚拟概念,所以集群外的客户端系统无法通过Pod的IP地址或者Service的虚拟IP地址和虚拟端口号访问它们。为了让外部客户端可以访问这些服务,可将Pod或Service的端口号映射到宿主机,以使客户端应用能够通过物理机访问容器应用。

二、将容器应用的端口号映射到物理机

   (1)通过设置容器级别的hostPort,将容器应用的端口号映射到物理机:

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  containers:
  - name: webapp
    imgae: tomcat
    ports:
    - containerPort: 8080
      hostPort: 8081  #映射到物理机的8081端口

 可以通过物理机的IP和8081端口号访问Pod内的容器服务器。

   (2) 通过设置Pod级别的hostNetwork=true,该Pod中所有容器的端口号都被直接映射到物理机上。在设置hostNetwork=true时需要注意,在容器的ports定义部分如果不知道hostPort,则默认hostPort等于containerPort,如果指定了hostPort,则hostPort必须等与containerPort的值

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  hostNetwork: true
  containers:
  - name: webapp
    imagePullPolicy: Never
    image: tomcat
    ports:
    - containerPort: 8080

 通过物理机的IP地址和8080端口号访问Pod内的容器服务

三、将Service的端口号映射到物理机

(1) 设置nodePort映射物理机,同时设置Service类型为NodePort

apiVersion: v1
kind: Service
metadate:
  name: webapp
spec:
  type: NodePort
  ports:
  - port: 8080
  targetPort: 8080
  nodePort: 8081
  selector:
    app: webapp

  通过物理机的IP地址和nodePort8081端口访问服务Kubernetes--从集群外部访问Pod或Service_第1张图片

这种映射不适用于生产环境:

  • Kubernetes 集群中的host IP必须是一个已知的IP,也就是客户端必须知道该IP。但Cluster中的host是被作为资源池看待的,可以增加和删除,每个host的IP也是动态分配的,并不能认为host的IP就是已知的IP
  • 客户端访问某一个固定Host IP存在当点故障,Kubernets会把这个应用迁移到另一个Node,客户端就无法通过已知的host的IP访问该应用
  • 该方案是假设客户端在Node所在的网络中,在生产环境中,Kubernetes host的网络可能与客户端网络是隔离的。例如客户端是公网中的一个手机,无法直接访问Kubernetes host所在的私有网络。

(2) 通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法用于在公有云平台设置Service的场景。status.loadBalancer.ingress.ip设置的146.148.47.155为云服务商提供的负载均衡器的IP地址。对该Service的访问请求会用过LoadBalancer转发到后端Pod上。负载分发的实现方式依赖云服务商提供的LoadBalancer的实现机制:

apiVersion: v1
kind: Service
metadata:
  name: my-servce
spec:
  selector:
    app: Myapp
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
    nodePort: 30061
    clusterIP: 10.0.171.239
    loadBalancerIP: 78.11.24.19
    type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 146.148.47.155

Kubernetes--从集群外部访问Pod或Service_第2张图片

 

你可能感兴趣的:(Kubernetes,kubernetes,容器,docker)