Yiner

Mar 24, 2022

安装&使用nginx ingress

 
 
 

使用场景

  • 由于平台需要让用户发布算法,并通过指定的url访问,但是为了不暴露过多的服务器端口,所以通过ingress来根据路径进行请求转发,找到指定的算法。
  • 发布一个算法具体需要创建对应的pod+service+ingress三个资源。

安装helm

helm介绍

Helm 是一个用于对需要在 k8s 上部署的复杂应用进行定义、安装和更新。Helm 以 Char 的方式对应用软件进行描述,可以方便地创建、版本化、共享和发布复杂的应用软件。

helm的主要概念

  • Chart
    • Helm的应用包,采用tgz格式。类似于 Yum 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件,也称为应用 Chart。
  • Repoistory
    • Helm 的应用仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 应用包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询,Helm可以同时管理多个不同的Repository。
      Helm社区官方提供了stable和incubator仓库,但Helm社区没有打算独占仓库,而是允许其他人和组织也可以搭建仓库。仓库可以是公共仓库,也可以是私有仓库。
  • Release
    • 在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 Release。例如一个 MySQL Chart,如果想在服务器上运行两个 MySQL 数据库,就可以把这个 Chart 安装两次。每次安装都会生成一个新的Release。

安装helm

 

chart包的目录结构

chart 是 Helm 的应用打包格式。chart 由一系列文件组成,这些文件描述了 Kubernetes 部署应用时所需要的资源。上面通过 helm 命令创建了一个 chart 包,目录结构说明如下:
  • helm-test:是 chart 包的名称
  • charts 目录: 保存依赖文件的目录,如果依赖其他的 chart,则会保存在这里
  • Chart.yaml 文件:用于描述 chart 信息的 yaml 文件,如版本信息等
  • values.yaml 文件:chart 支持在安装的时根据参数进行定制化配置,而 values.yaml 则提供了这些配置参数的默认值,可以在安装前根据需要修改 values.yaml 的参数。
  • templates 目录:各类 Kubernetes 资源的配置模板都放置在这里。Helm 会将 values.yaml 中的参数值注入到模板中生成标准的 YAML 配置文件
 

helm安装ingress

添加 ingress-nginx 官方helm仓库

 

下载ingress-nginx的chart包

 

修改 values.yaml 文件

下载下来的 chart 包,需要修改一下资源清单配置文件,修改 values.yaml 文件如下:
修改后的 value.yaml 全文
 
具体修改的内容有:
  • 修改镜像仓库地址为docker.io/willdockerhub/ingress-nginx-controller,注释掉digest
  • hostNetwork 的值为 true
  • dnsPolicy的值改为: ClusterFirstWithHostNet
  • nodeSelector 添加标签: ingress: "true",用于部署 ingress-controller 到指定节点
  • kind类型更改为:DaemonSet
  • kube-webhook-certgen的镜像地址改为国内仓库地址 registry.aliyuncs.com/google_containers/kube-webhook-certgen,标签修改,注释掉digest
 

安装ingress-nginx

💡
新版ingress引入webhook,直接安装可能会报错:Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.,通过设置配置禁止webhook组件。
 
安装成功,会打印以下信息:
 

设置标签&检查

安装完成后,需要给节点打上刚刚设置的标签ingress=true,让 Pod 调度到指定的节点,比如调度到 master 节点:
 
执行完成之后,就可以看到 ingress-nginx 部署到了master节点了:
 
💡
通过的信息看到:PORT(S)的Http部分——80:32080/TCP,表示来自集群任意物理机器32080端口的请求,会转发10.105.126.148:80(CLUSTER-IP:port)上。
 
Pod也是部署在了master节点:
💡
ingress-nginx-controller通过在pod中创建一个nginx应用来起作用。
 

测试 ingress-nginx

创建后端的 nginx 的 Pod 和 Service

创建后端的 nginx 的 Pod 和 Service,ingress-demo.yaml:
 
查看 Pod 和 Service:
 

创建 ingress 规则

💡
一条ingress规则,会自动在ingress-nginx-controller所在的pod中的nginx应用的nginx.conf配置中生成一个location配置项。
创建 ingress 规则,ingress-nginx.yaml
创建ingress:
 

访问服务

在客户端机器上通过curl ip:32080即可访问对应服务。其中ip为集群任意机器ip。
💡
原理如下:ip:32080 → 转到service/ingress-nginx-controller,发现路径为"/",符合example这条ingress规则,此时请求应转发到svc-demo这个服务的31081端口,这个服务端口又对应着pod的80端口,所以最后显示出以下内容。
通过打印信息可以看到已经成功通过ingress将请求转发到后端Pod上了:

Copyright © 2025 Yiner

logo