内容简介:在 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 。
参考资料
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- RecyclerView使用指南(一)—— 基本使用
- 如何使用Meteorjs使用URL参数
- 使用 defer 还是不使用 defer?
- 使用 Typescript 加强 Vuex 使用体验
- [译] 何时使用 Rust?何时使用 Go?
- UDP协议的正确使用场合(谨慎使用)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。