nginx 统一入口
绝大多数Kubernetes集群用于托管容器,以处理从微服务到完整Web应用程序的传入请求。 将这些传入请求传入一个中央位置,然后通过Kubernetes中的服务分发出去,这是配置集群的最安全方法。 该中央入口点是入口控制器。
NGINX是用作私有托管的Kubernetes集群的入口控制器的最常见产品。 NGINX具有企业所需的大多数功能,无论Kubernetes运行在哪个云,虚拟化平台或Linux操作系统上,NGINX都将用作Kubernetes的入口控制器。
第一步
将NGINX用作Platform9管理的Kubernetes集群上的Ingress控制器的第一步是拥有一个正在运行的Kubernetes集群。
在这种情况下,我们将使用的群集称为“入测试”,并被列为健康。 它是在Ubuntu 16.04服务器上运行的单节点群集。
% ssh root@64.227 .56 .189
Welcome to Ubuntu 16.04 .6 LTS (GNU/Linux 4.4 .0 -173 -generic x86_64)
root@pmkft:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
64.227 .56 .189 Ready master 10 h v1 .14 .8
root@pmkft:~# kubectl get namespaces
NAME STATUS AGE
default Active 11 h
kube-node-lease Active 11 h
kube-public Active 11 h
kube-system Active 11 h
运行“ kubectl获取节点”和“ kubectl获取名称空间”可确认身份验证正在运行,集群节点已准备就绪且未配置NGINX Ingress控制器。
NGINX入口控制器的强制性组件
入口控制器是Kubernetes的核心组件,因此它不仅需要配置Pod和路由,还需要配置集群中更多的移动部件。
对于NGINX,其推荐的配置包含三个ConfigMap:
基本部署TCP配置UDP配置
用于运行服务的服务帐户位于群集中,并且将为该服务帐户分配几个角色。
群集角色已分配给服务帐户,从而允许它获取,列出和读取所有服务和事件的配置。 如果要有多个入口控制器,则可能会受到限制。 但是在大多数情况下,这太过分了。
为服务帐户分配了特定于名称空间的角色,以读取和更新NGINX Ingress控制器自己的配置所特有的所有ConfigMap和其他项。
最后一部分是将Pod实际部署到其自己的名称空间中,以便轻松地为安全性和资源配额划定边界。
部署指定将引用哪些ConfigMap,将使用的容器映像和命令行以及有关如何运行实际NGINX Ingress控制器的所有其他特定信息。
NGINX在GitHub中维护了一个文件,该文件从Kubernetes文档链接到Kubernetes文档 ,该文件在YAML中详细说明了所有配置并准备部署。
要应用此配置,要运行的命令是:
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.28.0/deploy/static/mandatory.yaml
这将生成以下输出:
namespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.apps/nginx-ingress-controller created
limitrange/ingress-nginx created
公开NGINX入口控制器
一旦基本配置到位,下一步就是将NGINX入口控制器暴露给外界,使其能够开始接收连接。 这可以通过类似AWS,GCP或Azure上的负载平衡器进行。 在您自己的基础架构或功能较少的云提供商上进行部署时,另一个选择是使用NodePort创建服务以允许访问Ingress Controller。
使用位于GitHub上的NGINX提供的service-nodeport.yaml文件,可以定义在端口80和443上运行的服务。可以像以前一样使用单个命令行来应用它。
root@pmkft:~# kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.28.0/deploy/static/provider/baremetal/service-nodeport.yaml
service/ingress-nginx created
验证NGINX入口控制器
最后一步是确保Ingress控制器正在运行。
root@pmkft:~# kubectl get pods --all-namespaces -l app.kubernetes.io/name=ingress-nginx
NAMESPACE NAME READY STATUS RESTARTS AGE
ingress-nginx nginx-ingress-controller-6 c7686c6b4-stnq7 1 / 1 Running 0 6 m36s
root@pmkft:~# kubectl get services ingress-nginx --namespace=ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.21 .83 .193 <none> 80 : 30757 /TCP, 443 : 31353 /TCP 34 m
通过头盔安装
Platform9支持helm3,并且可供使用该方法进行部署的任何人使用,该方法通常更易于管理。
要使用Helm安装NGINX Ingress控制器 ,请使用图表sttable / nginx-ingress(可在官方存储库中找到)。 要以发布名称ingress-nginx安装图表:helm install stable / nginx-ingress --name ingress-nginx
如果kubernetes集群启用了RBAC,则运行:helm install stable / nginx-ingress --name ingress-nginx --set rbac.create = true
使用NGINX入口控制器公开服务
现在,集群中正在运行入口控制器,您将需要创建使用主机,URI映射或什至两者都利用它的服务。
通过使用“ Ingress”类型的入口控制器的基于主机的服务映射的示例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-world
annotations:
kubernetes.io/ingress.class: ingress-nginx
spec:
rules:
- host: host1.domain.ext
http:
paths:
- backend:
serviceName: hello-world
servicePort:80
使用URI涉及相同的基本布局,但是在yaml文件的“路径”部分中指定了更多详细信息。 当需要TLS加密时,您将需要将证书作为密钥存储在Kubernetes中。 这可以手动完成,也可以使用诸如cert-manager之类的开源工具完成。 yaml文件需要一些额外的信息来启用TLS(在入口控制器中完成了从端口443到端口80的映射):
下一步
使用功能齐全的集群和入口控制器,甚至是单个节点,您都可以像在生产环境中一样开始构建和测试应用程序,并具有测试配置文件和应用程序流量路由的能力。 您只有一些容量限制,这些限制在真正的多节点群集上不会发生。
**请注意,我是Platform9的员工,团队成员对此指南做出了贡献**
翻译自: https://hackernoon.com/how-to-set-up-an-nginx-ingress-controller-on-pmkft-257u32o5
nginx 统一入口