从集群外部访问pod或service

由于Pod和Service都是Kubernetes集群范围内的虚拟概念,所以集群外的客户端系统无法通过Pod的IP地址或者Service的虚拟IP地址和虚拟端口号访问它们。

为了让外部客户端可以访问这些服务,可以将Pod或Service的端口号映射到宿主机,以使客户端应用能够通过物理机访问容器应用。

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

设置容器级别的hostPort

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

[root@k8s-master ~]# vim pod-hostport.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: webapp
  labels:
    app: webapp
spec:
  containers:
  - name: webapp
    image: tomcat
    ports:
    - containerPort: 8080
      hostPort: 8081

通过kubectl create命令创建这个Pod:

[root@k8s-master ~]# kubectl create -f pod-hostport.yaml 
pod/webapp created

[root@k8s-master ~]# kubectl get pod 
NAME     READY   STATUS    RESTARTS   AGE
webapp   1/1     Running   0          93s

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

[root@k8s-master ~]# curl 192.168.1.8:8081

设置Pod级别的hostNetwork=true

通过设置Pod级别的hostNetwork=true,该Pod中所有容器的端口号都将被直接映射到物理机上。

在设置hostNetwork=true时需要注意,在容器的ports定义部分如果不指定hostPort,则默认hostPort等于containerPort,如果指定了hostPort,则hostPort必须等于containerPort的值:

[root@k8s-master ~]# vim pod-hostnetwork.yaml 

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

[root@k8s-master ~]# kubectl create -f pod-hostnetwork.yaml 
pod/webapp2 created

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

[root@k8s-master ~]# curl -I 192.168.1.8:8080

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

通过设置nodePort映射到物理机,同时设置Service的类型为NodePort:

[root@k8s-master ~]# vim webapp-svc-nodeport.yaml 

apiVersion: v1
kind: Service
metadata:
  name: webapp
spec:
  type: NodePort        # 重点
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30080      # 重点
  selector:
    app: webapp

[root@k8s-master ~]# kubectl create -f webapp-svc-nodeport.yaml 
service/webapp created

每个节点上都会监听30080端口,通过Node的IP地址和nodePort 30080端口号访问服务:

 curl -I 192.168.1.8:30080
 curl -I 192.168.1.9:30080

同样,对该Service的访问也将被负载分发到后端的多个Pod上。

设置LoadBalancer

通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。

这种用法仅用于在公有云服务提供商的云平台上设置Service的场景。

在下面的例子中,status.loadBalancer.ingress.ip设置的146.148.47.155为云服务商提供的负载均衡器的IP地址。对该Service的访问请求将会通过LoadBalancer转发到后端Pod上,负载分发的实现方式则依赖于云服务商提供的LoadBalancer的实现机制:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zhangshaohuas/article/details/107573856