• 如何从 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 集群外。

  • 相关阅读:
    未能加载文件或程序集“Oracle.DataAccess”或它的某一个依赖项。试图加载格式不正确的程序
    Silverlight Visifire控件 后台设置颜色
    silverlight 生成图表 WCF 解析XML代码.svc.cs 文件
    silverlight 生产图表(动态图表类型,Y轴数量) .xaml.cs文件
    Silverlight Visifire控件应用去水印
    .net简单的aspx创建
    Silverlight Visifire控件 .net后台控制aspx页面控件的显示与隐藏,动态给控件赋值,选定默认值的设定
    .net后台 Silverlight 页面 动态设置 ASPX 页面 控件的Margin值(位置设置)
    转载 Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))
    java 读取Excel文件并数据持久化方法Demo
  • 原文地址:https://www.cnblogs.com/chen-villagehead/p/16206930.html
Copyright © 2020-2023  润新知