如何从 Kubernetes 集群外访问集群内的容器服务

HostNetwork

将pod设置为hostNetwork的,即直接使用宿主机网络。hostNetwork类型的pod与宿主机共享网络协议栈。

缺点:

    假如pod重建,pod可能会调度到其他node上,这时pod的ip就改变了,那么客户端的配置很可能需要更改

    与宿主机共享网络协议栈,需要考虑端口冲突的问题。如果此类型的pod太多,端口会冲突,运维成本高

 

1、编写pod 的yaml,文件名为:hostnet.yaml

apiVersion: v1
kind: Pod
metadata:
  name: my-nginx
spec:
  hostNetwork: true
  containers:
    - name: my-nginx
      image: myapp:v1

2、创建pod

kubectl apply -f hostnet.yaml

3、查看pod创建情况

 kubectl get pods -o wide

4、访问容器内的服务

 curl 192.168.49.2

 

HostPort

将pod中某个容器的端口映射到宿主机端口上,然后通过访问宿主机ip+宿主机端口来访问pod

缺点:

    假如pod重建,pod可能会调度到其他node上,这个时候node的ip就改变了,那么客户端的配置很可能需要更改

    因为需要把容器的端口映射到宿主机上,所以需要考虑端口冲突的问题

1、编写pod 的yaml,文件名为:hostport.yaml

apiVersion: v1
kind: Pod
metadata:
  name: hostport-nginx
spec:
  containers:
    - name: hostport-nginx
      image: myapp:v1
      ports:
        - containerPort: 80
          hostPort: 8081

2、创建pod

kubectl apply -f hostport.yaml

3、查看pod创建情况

 kubectl get pods -o wide

4、访问容器内的服务

 curl http://192.168.49.2:8081

 

NodePort service

可以通过创建NodePort类型的Service来将pod暴露到 Kubernetes 集群外。当我们创建一个NodePort类型的service时, Kubernetes 会自动分配一个node port,

并且会在所有的k8s node上创建相应的iptables规则,用户可以通过访问任一k8s node的ip+node port,即可访问后端服务。

缺点:

    当创建一个NodePort类型的service, Kubernetes 会自动分配一个端口,并且在所有的k8s node上配置针对该端口的dnat规则

    需要考虑访问哪个node的ip,选择的node宕机了怎么办

1、在 Kubernetes 集群中部署后端服务

2、创建NodePort类型的service,并且上面创建的pod

3、集群外访问server

[maomao@wangwu kuber]$ kubectl create deployment myappv1 --image=myapp:v1               # 在 Kubernetes 集群中部署后端服务
deployment.apps/myappv1 created
[maomao@wangwu kuber]$ kubectl get deployment,pods -o wide
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES     SELECTOR
deployment.apps/myappv1   1/1     1            1           14s   myapp        myapp:v1   app=myappv1

NAME                           READY   STATUS    RESTARTS   AGE    IP           NODE       NOMINATED NODE   READINESS GATES
pod/myappv1-56f6fc49cf-tfdzv   1/1     Running   0          14s    172.17.0.4   minikube   <none>           <none>
[maomao@wangwu kuber]$
[maomao@wangwu kuber]$ kubectl expose deployment myappv1 --name=myappv1-svc --type=NodePort --port=80 --target-port=80      # 创建NodePort类型的service,并且上面创建的pod
service/myappv1-svc exposed
[maomao@wangwu kuber]$ kubectl get deployment,svc,pods -o wide
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES     SELECTOR
deployment.apps/myappv1   1/1     1            1           2m2s   myapp        myapp:v1   app=myappv1

NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service/kubernetes    ClusterIP   10.96.0.1        <none>        443/TCP        4h52m   <none>
service/myappv1-svc   NodePort    10.103.238.146   <none>        80:30111/TCP   9s      app=myappv1

NAME                           READY   STATUS    RESTARTS   AGE     IP           NODE       NOMINATED NODE   READINESS GATES
pod/myappv1-56f6fc49cf-tfdzv   1/1     Running   0          2m2s    172.17.0.4   minikube   <none>           <none>
[maomao@wangwu kuber]$ curl 192.168.49.2:30111     # 集群外访问
<h3>nginx test.</h3>

  

 

LoadBalancer service

LoadBalancer service 是一个比较理想的选择。这个需要cloud-provider的支持,

各个云服务提供商基于自己的LB服务对接实现 Kubernetes LoadBalancer service。

当用户创建LoadBalancerservice时,cloud-controller-manager会自动创建一个LB实例,分配一个VIP,

并且会自动维护后端pod列表和LB的配置更新。然后我们可以访问VIP:port来访问后端服务

缺点:存在成本

 

 

Ingress

用户也可以通过创建Ingress资源来将服务暴露到 Kubernetes 集群外。

 

posted @ 2022-04-29 15:49  一只小麻瓜  阅读(594)  评论(0编辑  收藏  举报