0%

Nginx-ingress controller部署

Ingress 是从Kubernetes集群外部访问集群内部服务的入口

https://docs.jdcloud.com/cn/jcs-for-kubernetes/deploy-ingress-nginx-controller

Ingress 是从Kubernetes集群外部访问集群内部服务的入口,概念示意可参考下方说明。你可以给Ingress配置提供外部可访问的URL、负载均衡、SSL、基于名称的虚拟主机等。用户通过POST Ingress资源到API server的方式来请求ingress。

1
2
3
4
5
internet
|
[ Ingress ]
--|-----|--
[ Services ]

Ingress controller负责实现Ingress。Ingress controller在Kubernetes集群中默认不会自动启用,您可以在一个pod中部署任意类型的自定义Ingress Controller。本文将以Nginx-ingress controller为例,说明Controller部署和Ingress定义。更多外部类型的Ingresss Controller参考Kubernetes官方文档

环境准备

  1. 从github下载nginx-ingress controller最新的安装部署文件,并将部署文件解压缩到本地目录:
    1
    2
    3
    4
    wget https://github.com/nginxinc/kubernetes-ingress/archive/v1.4.5.tar.gz

    tar -zxvf v1.4.5.tar.gz

    说明:本文说明在1.12.3版本的集群上如何部署nginx-ingress controller,如集群版本不同,选择其他适合的ginx-ingress controller安装部署文件。

  2. 进入解压缩后的nginx-ingress controller安装目录;
    1
    cd kubernetes-ingress-1.4.5/deployments

安装nginx-ingress controller

  1. 为nginx-ingress controller创建一个namespace和service account:
    1
    kubectl apply -f common/ns-and-sa.yaml
  2. 为NGINX默认Server配置TLS证书和key,并将TLS证书和key保存到secret中:
    1
    kubectl apply -f common/default-server-secret.yaml

    说明:建议使用合适的TLS证书和key替换default-server-secret.yaml文件中自签发的证书和key。

  3. 创建config map保存NGINX的自定义配置:
    1
    kubectl apply -f common/nginx-config.yaml

    说明:目前提供的config map中的data为空,您可以按需添加自定义配置。

  4. 为第1步中创建的service account配置RBAC:
    1
    kubectl apply -f rbac/rbac.yaml
  5. 以Deployment的方式部署nginx-ingress controller:
    1
    kubectl apply -f deployment/nginx-ingress.yaml
  6. 执行如下命令,确定部署nginx-ingress controller的Deployment运行正常:
    1
    2
    3
    4
     kubectl get deployment -n nginx-ingress

    NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
    nginx-ingress 1 1 1 1 24d
  7. 创建ingress的LoadBalance

    在 Kubernetes集群中,每个Pod都具有唯一的内部 IP 地址,但是Deployment中的Pod随时可能被删除或创建,导致Pod IP地址不断变化。因此需要创建一个Service对外暴露Pod中的应用。Service具有唯一的固定IP地址且能够为后端添加的成员Pod提供负载均衡。在京东云Kubernetes集群中您可以使用LoadBalance类型的Service,为Service关联创建一个应用负载均衡,并通过负载均衡绑定的公网IP,将Service后端关联的nginx-ingress controller应用暴露到公网:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-ingress #建议Service使用与nginx-ingress controller对应的Deployment名称相同的名称
    namespace: nginx-ingress
    spec:
    type: LoadBalancer
    ports:
    - port: 80
    targetPort: 80
    protocol: TCP
    name: http
    - port: 443
    targetPort: 443
    protocol: TCP
    name: https
    selector:
    app: nginx-ingress

    说明:本例使用80和443端口绑定nginx-ingress controller应用

    将上述Service定义到ingress.yaml文件,执行如下命令创建对应的Service:

    1
    kubectl create -f ingress.yaml
  8. 获取公网IP

    等待一段时间,确定Service已经配置完成,并获取Service上配置的External IP字段

    1
    2
    3
    4
    kubectl get svc -n nginx-ingress

    NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    nginx-ingress LoadBalancer 192.168.58.218 114.67.80.218 80:32436/TCP,443:30110/TCP 3h13m

    说明:Service的External IP将作为nginx-ingress controller的VIP,为集群中使用nginx-ingress controller的Ingress提供公网访问入口

  9. 关联的External IP作为公网入口IP

    最后,在Ingress controller的Deployment部署文件nginx-ingress.yaml中增加一对环境变量”-args -external-service=nginx-ingress”,配置Ingress controller使用Service名称关联的External IP作为公网入口IP:

    1
    2
    3
    4
    args:
    - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
    - -default-server-tls-secret=$(POD_NAMESPACE)/default-server-secret
    - -external-service=nginx-ingress #新增内容
    1
    kubectl apply -f deployment/nginx-ingress.yaml        #重新部署nginx-ingress controller
  10. 验证Pod

    执行如下命令确定nginx-ingress controller相关的Pod运行正常,即可完成nginx ingress controller部署:

    1
    2
    3
    4
    5
    kubectl get pod -n nginx-ingress

    NAME READY STATUS RESTARTS AGE
    nginx-ingress-f67b87b88-5cspd 1/1 Running 0 3h11m
    nginx-ingress-f67b87b88-n7qnw 1/1 Running 0 3h13m

示例应用

例如:配置www2.veer.com的ingress配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: cms-veer # 变量:名字
namespace: default
spec:
rules:
- host: www2.veer.com # 变量:url
http:
paths:
- backend:
serviceName: node-vcg-veer-pre # 变量:后端应用service
servicePort: 80 # 变量:后端应用service端口
path: /
tls:
- hosts:
- www2.veer.com
secretName: veer-https # 变量:ssl证书