在 AWS 使用 Kubernetes 的 Nginx Ingress

栏目: 编程工具 · 发布时间: 5年前

内容简介:在 AWS 推荐使用 kops 安装 Kubernetes 集群,具体可以参见这篇文章。接着,在 Kubernetes 集群安装 Nginx Ingress:上面的操作会为 Nginx Ingress 创建一个 ELB,这个 ELB 工作在 4 层,即监听 TCP 的 80 和 443 端口:Nginx Ingress 主要用来充当前端代理,它可以根据域名以及 URL 路径,将集群外部的流量路由到集群内部的 Service。下面部署一个简单的 Service:

在 AWS 推荐使用 kops 安装 Kubernetes 集群,具体可以参见这篇文章。接着,在 Kubernetes 集群安装 Nginx Ingress:

$ kubectl create -f https://raw.githubusercontent.com/kubernetes/kops/master/addons/ingress-nginx/v1.6.0.yaml

上面的操作会为 Nginx Ingress 创建一个 ELB,这个 ELB 工作在 4 层,即监听 TCP 的 80 和 443 端口:

$ kubectl get services ingress-nginx -n kube-ingress
NAME            TYPE           CLUSTER-IP       EXTERNAL-IP        PORT(S)                      AGE
ingress-nginx   LoadBalancer   100.64.216.197   a81aaecb30bea...   80:32128/TCP,443:31454/TCP   1m

前端代理

Nginx Ingress 主要用来充当前端代理,它可以根据域名以及 URL 路径,将集群外部的流量路由到集群内部的 Service。下面部署一个简单的 Service:

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/images/echoheaders/echo-app.yaml

接着,为这个 Service 创建一个 Ingress 配置:

$ cat echoheaders-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echoheaders
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: echoheaders.umlife.net
    http:
      paths:
      - path: /
        backend:
          serviceName: echoheaders
          servicePort: 80
$ kubectl apply -f echoheaders-ingress.yaml

可以查看这个 Ingress 对应的 ELB 地址:

$ kubectl get ing -o wide
NAME          HOSTS                     ADDRESS                                                                      PORTS     AGE
echoheaders   echoheaders.umlife.net    a81aaecb30bea11e8a3ea0295ea9b1d4-315454571.cn-north-1.elb.amazonaws.com.cn   80        6m

可以使用下面的命令检验 Ingress 是否正常工作:

$ curl -H "Host: echoheaders.umlife.net" http://a81aaecb30bea11e8a3ea0295ea9b1d4-315454571.cn-north-1.elb.amazonaws.com.cn

使用 Let’s Encrypt 和 kube-lego 配置 HTTPS 证书

可以使用 kube-lego 自动创建和更新 Let’s Encrypt 的证书,下面是 kube-lego 的安装步骤:

$ kubectl apply -f https://raw.githubusercontent.com/jetstack/kube-lego/master/examples/nginx/lego/00-namespace.yaml
$ kubectl apply -f https://raw.githubusercontent.com/jetstack/kube-lego/master/examples/nginx/lego/configmap.yaml
$ kubectl apply -f https://raw.githubusercontent.com/jetstack/kube-lego/master/examples/nginx/lego/service-account.yaml
$ kubectl apply -f https://raw.githubusercontent.com/jetstack/kube-lego/master/examples/nginx/lego/cluster-role.yaml
$ kubectl apply -f https://raw.githubusercontent.com/jetstack/kube-lego/master/examples/nginx/lego/cluster-role-binding.yaml
$ kubectl apply -f https://raw.githubusercontent.com/jetstack/kube-lego/master/examples/nginx/lego/deployment.yaml

在 DNS 服务器增加一条 CNAME 记录,将 echoheaders.umlife.net 解析到 ELB 的地址。接着,修改 Ingress 的配置,让 kube-lego 自动生成证书,并且在证书过期时,能够自动更新证书:

$ cat echoheaders-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echoheaders
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - echoheaders.umlife.net
    secretName: echoheaders-tls
  rules:
  - host: echoheaders.umlife.net
    http:
      paths:
      - path: /
        backend:
          serviceName: echoheaders
          servicePort: 80
$ kubectl apply -f echoheaders-ingress.yaml

在浏览器访问 echoheaders.umlife.net ,就可以看到已经配置好 HTTPS 证书了。

配置 HTTP 基本认证

在配置 HTTP 认证之前,需要生成 htpasswd 文件:

$ htpasswd -bc auth my-name my-password

接着,创建一个 Secret 配置:

$ kubectl create secret generic my-basic-auth --from-file=auth

最后,修改 Ingress 的配置:

$ cat echoheaders-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echoheaders
  annotations:
    kubernetes.io/tls-acme: "true"
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/ssl-redirect: "true"
    ingress.kubernetes.io/auth-type: basic
    ingress.kubernetes.io/auth-secret: my-basic-auth
spec:
  tls:
  - hosts:
    - echoheaders.umlife.net
    secretName: echoheaders-tls
  rules:
  - host: echoheaders.umlife.net
    http:
      paths:
      - path: /
        backend:
          serviceName: echoheaders
          servicePort: 80
$ kubectl apply -f echoheaders-ingress.yaml

在浏览器打开 echoheaders.umlife.net ,输入认证信息之后,就可以访问页面了。

手动配置 HTTPS 证书

除了使用 Let’s Encrypt 自动生成证书之外,还可以手动配置 HTTPS 证书。下面的命令创建一个 Secret 配置,用来存储证书:

$ kubectl create secret tls umlife.net-tls --key STAR_umlife_net.key --cert STAR_umlife_net.full.crt

修改 Ingress 的配置,让它使用我们自己提供的证书:

$ cat echoheaders-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echoheaders
  annotations:
    kubernetes.io/ingress.class: "nginx"
    ingress.kubernetes.io/ssl-redirect: "true"
    ingress.kubernetes.io/auth-type: basic
    ingress.kubernetes.io/auth-secret: my-basic-auth
spec:
  tls:
  - hosts:
    - echoheaders.umlife.net
    secretName: umlife.net-tls
  rules:
  - host: echoheaders.umlife.net
    http:
      paths:
      - path: /
        backend:
          serviceName: echoheaders
          servicePort: 80
$ kubectl apply -f echoheaders-ingress.yaml

使用 OpenTracing 追踪调用链

借助 OpenTracing,我们可以从一个完整调用链中,分析出是哪个环节耗时最长。首先需要安装 Zipkin:

$ kubectl create -f https://raw.githubusercontent.com/rnburn/zipkin-date-server/master/kubernetes/zipkin.yaml

默认情况下,Nginx Ingress 没有开启 OpenTracing 的功能,我们可以修改 Ingress 的配置,开启 OpenTracing 功能:

$ cat ingress-nginx-conf.yaml
apiVersion: v1
data:
  use-proxy-protocol: "true"
  enable-opentracing: "true"
  zipkin-collector-host: zipkin.default.svc.cluster.local
kind: ConfigMap
metadata:
  labels:
    k8s-addon: ingress-nginx.addons.k8s.io
  name: ingress-nginx
  namespace: kube-ingress
$ kubectl replace -f ingress-nginx-conf.yaml

最后,为 Zipkin 创建一个 Ingress 配置:

$ cat zipkin-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: zipkin
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: zipkin.umlife.net
    http:
      paths:
      - path: /
        backend:
          serviceName: zipkin
          servicePort: 9411
$ kubectl apply -f zipkin-ingress.yaml

在 DNS 服务器增加 CNAME 记录,将 zipkin.umlife.net 解析到 Nginx Ingress 的 ELB 地址,就可以通过浏览器访问 Zipkin 了。

上面的配置 只会 让 Nginx Ingress 上报数据给 Zipkin,如果 Upstream Service 也需要上报数据给 Zipkin,那么需要在代码中增加数据上报功能。例如在 Golang 程序中上报数据给 Zipkin,可以参考这个程序 zipkin-date-server

参考资料


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Lighttpd源码分析

Lighttpd源码分析

高群凯 / 机械工业出版社 / 2010-3 / 59.00元

本书主要针对lighttpd源码进行了深度剖析。主要内容包括:lighttpd介绍与分析准备工作、lighttpd网络服务主模型、lighttpd数据结构、伸展树、日志系统、文件状态缓存器、配置信息加载、i/o多路复用技术模型、插件链、网络请求服务响应流程、请求响应数据快速传输方式,以及基本插件模块。本书针对的lighttpd项目版本为稳定版本1.4.20。 本书适合使用lighttpd的人......一起来看看 《Lighttpd源码分析》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

SHA 加密
SHA 加密

SHA 加密工具