k8s如何获取对外的端口

k8s如何获取对外的端口

Kubernetes(K8s)提供了多种方法来获取对外的端口,包括NodePort、LoadBalancer和Ingress等方式,具体方法取决于你的集群环境和需求。 NodePort是最简单的一种方式,它会在每个节点上打开一个指定端口并将请求转发到内部的Pod;LoadBalancer适用于在云环境中使用,自动创建一个云负载均衡器并分配一个外部IP;Ingress是一种更灵活的方式,可以管理多个服务的外部访问,支持基于域名的路由和TLS终端等高级功能。下面将详细介绍这些方法及其应用场景。

一、NODEPORT

NodePort是Kubernetes中最简单的服务暴露方式之一。它会在每个节点上打开一个指定端口,并将外部请求转发到内部的Pod。NodePort的端口范围通常在30000-32767之间,可以由Kubernetes自动分配或手动指定。

  1. 定义NodePort服务:创建一个Service对象,类型指定为NodePort。以下是一个示例YAML配置:

apiVersion: v1

kind: Service

metadata:

name: my-nodeport-service

spec:

type: NodePort

selector:

app: my-app

ports:

- port: 80

targetPort: 8080

nodePort: 30007

  1. 部署和验证:应用上述配置后,可以通过kubectl apply -f service.yaml命令部署。然后使用kubectl get svc my-nodeport-service查看Service的状态,确认NodePort已分配。

  2. 访问服务:通过<NodeIP>:<NodePort>访问服务,例如http://192.168.1.2:30007。由于每个节点都会开放相同的端口,因此可以使用集群中任意节点的IP。

NodePort适用于小型集群和开发测试环境,但在生产环境中使用时需要考虑安全性和端口管理的问题。

二、LOADBALANCER

LoadBalancer类型的服务适用于在云环境中部署,它会自动创建一个云负载均衡器并分配一个外部IP,用于将外部流量分发到集群内的Pod。

  1. 定义LoadBalancer服务:创建一个Service对象,类型指定为LoadBalancer。以下是一个示例YAML配置:

apiVersion: v1

kind: Service

metadata:

name: my-loadbalancer-service

spec:

type: LoadBalancer

selector:

app: my-app

ports:

- port: 80

targetPort: 8080

  1. 部署和验证:应用上述配置后,可以通过kubectl apply -f service.yaml命令部署。然后使用kubectl get svc my-loadbalancer-service查看Service的状态,确认已分配外部IP。

  2. 访问服务:通过分配的外部IP访问服务,例如http://<External-IP>。云负载均衡器会自动处理流量的分发和健康检查。

LoadBalancer方式适用于需要高可用性和负载均衡的生产环境,特别是在使用AWS、GCP、Azure等云服务提供商时非常方便。

三、INGRESS

Ingress是一种更灵活和强大的方式,它可以管理多个服务的外部访问,支持基于域名的路由和TLS终端等高级功能

  1. 部署Ingress Controller:在使用Ingress之前,需要部署一个Ingress Controller,如NGINX、Traefik等。可以通过以下命令部署NGINX Ingress Controller:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml

  1. 定义Ingress资源:创建一个Ingress对象,定义路由规则和TLS配置。以下是一个示例YAML配置:

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

name: my-ingress

annotations:

nginx.ingress.kubernetes.io/rewrite-target: /

spec:

tls:

- hosts:

- myapp.example.com

secretName: tls-secret

rules:

- host: myapp.example.com

http:

paths:

- path: /

pathType: Prefix

backend:

service:

name: my-service

port:

number: 80

  1. 部署和验证:应用上述配置后,可以通过kubectl apply -f ingress.yaml命令部署。然后使用kubectl get ingress my-ingress查看Ingress的状态,确认已配置路由规则和TLS。

  2. 访问服务:通过定义的域名访问服务,例如https://myapp.example.com。Ingress Controller会根据配置的规则将请求转发到相应的Service。

Ingress适用于需要复杂路由和TLS终端的生产环境,特别适合多域名和多服务的场景。

四、EXTERNALNAME

ExternalName是一种特殊类型的服务,它将Kubernetes服务名称映射到外部服务的DNS名称,适用于将集群内部请求转发到外部服务。

  1. 定义ExternalName服务:创建一个Service对象,类型指定为ExternalName。以下是一个示例YAML配置:

apiVersion: v1

kind: Service

metadata:

name: my-externalname-service

spec:

type: ExternalName

externalName: external-service.example.com

  1. 部署和验证:应用上述配置后,可以通过kubectl apply -f service.yaml命令部署。然后使用kubectl get svc my-externalname-service查看Service的状态,确认已配置ExternalName。

  2. 访问服务:通过服务名称访问,例如在Pod内使用curl http://my-externalname-service,请求会被转发到external-service.example.com

ExternalName适用于将集群内部请求转发到外部服务,简化服务间的DNS解析和管理。

五、HEADLESS SERVICE

Headless Service是一种不分配ClusterIP的服务,它允许直接将请求转发到后端Pod的IP,适用于需要对Pod进行直接访问的场景,如数据库和缓存服务。

  1. 定义Headless Service:创建一个Service对象,类型指定为ClusterIP,但不分配IP。以下是一个示例YAML配置:

apiVersion: v1

kind: Service

metadata:

name: my-headless-service

spec:

clusterIP: None

selector:

app: my-app

ports:

- port: 80

targetPort: 8080

  1. 部署和验证:应用上述配置后,可以通过kubectl apply -f service.yaml命令部署。然后使用kubectl get svc my-headless-service查看Service的状态,确认未分配ClusterIP。

  2. 访问服务:通过服务名称访问,例如在Pod内使用curl http://my-headless-service,请求会被直接转发到后端Pod的IP。

Headless Service适用于需要直接访问后端Pod的场景,如需要通过DNS轮询进行负载均衡的应用。

六、PORT FORWARDING

Port Forwarding是一种临时性的调试工具,允许将本地端口映射到Pod或Service的端口,用于本地开发和调试。

  1. 启动Port Forwarding:使用kubectl port-forward命令启动端口转发。例如,将本地8080端口转发到Pod的80端口:

kubectl port-forward pod/my-pod 8080:80

  1. 访问服务:通过本地端口访问服务,例如在浏览器中访问http://localhost:8080

Port Forwarding适用于本地开发和调试,但不适合在生产环境中使用。

七、SERVICE MESH

Service Mesh是一种更高级的微服务架构,它通过代理层管理服务间的通信,提供服务发现、负载均衡、故障恢复等功能。

  1. 部署Service Mesh:以Istio为例,部署Istio控制平面:

kubectl apply -f istio-1.10.0/install/kubernetes/istio-demo.yaml

  1. 注入Sidecar代理:在应用Pod中注入Sidecar代理。例如,使用istioctl kube-inject命令:

istioctl kube-inject -f deployment.yaml | kubectl apply -f -

  1. 配置和管理:通过Istio的VirtualService和DestinationRule管理流量路由和策略。例如,定义一个VirtualService:

apiVersion: networking.istio.io/v1alpha3

kind: VirtualService

metadata:

name: my-virtualservice

spec:

hosts:

- my-service

http:

- route:

- destination:

host: my-service

subset: v1

Service Mesh适用于大型微服务架构,提供更细粒度的流量管理和监控。

八、DNS & SERVICE DISCOVERY

Kubernetes内置DNS服务,自动为每个Service分配一个DNS名称,用于服务发现和负载均衡。

  1. 访问Service:通过服务名称访问,例如在Pod内使用curl http://my-service,请求会被自动负载均衡到相应的Pod。

  2. 自定义DNS配置:可以通过ConfigMap自定义DNS解析,例如:

apiVersion: v1

kind: ConfigMap

metadata:

name: custom-dns

namespace: kube-system

data:

stubDomains: |

{"example.com": ["8.8.8.8"]}

DNS和服务发现适用于集群内服务间的通信,简化了服务地址管理和负载均衡。

综上所述,Kubernetes提供了多种获取对外端口的方法,适用于不同的场景和需求。选择合适的方法可以提高应用的可用性、安全性和性能。

相关问答FAQs:

K8s如何获取对外的端口?

在Kubernetes(K8s)中,获取对外的端口通常涉及到服务(Service)的配置和管理。K8s 提供了多种类型的服务来确保在集群外部和集群内部之间的网络流量能够正确路由。具体而言,NodePort、LoadBalancer 和 Ingress 是最常用的几种服务类型,每种类型都在对外访问方面发挥着重要作用。

NodePort

NodePort 是 Kubernetes 中的一种服务类型,它允许外部流量通过特定端口访问服务。在 NodePort 模式下,K8s 会在每个节点上开放一个端口,并将该端口的流量路由到后端的 Pod。

如何使用 NodePort?

  1. 创建服务时,将 type 设置为 NodePort
  2. K8s 会自动分配一个可用的端口,范围通常在 30000 到 32767 之间。如果需要,可以手动指定该端口。
  3. 外部用户可以通过节点的 IP 地址和指定的端口访问服务。
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080
      nodePort: 30001

通过以上配置,可以通过访问 http://<Node_IP>:30001 来访问该服务。

LoadBalancer

LoadBalancer 是另一种常见的服务类型,特别适用于在云环境中运行的 Kubernetes 集群。使用 LoadBalancer 类型的服务,K8s 会自动创建一个云负载均衡器,并将其配置为将流量路由到对应的服务。

如何使用 LoadBalancer?

  1. 在创建服务时,将 type 设置为 LoadBalancer
  2. K8s 会与云提供商的 API 交互,创建负载均衡器并分配一个公共 IP 地址。
  3. 外部用户可以使用该公共 IP 地址访问服务。
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: LoadBalancer
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080

在这种情况下,可以通过访问分配的公共 IP 地址来访问服务。

Ingress

Ingress 是 K8s 中一种更为灵活的资源类型,用于管理对服务的外部访问,特别是在 HTTP 和 HTTPS 流量方面。Ingress 可以通过 URL 路由和主机名来细化对服务的访问控制。

如何使用 Ingress?

  1. 创建一个 Ingress 资源,定义路由规则。
  2. 通常还需要一个 Ingress Controller,以处理进来的 HTTP 请求并将其路由到相应的服务。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: myapp.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80

通过配置 Ingress,用户可以通过 http://myapp.example.com 访问到对应的服务。

如何查看服务的端口?

要查看已创建服务的端口,可以使用以下命令:

kubectl get services

该命令会列出所有服务及其对应的端口信息,包括 ClusterIP、NodePort、LoadBalancer IP 等。

总结

Kubernetes 提供了多种方式来获取对外的端口。通过使用 NodePort、LoadBalancer 和 Ingress,可以灵活地满足不同的访问需求。根据应用场景选择合适的服务类型,能够有效地管理集群内外的流量,并确保服务的可访问性。

对于希望深入了解 Kubernetes 服务配置的用户,可以参考官方文档,获取更详细的信息和示例。

关于 GitLab 的更多内容,可以查看官网文档:
官网地址: https://gitlab.cn 
文档地址: https://docs.gitlab.cn 
论坛地址: https://forum.gitlab.cn 

原创文章,作者:极小狐,如若转载,请注明出处:https://devops.gitlab.cn/archives/49719

(0)
极小狐极小狐
上一篇 2024 年 7 月 24 日
下一篇 2024 年 7 月 24 日

相关推荐

  • k8s如何添加多个网站

    在Kubernetes(K8s)中添加多个网站的关键步骤包括创建多个部署和服务、配置Ingress资源、使用命名空间进行隔离。其中,配置Ingress资源是至关重要的一步,通过配置…

    2024 年 7 月 26 日
    0
  • k8s中如何查看dns信息

    在Kubernetes(k8s)中查看DNS信息可以通过以下几种方式:使用kubectl命令查看kube-dns/coredns日志、通过kubectl exec命令进入Pod查看…

    2024 年 7 月 26 日
    0
  • k8s应用如何获取集群信息

    K8s应用获取集群信息的方法有多种:通过Kubernetes API、使用kubectl命令行工具、配置文件和环境变量。其中,通过Kubernetes API获取信息最为常见,因为…

    2024 年 7 月 26 日
    0
  • 如何从rancher导出k8s配置

    要从Rancher导出Kubernetes配置,可以通过使用Rancher UI导出、使用kubectl命令行工具导出、使用Rancher API导出三种主要方式实现。使用Ranc…

    2024 年 7 月 26 日
    0
  • k8s一台服务器怎么搭建

    要在一台服务器上搭建Kubernetes (K8s),需要完成以下几步:安装Docker、配置Kubernetes仓库、安装Kubeadm、Kubelet和Kubectl、初始化K…

    2024 年 7 月 26 日
    0
  • k8s怎么保证容器重启数据不丢失

    在Kubernetes(K8s)环境中,保证容器重启数据不丢失的核心措施有:使用持久卷(Persistent Volume, PV)、配置持久卷声明(Persistent Volu…

    2024 年 7 月 26 日
    0
  • k8s怎么设置双向认证

    K8s可以通过配置API Server和集群节点的证书及密钥来实现双向认证,这包括生成和配置客户端证书、配置API Server以信任这些证书、在kubelet和kubectl中配…

    2024 年 7 月 26 日
    0
  • 企业k8s怎么管理的

    企业Kubernetes(K8s)管理的核心在于自动化、可扩展性、安全性、监控和日志管理。其中,自动化是实现高效管理的关键。通过自动化工具和脚本,企业可以大大简化Kubernete…

    2024 年 7 月 26 日
    0
  • k8s怎么启动容器

    要在Kubernetes(k8s)中启动容器,可以通过创建Pod、Deployment、Service等资源对象来实现,这些资源对象通过YAML文件进行定义,并使用kubectl命…

    2024 年 7 月 26 日
    0
  • 如何向k8s集群提交作业

    要向Kubernetes集群提交作业,可以通过kubectl命令、配置YAML文件、以及使用Helm或Operator等工具。 通过kubectl命令可以直接与K8s API交互,…

    2024 年 7 月 26 日
    0

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

GitLab下载安装
联系站长
联系站长
分享本页
返回顶部