K8S利用Nginx-Ingress配置对外访问

#kubernetes

K8S 使用kubeadm 安装,版本为v1.14.3 环境介绍: 使用ingress转发请求至对应服务的pod上,对外提供统一的访问地址,

部署Ingress前,K8S集群需要有部署Ingress Controller,可以参考[[Kubernetes/K8S的Nginx-Ingress-Controller|Nginx Ingress Controller]]来部署

创建对外访问ingress示例

test-k8s-ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress	# 名称必须
  namespace: kube-system	# 命名空间必须跟关联的服务为同一空间,不然无法访问到被代理的服务
  annotations: 
	nginx.ingress.kubernetes.io/rewrite-target: "/"	# 配置/path/这类URL需要开启rewriter重定向,不然无法访问/path/这类URL
spec:
  rules:
  - host: n.testnginx.com	# 对外提供访问的域名,留空则可以通过ingress-controller所在的NODE_IP来访问
	http: 
	  paths:
	  - path: /             # 定义不同的URL
		backend:
		  serviceName: test-k8s	# 服务名称
		  servicePort: 80

	  - path: /api/
		backend:
		  serviceName: api-test-k8s
		  servicePort: 8080

	host: www.abc.com       # 定义不同的域名
	http:
	  paths:
	  - path: /
		backend:
		  serviceName: www-k8s
		  servicePort: 80
	host:        # 不使用域名,可以直接使用任意ingress controller节点所在IP进行访问,不过默认禁用http,强制使用https访问。
	http:
	  paths:
	  - path: /
		backend:
		  serviceName: www-k8s-aaa
		  servicePort: 80

启动

使用SSL证书

也可以使用cert-manager等工具实现自动颁发证书

编辑对外访问ingress配置

domain-ingress.yaml

通过Ingress访问非K8S集群资源

有时为了控制服务访问统一的入口,会希望一些并非部署在K8S集群中的服务也通过Ingress来控制访问域名,也方便于利用cert-manager等工具对访问域名进行HTTPS配置、管理。

Ingress转发非集群内域名

正常情况下,Ingress中service字段处只能配置集群内部的资源,但可以通过Service的外部服务名称(ExternalName Service)功能来实现,它可以用来将内部服务名映射到外部域名上。你可以创建一个 ExternalName Service,将其 spec.type 设置为 ExternalName,并在 spec.externalName 中指定外部域名。

限制: 在 Kubernetes 中,ExternalName 类型的 Service 是用来将集群内部的服务名称映射到外部的 DNS 名称的。ExternalName Service 的 spec.externalName 字段只接受一个 DNS 名称,不能包含端口或协议。ExternalName Service 的配置只能指定一个域名,不能包括端口号或协议(如 http:// 或 https://)。

Ingress转发非集群内IP资源

如果一个非集群的内部服务映射到一个外部 IP 地址进行访问,可以使用 Endpoints 资源加Service资源实现Ingress转发。

单个服务、单个端口配置

多个服务、多个端口配置

最后更新于