[ad_1]
入口 是 Kubernetes 中的重要概念之一,它允许外部用户使用 FQDN (完全限定域名)。 尽管在 Kubernetes 集群中默认未启用和安装 Ingress。 我们必须使用第三方入口控制器来实现这个核心概念,例如 nginx, 交通, 代理服务器 和 相同的 等等。
在本教程中,我们将演示如何在 Kubernetes 集群中设置和使用 NGINX Ingress 控制器。
如上图,外部用户通过 FQDN 使用 NGINX 入口控制器访问应用程序,内部入口控制器将请求路由到服务,然后服务将请求路由到后端端点或 pod。
在 Minikube 中启用 NGINX 入口控制器
Minikube 是一个单节点的 Kubernetes 集群,我们可以通过运行“在 minikube 中轻松启用 nginx 入口控制器”minikube 插件“ 命令。
运行以下命令以验证入口控制器的状态,
# minikube addons list
运行以下 minikube 命令以启用入口控制器,
[[email protected] ~]# minikube addons enable ingress * The 'ingress' addon is enabled [[email protected] ~]#
如果我们重新运行“minikube 插件列表”命令,这次一定要看到ingress的状态是启用的。
运行以下 kubectl 命令以验证入口控制器的 pod 是否正在运行。
[[email protected] ~]# kubectl get pods --all-namespaces | grep -i nginx-controller kube-system ingress-nginx-controller-7bb4c67d67-gkjj5 1/1 Running 0 20m [[email protected] ~]#
以上输出证实 nginx 控制器 已启用并成功启动其 pod 立方体系统 命名空间。
在 Kubernetes 集群中设置 NGINX Ingress Controller
笔记: 我假设 Kubernetes 集群已启动并正在运行。
转到主节点或控制平面节点并执行以下 kubectl 命令,
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
我们将得到以下输出,
运行以下 kubectl 命令以验证 nginx-ingress 控制器 pod 的状态,
[email protected]:~$ kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx NAME READY STATUS RESTARTS AGE ingress-nginx-admission-create-v7ftn 0/1 Completed 0 6m12s ingress-nginx-admission-patch-njdnf 0/1 Completed 0 6m12s ingress-nginx-controller-75f84dfcd7-p5dct 1/1 Running 0 6m23s [email protected]:~$
完美,上面的输出确认 NGINX Ingress Controller 已经成功部署并且它的 pod 当前正在运行。
测试入口控制器
为了测试 Ingress 控制器,我们将创建两个基于 httpd 和 nginx 容器的应用程序,并将通过它们各自的服务公开这些应用程序,然后将创建入口资源,允许外部用户使用他们各自的 url 访问这些应用程序。
部署基于 httpd 的部署及其服务,NodePort 类型监听端口 80,创建以下 yaml 文件,其中包括部署和服务部分,
[[email protected] ~]# vi httpd-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: httpd-deployment spec: replicas: 1 selector: matchLabels: run: httpd-deployment template: metadata: labels: run: httpd-deployment spec: containers: - image: httpd name: httpd-webserver --- apiVersion: v1 kind: Service metadata: name: httpd-service spec: type: NodePort selector: run: httpd-deployment ports: - port: 80
Save 和 close 文件。
运行 kubectl 命令以部署基于 httpd 的部署及其服务,
[[email protected] ~]# kubectl create -f httpd-deployment.yaml deployment.apps/httpd-deployment created service/httpd-service created [[email protected] ~]#
部署我们的下一个基于 NGINX 的部署及其服务,NodePort 作为其类型,端口为 80,下面列出了 yaml 文件的内容,
[[email protected] ~]# vi nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 1 selector: matchLabels: run: nginx-deployment template: metadata: labels: run: nginx-deployment spec: containers: - image: nginx name: nginx-webserver --- apiVersion: v1 kind: Service metadata: name: nginx-service spec: type: NodePort selector: run: nginx-deployment ports: - port: 80
Save 并退出文件
现在运行以下 kubectl 命令来部署基于 nginx 的部署及其服务,
[[email protected] ~]# kubectl create -f nginx-deployment.yaml deployment.apps/nginx-deployment created service/nginx-service created [[email protected] ~]#
运行以下命令以验证部署及其服务的状态
[[email protected] ~]# kubectl get deployments.apps httpd-deployment NAME READY UP-TO-DATE AVAILABLE AGE httpd-deployment 1/1 1 1 19m [[email protected] ~]# [[email protected] ~]# kubectl get deployments.apps nginx-deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 1/1 1 1 24m [[email protected] ~]# [[email protected] ~]# kubectl get service nginx-service httpd-service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-service NodePort 10.103.75.91 <none> 80:30042/TCP 78m httpd-service NodePort 10.98.6.131 <none> 80:31770/TCP 73m [[email protected] ~]#
创建和部署入口资源
创建以下入口资源 yaml 文件,它将请求路由到基于相应服务的 url 或路径。 在我们的示例中,我们使用 url 或 fqdn。
[[email protected] ~]# vim myweb-ingress.yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: name-based-virtualhost-ingress spec: rules: - host: httpd.example.com http: paths: - backend: serviceName: httpd-service servicePort: 80 - host: nginx.example.com http: paths: - backend: serviceName: nginx-service servicePort: 80
保存并 close 文件。
在 kubectl 命令下执行以创建上面的入口资源,
[[email protected] ~]# kubectl create -f myweb-ingress.yaml ingress.networking.k8s.io/name-based-virtualhost-ingress created [[email protected] ~]#
运行以下以验证上面创建的入口资源的状态
[[email protected] ~]# kubectl get ingress name-based-virtualhost-ingress [[email protected] ~]# kubectl describe ingress name-based-virtualhost-ingress
完美,以上输出确认已成功创建入口资源。
在从集群外部访问这些 url 之前,请确保在您打算访问这些 URL 的系统的主机文件中添加以下条目。
192.168.1.190 httpd.example.com 192.168.1.190 nginx.example.com
现在尝试从 Web 浏览器访问这些 URL,键入
https://httpd.example.com
https://nginx.example.com
太好了,上面确认我们已经在 Kubernetes 中成功部署和设置了 nginx 入口控制器。 请分享您宝贵的反馈和意见。
[ad_2]