公网访问Kubernetes(k8s)运行的服务可以通过以下几种方式:使用Service类型为LoadBalancer、通过Ingress资源、使用NodePort服务、配置外部DNS解析。 其中,使用Service类型为LoadBalancer 是最为常用和高效的方法。它通过自动配置一个云提供商的负载均衡器,将外部流量引导到k8s集群内的服务上。这种方法无需手动配置复杂的网络和防火墙规则,简化了公网访问的流程。下面将详细介绍这些方法的具体操作步骤和注意事项。
一、使用Service类型为LoadBalancer
使用Service类型为LoadBalancer 是公网访问Kubernetes服务的最简单和常用方法之一。LoadBalancer服务类型会自动配置一个云提供商的负载均衡器,将外部流量引导到k8s集群内的服务上。此方法适用于所有主要的云提供商,如AWS、GCP和Azure。
- 创建LoadBalancer服务:
首先,确保你的k8s集群运行在支持LoadBalancer的云环境中。创建一个LoadBalancer类型的Service,示例如下:
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
-
验证LoadBalancer的IP:
部署完成后,使用
kubectl get svc my-loadbalancer-service
命令获取分配的外部IP地址。这个IP地址就是外部用户访问服务的入口。 -
配置防火墙规则:
确保云提供商的防火墙规则允许外部流量访问LoadBalancer分配的IP地址和端口。
二、使用Ingress资源
使用Ingress资源 是另一种常见的公网访问方式,尤其适用于需要基于HTTP/HTTPS协议的流量管理。Ingress控制器可以处理域名解析、路径路由和SSL终止等复杂需求。
- 部署Ingress控制器:
在k8s集群中部署一个Ingress控制器,如Nginx Ingress Controller、Traefik等。可以使用Helm Chart进行快速部署:
helm install nginx-ingress stable/nginx-ingress
- 定义Ingress资源:
创建一个Ingress资源来配置域名和路径路由规则:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
-
配置DNS解析:
将域名
example.com
解析到Ingress控制器的外部IP地址,确保用户可以通过域名访问服务。 -
配置SSL证书:
为确保数据传输安全,可以配置SSL证书。使用Cert-Manager自动管理和颁发SSL证书:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: example-com
spec:
secretName: example-com-tls
dnsNames:
- example.com
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
三、使用NodePort服务
使用NodePort服务 是一种最简单但不推荐的公网访问方法,适用于测试或小规模应用。NodePort服务会在每个k8s节点上打开一个特定端口,并将外部流量路由到内部服务。
- 创建NodePort服务:
定义一个NodePort类型的Service,示例如下:
apiVersion: v1
kind: Service
metadata:
name: my-nodeport-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
nodePort: 30007
type: NodePort
-
获取节点IP地址:
使用
kubectl get nodes -o wide
命令获取所有节点的外部IP地址。NodePort服务会在这些IP地址上的指定端口(如30007)开放访问。 -
配置防火墙规则:
确保云提供商的防火墙规则允许外部流量访问所有节点的指定端口。
四、配置外部DNS解析
配置外部DNS解析 是确保用户能够通过域名访问k8s服务的重要步骤。DNS解析将域名映射到服务的外部IP地址或负载均衡器地址。
-
获取外部IP地址:
根据前面提到的方法获取LoadBalancer、Ingress或NodePort服务的外部IP地址。
-
配置DNS记录:
在你的DNS提供商处添加一个A记录或CNAME记录,将域名指向获取的外部IP地址。例如,在AWS Route 53中添加A记录:
example.com. 300 IN A 203.0.113.1
-
验证DNS解析:
使用
nslookup example.com
或dig example.com
命令验证DNS解析是否正确。 -
配置SSL证书:
为确保数据传输安全,可以在DNS解析完成后配置SSL证书,使用Cert-Manager自动管理和颁发SSL证书。
五、使用反向代理
使用反向代理 是另一种灵活且强大的公网访问方法。反向代理服务器(如Nginx、HAProxy)可以处理负载均衡、SSL终止和路径路由等功能。
- 部署反向代理服务器:
在k8s集群外部或内部部署一个反向代理服务器。可以使用Nginx作为反向代理示例:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://my-service:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
-
配置DNS解析:
将域名解析到反向代理服务器的外部IP地址。
-
配置SSL证书:
在反向代理服务器上配置SSL证书,确保数据传输安全。可以使用Certbot获取免费的SSL证书:
certbot --nginx -d example.com
六、使用云提供商特定服务
使用云提供商特定服务 是一种高度集成且方便的公网访问方法。各大云提供商(如AWS、GCP、Azure)提供了专门的服务来简化k8s的公网访问。
- AWS ELB:
使用AWS的Elastic Load Balancer(ELB)来管理公网访问。创建一个ELB并将其配置为指向k8s集群的服务。
aws elb create-load-balancer --load-balancer-name my-loadbalancer --listeners "Protocol=HTTP,LoadBalancerPort=80,InstanceProtocol=HTTP,InstancePort=80" --subnets subnet-12345678
- GCP GKE Ingress:
使用GCP的GKE Ingress来管理公网访问。在GKE集群中创建一个Ingress资源,并配置GCP的负载均衡器。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.global-static-ip-name: "my-static-ip"
spec:
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-service
port:
number: 80
- Azure AKS Load Balancer:
使用Azure的AKS Load Balancer来管理公网访问。在AKS集群中创建一个LoadBalancer类型的Service,并配置Azure的负载均衡器。
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
type: LoadBalancer
七、使用服务网格
使用服务网格 是一种现代化的微服务管理方法。服务网格(如Istio、Linkerd)可以提供高级的流量管理、安全和监控功能。
- 部署服务网格:
在k8s集群中部署服务网格,如Istio。可以使用Helm Chart进行快速部署:
helm install istio-base istio/base -n istio-system
helm install istiod istio/istiod -n istio-system
- 配置Ingress Gateway:
创建一个Ingress Gateway来管理外部流量入口:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "example.com"
- 配置VirtualService:
定义一个VirtualService来配置流量路由规则:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: my-virtualservice
spec:
hosts:
- "example.com"
gateways:
- my-gateway
http:
- match:
- uri:
prefix: "/"
route:
- destination:
host: my-service
port:
number: 80
- 配置DNS解析和SSL证书:
将域名解析到Ingress Gateway的外部IP地址,并配置SSL证书以确保数据传输安全。
这些方法各有优劣,选择哪种方法取决于具体的应用场景和需求。通过合理配置和优化,可以确保Kubernetes服务在公网环境下的高效、安全访问。
相关问答FAQs:
如何通过公网访问运行在Kubernetes (k8s) 上的服务?
Kubernetes 是一个强大的容器编排平台,广泛应用于云计算和微服务架构中。许多企业和开发者在使用 Kubernetes 部署应用时,常常需要通过公网访问这些服务。访问 Kubernetes 服务的方式主要有以下几种。
-
使用 LoadBalancer 类型的服务:
在云环境中,Kubernetes 支持创建 LoadBalancer 类型的服务。这种类型的服务会自动向云服务提供商请求一个外部负载均衡器,负载均衡器会将流量转发到集群中的 Pod。通过这种方式,用户可以使用分配给负载均衡器的公共 IP 地址直接访问运行在 Kubernetes 上的服务。-
如何创建 LoadBalancer 服务?
在 Kubernetes 中创建 LoadBalancer 服务非常简单。只需在服务的 YAML 文件中将type
设置为LoadBalancer
,然后使用kubectl apply
命令应用该配置。例如:apiVersion: v1 kind: Service metadata: name: my-service spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: my-app
通过上述配置,Kubernetes 将会为
my-service
创建一个负载均衡器,并将流量转发至my-app
的 Pod。
-
-
使用 NodePort 类型的服务:
NodePort 是 Kubernetes 中另一种常用的服务类型。它为每个 Node 分配一个端口号,用户可以通过 Node 的 IP 地址和指定的 NodePort 访问服务。-
如何创建 NodePort 服务?
和 LoadBalancer 类型类似,只需在服务的 YAML 文件中将type
设置为NodePort
。以下是一个示例:apiVersion: v1 kind: Service metadata: name: my-nodeport-service spec: type: NodePort ports: - port: 80 targetPort: 8080 nodePort: 30000 selector: app: my-app
在这个例子中,用户可以通过集群中任意一个 Node 的 IP 地址和端口 30000 访问服务。需要注意的是,NodePort 的端口范围通常在 30000 到 32767 之间。
-
-
使用 Ingress Controller:
对于复杂的应用场景,Ingress 是一种更为灵活的解决方案。Ingress 允许用户通过一个单一的入口点(通常是一个负载均衡器)来管理和路由外部流量到集群内的多个服务。Ingress Controller 是实现 Ingress 资源的核心组件。-
如何设置 Ingress?
需要先部署一个 Ingress Controller,如 Nginx 或 Traefik,然后创建 Ingress 资源配置流量路由。以下是一个简单的 Ingress 配置示例: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
在这个例子中,所有到达
myapp.example.com
的请求都会被路由到my-service
服务。
-
通过以上几种方式,可以很方便地通过公网访问 Kubernetes 上运行的服务。选择最合适的方式取决于实际需求、集群环境及流量管理策略。
在使用 Kubernetes 进行公网访问时,有哪些安全策略需要注意?
在公网访问 Kubernetes 服务时,安全性是一个重要的考量因素。以下是一些建议的安全策略:
- 使用 HTTPS: 确保通过 HTTPS 访问服务,以加密传输的数据,防止中间人攻击。
- 配置网络策略: Kubernetes 的网络策略可以帮助控制 Pod 之间的通信,确保只有授权的流量能够访问特定服务。
- 使用 API 访问控制: 利用 Kubernetes 的角色和权限控制(RBAC)来限制用户和服务的访问权限。
- 定期审计和监控: 通过日志和监控工具定期审计访问情况,及时发现并处理潜在的安全威胁。
如何处理外部服务的访问限制?
在某些情况下,外部服务可能会限制对 Kubernetes 服务的访问,比如基于 IP 白名单或其他安全策略。以下是一些应对策略:
- 使用 VPN: 通过虚拟专用网络(VPN)连接到 Kubernetes 集群,确保安全访问。
- 配置 API 网关: 使用 API 网关对外部流量进行管理和控制,提供额外的安全层。
- 动态 IP 管理: 如果外部服务支持动态 IP 添加,可以通过脚本或工具自动更新白名单。
关于 GitLab 的更多内容,可以查看官网文档:
官网地址: https://gitlab.cn
文档地址: https://docs.gitlab.cn
论坛地址: https://forum.gitlab.cn
原创文章,作者:jihu002,如若转载,请注明出处:https://devops.gitlab.cn/archives/48098