如何在 Kubernetes 中设置 NGINX 入口控制器

[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]

Related Posts