安装Nginx ingress

Nginx ingress 使用ConfigMap来管理Nginx配置,nginx是大家熟知的代理和负载均衡软件,比起Traefik来说功能更加强大.

我们使用helm来部署,chart保存在私有的仓库中,请确保您已经安装和配置好helm,helm安装使用见使用Helm管理kubernetes应用

镜像准备

安装时需要用到的镜像有:

  • sophos/nginx-vts-exporter:v0.6
  • gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.15
  • gcr.io/google_containers/defaultbackend:1.3

gcr.io中的那个两个镜像我复制了一份到时速云,可供大家下载:

  • index.tenxcloud.com/jimmy/defaultbackend:1.3
  • index.tenxcloud.com/jimmy/nginx-ingress-controller:0.9.0-beta.15

Docker hub上的那个镜像可以直接下载,所有的安装时需要的配置保存在../manifests/nginx-ingress目录下。

步骤详解

安装nginx-ingress chart到本地repo中

修改values.yaml配置,启用RBAC支持,相关配置见nginx-ingress chart

helm package .

查看niginx-ingress

$ helm search nginx-ingress
NAME                    VERSION    DESCRIPTION
local/nginx-ingress     0.8.9      An nginx Ingress controller that uses ConfigMap...
stable/nginx-ingress    0.8.9      An nginx Ingress controller that uses ConfigMap...
stable/nginx-lego       0.3.0      Chart for nginx-ingress-controller and kube-lego

使用helm部署nginx-ingress

$ helm install --name nginx-ingress local/nginx-ingress
NAME:   nginx-ingress
LAST DEPLOYED: Fri Oct 27 18:26:58 2017
NAMESPACE: default
STATUS: DEPLOYED

RESOURCES:
==> rbac.authorization.k8s.io/v1beta1/Role
NAME                         KIND
nginx-ingress-nginx-ingress  Role.v1beta1.rbac.authorization.k8s.io

==> rbac.authorization.k8s.io/v1beta1/RoleBinding
nginx-ingress-nginx-ingress  RoleBinding.v1beta1.rbac.authorization.k8s.io

==> v1/Service
NAME                                         CLUSTER-IP      EXTERNAL-IP  PORT(S)                     AGE
nginx-ingress-nginx-ingress-controller       10.254.100.108  <nodes>      80:30484/TCP,443:31053/TCP  1s
nginx-ingress-nginx-ingress-default-backend  10.254.58.156   <none>       80/TCP                      1s

==> extensions/v1beta1/Deployment
NAME                                         DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
nginx-ingress-nginx-ingress-default-backend  1        1        1           0          1s
nginx-ingress-nginx-ingress-controller       1        1        1           0          1s

==> v1/ConfigMap
NAME                                    DATA  AGE
nginx-ingress-nginx-ingress-controller  1     1s

==> v1/ServiceAccount
NAME                         SECRETS  AGE
nginx-ingress-nginx-ingress  1        1s

==> rbac.authorization.k8s.io/v1beta1/ClusterRole
NAME                         KIND
nginx-ingress-nginx-ingress  ClusterRole.v1beta1.rbac.authorization.k8s.io

==> rbac.authorization.k8s.io/v1beta1/ClusterRoleBinding
nginx-ingress-nginx-ingress  ClusterRoleBinding.v1beta1.rbac.authorization.k8s.io


NOTES:
The nginx-ingress controller has been installed.
Get the application URL by running these commands:
  export HTTP_NODE_PORT=$(kubectl --namespace default get services -o jsonpath="{.spec.ports[0].nodePort}" nginx-ingress-nginx-ingress-controller)
  export HTTPS_NODE_PORT=$(kubectl --namespace default get services -o jsonpath="{.spec.ports[1].nodePort}" nginx-ingress-nginx-ingress-controller)
  export NODE_IP=$(kubectl --namespace default get nodes -o jsonpath="{.items[0].status.addresses[1].address}")

  echo "Visit http://$NODE_IP:$HTTP_NODE_PORT to access your application via HTTP."
  echo "Visit https://$NODE_IP:$HTTPS_NODE_PORT to access your application via HTTPS."

An example Ingress that makes use of the controller:

  apiVersion: extensions/v1beta1
  kind: Ingress
  metadata:
    annotations:
      kubernetes.io/ingress.class: nginx
    name: example
    namespace: foo
  spec:
    rules:
      - host: www.example.com
        http:
          paths:
            - backend:
                serviceName: exampleService
                servicePort: 80
              path: /
    # This section is only required if TLS is to be enabled for the Ingress
    tls:
        - hosts:
            - www.example.com
          secretName: example-tls

If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:

  apiVersion: v1
  kind: Secret
  metadata:
    name: example-tls
    namespace: foo
  data:
    tls.crt: <base64 encoded cert>
    tls.key: <base64 encoded key>
  type: kubernetes.io/tls

访问Nginx

首先获取Nginx的地址,从我们使用helm安装nginx-ingress命令的输出中那个可以看到提示,根据提示执行可以看到nginx的http和https地址:

  export HTTP_NODE_PORT=$(kubectl --namespace default get services -o jsonpath="{.spec.ports[0].nodePort}" nginx-ingress-nginx-ingress-controller)
  export HTTPS_NODE_PORT=$(kubectl --namespace default get services -o jsonpath="{.spec.ports[1].nodePort}" nginx-ingress-nginx-ingress-controller)
  export NODE_IP=$(kubectl --namespace default get nodes -o jsonpath="{.items[0].status.addresses[1].address}")

  echo "Visit http://$NODE_IP:$HTTP_NODE_PORT to access your application via HTTP."
  echo "Visit https://$NODE_IP:$HTTPS_NODE_PORT to access your application via HTTPS."
  Visit http://172.20.0.113:30484 to access your application via HTTP.
  Visit https://172.20.0.113:31053 to access your application via HTTPS.

我们分别在http和https地址上测试一下:

  • /healthz返回200
  • /返回404错误
curl -v http://172.20.0.113:30484/healthz
# 返回200
curl -v http://172.20.0.113:30484/
# 返回404
curl -v --insecure http://172.20.0.113:30484/healthz
# 返回200
curl -v --insecure http://172.20.0.113:30484/
# 返回404

删除nginx-ingress

helm delete --purge nginx-ingress

使用--purge参数可以彻底删除release不留下记录,否则下一次部署的时候不能使用重名的release。

参考

### Nginx Ingress Controller概述 Nginx Ingress Controller是一种用于Kubernetes集群中的入口控制器,其主要功能是在集群外部流量进入集群内部时提供路由管理。通过定义Ingress资源对象来描述HTTP(S)负载均衡器的行为模式以及如何将请求转发给后端服务[^1]。 ### 部署Nginx Ingress Controller #### 下载YAML文件 为了安装Nginx Ingress Controller,在官方文档或其他可靠源处获取最新的部署清单(manifests)。通常这些文件会打包成`.yaml`格式并命名为类似`nginx-ingress-controller.yaml`或`mandatory.yaml`的形式。 #### 修改Mandatory.Yaml文件 下载完成后可能需要根据实际环境调整部分参数设置,比如更改默认的Service Type为NodePort或者LoadBalancer;指定特定版本镜像等操作均在此阶段完成。 #### 给节点打标签 如果希望某些Pod仅调度到具有特殊硬件特性的机器上,则可以通过kubectl命令为那些目标主机添加相应的key-value对形式的label标记。 ```bash kubectl label nodes <node-name> ingress=true ``` #### 执行部署过程 当一切准备就绪之后就可以利用kubectl apply指令提交修改后的配置文件至API Server从而触发整个应用层面上的变化生效流程了: ```bash kubectl apply -f mandatory.yaml ``` ### 示例验证 #### 使用以下YAML文件部署Tomcat 创建一个新的命名空间以便更好地隔离测试项目,并引入一个简单的Web应用程序作为演示用途——这里选用Apache Tomcat为例说明具体步骤如下所示: ```yaml apiVersion: v1 kind: Namespace metadata: name: demo-space --- apiVersion: apps/v1 kind: Deployment metadata: labels: app: tomcat-sample-app name: tomcat-deployment namespace: demo-space spec: replicas: 2 selector: matchLabels: app: tomcat-sample-app template: metadata: labels: app: tomcat-sample-app spec: containers: - image: harbor.com/library/tomcat:latest name: tomcat-container ports: - containerPort: 8080 protocol: TCP --- apiVersion: v1 kind: Service metadata: labels: app: tomcat-sample-service name: tomcat-cluster-ip-svc namespace: demo-space spec: type: ClusterIP selector: app: tomcat-sample-app ports: - port: 8080 targetPort: 8080 protocol: TCP ``` #### 创建访问Tomcat服务的Ingress 接下来编写一段新的资源配置用来声明对外暴露路径规则及关联的服务名称/端口号信息等内容: ```yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: / name: example-ingress-tomcat namespace: demo-space spec: rules: - host: "tomcat.example.com" http: paths: - backend: serviceName: tomcat-cluster-ip-svc servicePort: 8080 path: /webapp ``` #### 访问Tomcat服务 最后一步就是确认所有组件都正常运行并且能够成功响应来自客户端发起的网络请求了。确保本地hosts文件已正确映射域名指向任一worker node IP地址即可尝试打开浏览器输入URL `http://tomcat.example.com/webapp` 进行浏览体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值