Kubernetes Nginx Ingress 安装与使用
2019独角兽企业重金招聘Python工程师标准>>>
Kubernetes Nginx Ingress 安装与使用 博客分类: Kubernetes
目录 (Table of Contents)
[TOCM]
- 概述
- 下载搭建环境所需要的镜像
- 配置default-http-bankend
- 配置inrgess-controller
- 配置需要测试的service
- 配置ingress
- 问题集
概述
用过kubernetes的人都知道,kubernetes的service的网络类型有三种:cluertip,nodeport,loadbanlance,各种类型的作用就不在这里描述了。如果一个service想向外部暴露服务,有nodeport和loadbanlance类型,但是nodeport类型,你的知道service对应的pod所在的node的ip,而loadbanlance通常需要第三方云服务商提供支持。如果没有第三方服务商服务的就没办法做了。除此之外还有很多其他的替代方式,以下我主要讲解的是通过ingress的方式来实现service的对外服务的暴露。
下载搭建环境所需要的镜像
- gcr.io/google_containers/nginx-ingress-controller:0.8.3 (ingress controller 的镜像)
- gcr.io/google_containers/defaultbackend:1.0 (默认路由的servcie的镜像)
- gcr.io/google_containers/echoserver:1.0 (用于测试ingress的service镜像,当然这个你可以换成你自己的service都可以)
说明:由于GFW的原因下载不下来的,都可以到时速云去下载相应的镜像(只要把grc.io
换成index.tenxcloud.com
就可以了),由于我用的是自己私用镜像仓库,所以之后看到的镜像都是我自己tag之后上传到自己私有镜像仓库的。
配置default-http-bankend
首先便捷default-http-backend.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: default-http-backend
spec:replicas: 1selector:app: default-http-backendtemplate:metadata:labels:app: default-http-backendspec:terminationGracePeriodSeconds: 60containers:- name: default-http-backend# Any image is permissable as long as:# 1. It serves a 404 page at /# 2. It serves 200 on a /healthz endpointimage: hub.yfcloud.io/google_containers/defaultbackend:1.0livenessProbe:httpGet:path: /healthzport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 5ports:- containerPort: 8080resources:limits:cpu: 10mmemory: 20Mirequests:cpu: 10mmemory: 20Mi
然后创建创建default-http-backend的rc:
kubectl create -f default-http-backend .yaml
最后创建default-http-backend的service,有两种方式创建,一种是:便捷default-http-backend-service.yaml,另一种通过如下命令创建:
kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
最后查看相应的rc以及service是否成功创建:然后自己测试能否正常访问,访问方式如下,直接通过的pod的ip/healthz或者serive的ip/(如果是srevice的ip加port)
配置inrgess-controller
首先编辑ingress-controller.yaml文件:
apiVersion: v1
kind: ReplicationController
metadata:name: nginx-ingress-controllerlabels:k8s-app: nginx-ingress-lb
spec:replicas: 1selector:k8s-app: nginx-ingress-lbtemplate:metadata:labels:k8s-app: nginx-ingress-lbname: nginx-ingress-lbspec:terminationGracePeriodSeconds: 60containers:- image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3name: nginx-ingress-lbimagePullPolicy: AlwaysreadinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1# use downward APIenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080ports:- containerPort: 80hostPort: 80- containerPort: 443hostPort: 443args:- /nginx-ingress-controller- --default-backend-service=$(POD_NAMESPACE)/default-http-backendimagePullSecrets:- name: hub.yfcloud.io.key
创建ingress-controller的rc:
kubectl create -f ingress-controller.yaml
最后验证ingress-controller是否正常启动成功,方法 如下:查看ingress-controller中对应pod的ip,然后通过ip:80/healthz 访问,成功的话会返回 ok。
配置需要测试的service
首先编辑测试用的test.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: echoheaders
spec:replicas: 1template:metadata:labels:app: echoheadersspec:containers:- name: echoheadersimage: hub.yfcloud.io/google_containers/echoserver:testports:- containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-defaultlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30302targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-x.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-xlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30301targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-y.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-ylabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30284targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: echomap
spec:rules:- host: foo.bar.comhttp:paths:- path: /foobackend:serviceName: echoheaders-xservicePort: 80- host: bar.baz.comhttp:paths:- path: /barbackend:serviceName: echoheaders-yservicePort: 80- path: /foobackend:serviceName: echoheaders-xservicePort: 80
最后测试,测试方法有两种,如下:
方法一:
curl -v http://nodeip:80/foo -H 'host: foo.bar.com'
结果如下:
* About to connect() to 183.131.19.232 port 80 (#0)
* Trying 183.131.19.232...
* Connected to 183.131.19.232 (183.131.19.232) port 80 (#0)
> GET /foo HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> host: foo.bar.com
>
< HTTP/1.1 200 OK
< Server: nginx/1.11.3
< Date: Wed, 12 Oct 2016 10:04:40 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
<
CLIENT VALUES:
client_address=('10.1.58.3', 57364) (10.1.58.3)
command=GET
path=/foo
real path=/foo
query=
request_version=HTTP/1.1SERVER VALUES:
server_version=BaseHTTP/0.6
sys_version=Python/3.5.0
protocol_version=HTTP/1.0HEADERS RECEIVED:
Accept=*/*
Connection=close
Host=foo.bar.com
User-Agent=curl/7.29.0
X-Forwarded-For=183.131.19.231
X-Forwarded-Host=foo.bar.com
X-Forwarded-Port=80
X-Forwarded-Proto=http
X-Real-IP=183.131.19.231
* Connection #0 to host 183.131.19.232 left intact
其他路由的测试修改对应的url即可。
**注意:**nodeip是你的ingress-controller所对应的pod所在的node的ip。
方法二:
将访问url的主机的host中加上:
nodeip foo.bar.com
nodeip bar.baz.com
在浏览器中直接访问:
foo.bar.com/foo
bar.baz.com/bar
bar.baz.com/foo
都是可以的。
问题集
在创建ingress-controller的时候报错(ingress的yaml文件是官网中的yaml文件配置,我只改了相对应的镜像。):
问题一:
以上错误信息是ingress-controller创建失败的原因,通过docker log 查看rc中的对应的ingress-controller的容器的日志。
原因:从错误信息来看是因为ingress内部程序默认是通过localhost:8080连接master的apiserver,如果是单机版的k8s环境,就不会报这个错,如果是集群环境,并且你的ingress-controller的pod所对应的容器不是在master节点上(因为有的集群环境master也是node,这样的话,如果你的pod对应的容器在master节点上也不会报这个错),就会报这个错。
解决方法:在ingress-controller.yaml中加上如下参数,
- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080
之后的yaml文件就是如前面定义的yaml文件。
问题二:
这个问题是在创建ingress rc成功之后,马上查看rc对应的pod对应的容器时报的错!
从这个问题衍生出个连带的问题,如下图:
问题1:
这个问题是在创建ingress rc成功之后,当第一个容器失败,rc的垃圾机制回收第一次创建停止的容器后,重新启动的容器。查看rc对应的pod对应的容器时报的错!
原因:因为ingress中的源码的健康检查的url改成了 /healthz,而官方文档中的yaml中定义的健康检查的路由是/ingress-controller-healthz,这个url是ingress的自检url,当超过8次之后如果得到结果还是unhealthy,则会挂掉ingress对应的容器。
解决方法:将yaml中的健康检查的url改成:/healthz即可。:
readinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1
目录 (Table of Contents)
[TOCM]
- 概述
- 下载搭建环境所需要的镜像
- 配置default-http-bankend
- 配置inrgess-controller
- 配置需要测试的service
- 配置ingress
- 问题集
概述
用过kubernetes的人都知道,kubernetes的service的网络类型有三种:cluertip,nodeport,loadbanlance,各种类型的作用就不在这里描述了。如果一个service想向外部暴露服务,有nodeport和loadbanlance类型,但是nodeport类型,你的知道service对应的pod所在的node的ip,而loadbanlance通常需要第三方云服务商提供支持。如果没有第三方服务商服务的就没办法做了。除此之外还有很多其他的替代方式,以下我主要讲解的是通过ingress的方式来实现service的对外服务的暴露。
下载搭建环境所需要的镜像
- gcr.io/google_containers/nginx-ingress-controller:0.8.3 (ingress controller 的镜像)
- gcr.io/google_containers/defaultbackend:1.0 (默认路由的servcie的镜像)
- gcr.io/google_containers/echoserver:1.0 (用于测试ingress的service镜像,当然这个你可以换成你自己的service都可以)
说明:由于GFW的原因下载不下来的,都可以到时速云去下载相应的镜像(只要把grc.io
换成index.tenxcloud.com
就可以了),由于我用的是自己私用镜像仓库,所以之后看到的镜像都是我自己tag之后上传到自己私有镜像仓库的。
配置default-http-bankend
首先便捷default-http-backend.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: default-http-backend
spec:replicas: 1selector:app: default-http-backendtemplate:metadata:labels:app: default-http-backendspec:terminationGracePeriodSeconds: 60containers:- name: default-http-backend# Any image is permissable as long as:# 1. It serves a 404 page at /# 2. It serves 200 on a /healthz endpointimage: hub.yfcloud.io/google_containers/defaultbackend:1.0livenessProbe:httpGet:path: /healthzport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 5ports:- containerPort: 8080resources:limits:cpu: 10mmemory: 20Mirequests:cpu: 10mmemory: 20Mi
然后创建创建default-http-backend的rc:
kubectl create -f default-http-backend .yaml
最后创建default-http-backend的service,有两种方式创建,一种是:便捷default-http-backend-service.yaml,另一种通过如下命令创建:
kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
最后查看相应的rc以及service是否成功创建:然后自己测试能否正常访问,访问方式如下,直接通过的pod的ip/healthz或者serive的ip/(如果是srevice的ip加port)
配置inrgess-controller
首先编辑ingress-controller.yaml文件:
apiVersion: v1
kind: ReplicationController
metadata:name: nginx-ingress-controllerlabels:k8s-app: nginx-ingress-lb
spec:replicas: 1selector:k8s-app: nginx-ingress-lbtemplate:metadata:labels:k8s-app: nginx-ingress-lbname: nginx-ingress-lbspec:terminationGracePeriodSeconds: 60containers:- image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3name: nginx-ingress-lbimagePullPolicy: AlwaysreadinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1# use downward APIenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080ports:- containerPort: 80hostPort: 80- containerPort: 443hostPort: 443args:- /nginx-ingress-controller- --default-backend-service=$(POD_NAMESPACE)/default-http-backendimagePullSecrets:- name: hub.yfcloud.io.key
创建ingress-controller的rc:
kubectl create -f ingress-controller.yaml
最后验证ingress-controller是否正常启动成功,方法 如下:查看ingress-controller中对应pod的ip,然后通过ip:80/healthz 访问,成功的话会返回 ok。
配置需要测试的service
首先编辑测试用的test.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: echoheaders
spec:replicas: 1template:metadata:labels:app: echoheadersspec:containers:- name: echoheadersimage: hub.yfcloud.io/google_containers/echoserver:testports:- containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-defaultlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30302targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-x.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-xlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30301targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-y.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-ylabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30284targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: echomap
spec:rules:- host: foo.bar.comhttp:paths:- path: /foobackend:serviceName: echoheaders-xservicePort: 80- host: bar.baz.comhttp:paths:- path: /barbackend:serviceName: echoheaders-yservicePort: 80- path: /foobackend:serviceName: echoheaders-xservicePort: 80
最后测试,测试方法有两种,如下:
方法一:
curl -v http://nodeip:80/foo -H 'host: foo.bar.com'
结果如下:
* About to connect() to 183.131.19.232 port 80 (#0)
* Trying 183.131.19.232...
* Connected to 183.131.19.232 (183.131.19.232) port 80 (#0)
> GET /foo HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> host: foo.bar.com
>
< HTTP/1.1 200 OK
< Server: nginx/1.11.3
< Date: Wed, 12 Oct 2016 10:04:40 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
<
CLIENT VALUES:
client_address=('10.1.58.3', 57364) (10.1.58.3)
command=GET
path=/foo
real path=/foo
query=
request_version=HTTP/1.1SERVER VALUES:
server_version=BaseHTTP/0.6
sys_version=Python/3.5.0
protocol_version=HTTP/1.0HEADERS RECEIVED:
Accept=*/*
Connection=close
Host=foo.bar.com
User-Agent=curl/7.29.0
X-Forwarded-For=183.131.19.231
X-Forwarded-Host=foo.bar.com
X-Forwarded-Port=80
X-Forwarded-Proto=http
X-Real-IP=183.131.19.231
* Connection #0 to host 183.131.19.232 left intact
其他路由的测试修改对应的url即可。
**注意:**nodeip是你的ingress-controller所对应的pod所在的node的ip。
方法二:
将访问url的主机的host中加上:
nodeip foo.bar.com
nodeip bar.baz.com
在浏览器中直接访问:
foo.bar.com/foo
bar.baz.com/bar
bar.baz.com/foo
都是可以的。
问题集
在创建ingress-controller的时候报错(ingress的yaml文件是官网中的yaml文件配置,我只改了相对应的镜像。):
问题一:
以上错误信息是ingress-controller创建失败的原因,通过docker log 查看rc中的对应的ingress-controller的容器的日志。
原因:从错误信息来看是因为ingress内部程序默认是通过localhost:8080连接master的apiserver,如果是单机版的k8s环境,就不会报这个错,如果是集群环境,并且你的ingress-controller的pod所对应的容器不是在master节点上(因为有的集群环境master也是node,这样的话,如果你的pod对应的容器在master节点上也不会报这个错),就会报这个错。
解决方法:在ingress-controller.yaml中加上如下参数,
- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080
之后的yaml文件就是如前面定义的yaml文件。
问题二:
这个问题是在创建ingress rc成功之后,马上查看rc对应的pod对应的容器时报的错!
从这个问题衍生出个连带的问题,如下图:
问题1:
这个问题是在创建ingress rc成功之后,当第一个容器失败,rc的垃圾机制回收第一次创建停止的容器后,重新启动的容器。查看rc对应的pod对应的容器时报的错!
原因:因为ingress中的源码的健康检查的url改成了 /healthz,而官方文档中的yaml中定义的健康检查的路由是/ingress-controller-healthz,这个url是ingress的自检url,当超过8次之后如果得到结果还是unhealthy,则会挂掉ingress对应的容器。
解决方法:将yaml中的健康检查的url改成:/healthz即可。:
readinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1
目录 (Table of Contents)
[TOCM]
- 概述
- 下载搭建环境所需要的镜像
- 配置default-http-bankend
- 配置inrgess-controller
- 配置需要测试的service
- 配置ingress
- 问题集
概述
用过kubernetes的人都知道,kubernetes的service的网络类型有三种:cluertip,nodeport,loadbanlance,各种类型的作用就不在这里描述了。如果一个service想向外部暴露服务,有nodeport和loadbanlance类型,但是nodeport类型,你的知道service对应的pod所在的node的ip,而loadbanlance通常需要第三方云服务商提供支持。如果没有第三方服务商服务的就没办法做了。除此之外还有很多其他的替代方式,以下我主要讲解的是通过ingress的方式来实现service的对外服务的暴露。
下载搭建环境所需要的镜像
- gcr.io/google_containers/nginx-ingress-controller:0.8.3 (ingress controller 的镜像)
- gcr.io/google_containers/defaultbackend:1.0 (默认路由的servcie的镜像)
- gcr.io/google_containers/echoserver:1.0 (用于测试ingress的service镜像,当然这个你可以换成你自己的service都可以)
说明:由于GFW的原因下载不下来的,都可以到时速云去下载相应的镜像(只要把grc.io
换成index.tenxcloud.com
就可以了),由于我用的是自己私用镜像仓库,所以之后看到的镜像都是我自己tag之后上传到自己私有镜像仓库的。
配置default-http-bankend
首先便捷default-http-backend.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: default-http-backend
spec:replicas: 1selector:app: default-http-backendtemplate:metadata:labels:app: default-http-backendspec:terminationGracePeriodSeconds: 60containers:- name: default-http-backend# Any image is permissable as long as:# 1. It serves a 404 page at /# 2. It serves 200 on a /healthz endpointimage: hub.yfcloud.io/google_containers/defaultbackend:1.0livenessProbe:httpGet:path: /healthzport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 5ports:- containerPort: 8080resources:limits:cpu: 10mmemory: 20Mirequests:cpu: 10mmemory: 20Mi
然后创建创建default-http-backend的rc:
kubectl create -f default-http-backend .yaml
最后创建default-http-backend的service,有两种方式创建,一种是:便捷default-http-backend-service.yaml,另一种通过如下命令创建:
kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
最后查看相应的rc以及service是否成功创建:然后自己测试能否正常访问,访问方式如下,直接通过的pod的ip/healthz或者serive的ip/(如果是srevice的ip加port)
配置inrgess-controller
首先编辑ingress-controller.yaml文件:
apiVersion: v1
kind: ReplicationController
metadata:name: nginx-ingress-controllerlabels:k8s-app: nginx-ingress-lb
spec:replicas: 1selector:k8s-app: nginx-ingress-lbtemplate:metadata:labels:k8s-app: nginx-ingress-lbname: nginx-ingress-lbspec:terminationGracePeriodSeconds: 60containers:- image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3name: nginx-ingress-lbimagePullPolicy: AlwaysreadinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1# use downward APIenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080ports:- containerPort: 80hostPort: 80- containerPort: 443hostPort: 443args:- /nginx-ingress-controller- --default-backend-service=$(POD_NAMESPACE)/default-http-backendimagePullSecrets:- name: hub.yfcloud.io.key
创建ingress-controller的rc:
kubectl create -f ingress-controller.yaml
最后验证ingress-controller是否正常启动成功,方法 如下:查看ingress-controller中对应pod的ip,然后通过ip:80/healthz 访问,成功的话会返回 ok。
配置需要测试的service
首先编辑测试用的test.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: echoheaders
spec:replicas: 1template:metadata:labels:app: echoheadersspec:containers:- name: echoheadersimage: hub.yfcloud.io/google_containers/echoserver:testports:- containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-defaultlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30302targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-x.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-xlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30301targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-y.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-ylabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30284targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: echomap
spec:rules:- host: foo.bar.comhttp:paths:- path: /foobackend:serviceName: echoheaders-xservicePort: 80- host: bar.baz.comhttp:paths:- path: /barbackend:serviceName: echoheaders-yservicePort: 80- path: /foobackend:serviceName: echoheaders-xservicePort: 80
最后测试,测试方法有两种,如下:
方法一:
curl -v http://nodeip:80/foo -H 'host: foo.bar.com'
结果如下:
* About to connect() to 183.131.19.232 port 80 (#0)
* Trying 183.131.19.232...
* Connected to 183.131.19.232 (183.131.19.232) port 80 (#0)
> GET /foo HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> host: foo.bar.com
>
< HTTP/1.1 200 OK
< Server: nginx/1.11.3
< Date: Wed, 12 Oct 2016 10:04:40 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
<
CLIENT VALUES:
client_address=('10.1.58.3', 57364) (10.1.58.3)
command=GET
path=/foo
real path=/foo
query=
request_version=HTTP/1.1SERVER VALUES:
server_version=BaseHTTP/0.6
sys_version=Python/3.5.0
protocol_version=HTTP/1.0HEADERS RECEIVED:
Accept=*/*
Connection=close
Host=foo.bar.com
User-Agent=curl/7.29.0
X-Forwarded-For=183.131.19.231
X-Forwarded-Host=foo.bar.com
X-Forwarded-Port=80
X-Forwarded-Proto=http
X-Real-IP=183.131.19.231
* Connection #0 to host 183.131.19.232 left intact
其他路由的测试修改对应的url即可。
**注意:**nodeip是你的ingress-controller所对应的pod所在的node的ip。
方法二:
将访问url的主机的host中加上:
nodeip foo.bar.com
nodeip bar.baz.com
在浏览器中直接访问:
foo.bar.com/foo
bar.baz.com/bar
bar.baz.com/foo
都是可以的。
问题集
在创建ingress-controller的时候报错(ingress的yaml文件是官网中的yaml文件配置,我只改了相对应的镜像。):
问题一:
以上错误信息是ingress-controller创建失败的原因,通过docker log 查看rc中的对应的ingress-controller的容器的日志。
原因:从错误信息来看是因为ingress内部程序默认是通过localhost:8080连接master的apiserver,如果是单机版的k8s环境,就不会报这个错,如果是集群环境,并且你的ingress-controller的pod所对应的容器不是在master节点上(因为有的集群环境master也是node,这样的话,如果你的pod对应的容器在master节点上也不会报这个错),就会报这个错。
解决方法:在ingress-controller.yaml中加上如下参数,
- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080
之后的yaml文件就是如前面定义的yaml文件。
问题二:
这个问题是在创建ingress rc成功之后,马上查看rc对应的pod对应的容器时报的错!
从这个问题衍生出个连带的问题,如下图:
问题1:
这个问题是在创建ingress rc成功之后,当第一个容器失败,rc的垃圾机制回收第一次创建停止的容器后,重新启动的容器。查看rc对应的pod对应的容器时报的错!
原因:因为ingress中的源码的健康检查的url改成了 /healthz,而官方文档中的yaml中定义的健康检查的路由是/ingress-controller-healthz,这个url是ingress的自检url,当超过8次之后如果得到结果还是unhealthy,则会挂掉ingress对应的容器。
解决方法:将yaml中的健康检查的url改成:/healthz即可。:
readinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1
目录 (Table of Contents)
[TOCM]
- 概述
- 下载搭建环境所需要的镜像
- 配置default-http-bankend
- 配置inrgess-controller
- 配置需要测试的service
- 配置ingress
- 问题集
概述
用过kubernetes的人都知道,kubernetes的service的网络类型有三种:cluertip,nodeport,loadbanlance,各种类型的作用就不在这里描述了。如果一个service想向外部暴露服务,有nodeport和loadbanlance类型,但是nodeport类型,你的知道service对应的pod所在的node的ip,而loadbanlance通常需要第三方云服务商提供支持。如果没有第三方服务商服务的就没办法做了。除此之外还有很多其他的替代方式,以下我主要讲解的是通过ingress的方式来实现service的对外服务的暴露。
下载搭建环境所需要的镜像
- gcr.io/google_containers/nginx-ingress-controller:0.8.3 (ingress controller 的镜像)
- gcr.io/google_containers/defaultbackend:1.0 (默认路由的servcie的镜像)
- gcr.io/google_containers/echoserver:1.0 (用于测试ingress的service镜像,当然这个你可以换成你自己的service都可以)
说明:由于GFW的原因下载不下来的,都可以到时速云去下载相应的镜像(只要把grc.io
换成index.tenxcloud.com
就可以了),由于我用的是自己私用镜像仓库,所以之后看到的镜像都是我自己tag之后上传到自己私有镜像仓库的。
配置default-http-bankend
首先便捷default-http-backend.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: default-http-backend
spec:replicas: 1selector:app: default-http-backendtemplate:metadata:labels:app: default-http-backendspec:terminationGracePeriodSeconds: 60containers:- name: default-http-backend# Any image is permissable as long as:# 1. It serves a 404 page at /# 2. It serves 200 on a /healthz endpointimage: hub.yfcloud.io/google_containers/defaultbackend:1.0livenessProbe:httpGet:path: /healthzport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 5ports:- containerPort: 8080resources:limits:cpu: 10mmemory: 20Mirequests:cpu: 10mmemory: 20Mi
然后创建创建default-http-backend的rc:
kubectl create -f default-http-backend .yaml
最后创建default-http-backend的service,有两种方式创建,一种是:便捷default-http-backend-service.yaml,另一种通过如下命令创建:
kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
最后查看相应的rc以及service是否成功创建:然后自己测试能否正常访问,访问方式如下,直接通过的pod的ip/healthz或者serive的ip/(如果是srevice的ip加port)
配置inrgess-controller
首先编辑ingress-controller.yaml文件:
apiVersion: v1
kind: ReplicationController
metadata:name: nginx-ingress-controllerlabels:k8s-app: nginx-ingress-lb
spec:replicas: 1selector:k8s-app: nginx-ingress-lbtemplate:metadata:labels:k8s-app: nginx-ingress-lbname: nginx-ingress-lbspec:terminationGracePeriodSeconds: 60containers:- image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3name: nginx-ingress-lbimagePullPolicy: AlwaysreadinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1# use downward APIenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080ports:- containerPort: 80hostPort: 80- containerPort: 443hostPort: 443args:- /nginx-ingress-controller- --default-backend-service=$(POD_NAMESPACE)/default-http-backendimagePullSecrets:- name: hub.yfcloud.io.key
创建ingress-controller的rc:
kubectl create -f ingress-controller.yaml
最后验证ingress-controller是否正常启动成功,方法 如下:查看ingress-controller中对应pod的ip,然后通过ip:80/healthz 访问,成功的话会返回 ok。
配置需要测试的service
首先编辑测试用的test.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: echoheaders
spec:replicas: 1template:metadata:labels:app: echoheadersspec:containers:- name: echoheadersimage: hub.yfcloud.io/google_containers/echoserver:testports:- containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-defaultlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30302targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-x.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-xlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30301targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-y.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-ylabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30284targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: echomap
spec:rules:- host: foo.bar.comhttp:paths:- path: /foobackend:serviceName: echoheaders-xservicePort: 80- host: bar.baz.comhttp:paths:- path: /barbackend:serviceName: echoheaders-yservicePort: 80- path: /foobackend:serviceName: echoheaders-xservicePort: 80
最后测试,测试方法有两种,如下:
方法一:
curl -v http://nodeip:80/foo -H 'host: foo.bar.com'
结果如下:
* About to connect() to 183.131.19.232 port 80 (#0)
* Trying 183.131.19.232...
* Connected to 183.131.19.232 (183.131.19.232) port 80 (#0)
> GET /foo HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> host: foo.bar.com
>
< HTTP/1.1 200 OK
< Server: nginx/1.11.3
< Date: Wed, 12 Oct 2016 10:04:40 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
<
CLIENT VALUES:
client_address=('10.1.58.3', 57364) (10.1.58.3)
command=GET
path=/foo
real path=/foo
query=
request_version=HTTP/1.1SERVER VALUES:
server_version=BaseHTTP/0.6
sys_version=Python/3.5.0
protocol_version=HTTP/1.0HEADERS RECEIVED:
Accept=*/*
Connection=close
Host=foo.bar.com
User-Agent=curl/7.29.0
X-Forwarded-For=183.131.19.231
X-Forwarded-Host=foo.bar.com
X-Forwarded-Port=80
X-Forwarded-Proto=http
X-Real-IP=183.131.19.231
* Connection #0 to host 183.131.19.232 left intact
其他路由的测试修改对应的url即可。
**注意:**nodeip是你的ingress-controller所对应的pod所在的node的ip。
方法二:
将访问url的主机的host中加上:
nodeip foo.bar.com
nodeip bar.baz.com
在浏览器中直接访问:
foo.bar.com/foo
bar.baz.com/bar
bar.baz.com/foo
都是可以的。
问题集
在创建ingress-controller的时候报错(ingress的yaml文件是官网中的yaml文件配置,我只改了相对应的镜像。):
问题一:
以上错误信息是ingress-controller创建失败的原因,通过docker log 查看rc中的对应的ingress-controller的容器的日志。
原因:从错误信息来看是因为ingress内部程序默认是通过localhost:8080连接master的apiserver,如果是单机版的k8s环境,就不会报这个错,如果是集群环境,并且你的ingress-controller的pod所对应的容器不是在master节点上(因为有的集群环境master也是node,这样的话,如果你的pod对应的容器在master节点上也不会报这个错),就会报这个错。
解决方法:在ingress-controller.yaml中加上如下参数,
- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080
之后的yaml文件就是如前面定义的yaml文件。
问题二:
这个问题是在创建ingress rc成功之后,马上查看rc对应的pod对应的容器时报的错!
从这个问题衍生出个连带的问题,如下图:
问题1:
这个问题是在创建ingress rc成功之后,当第一个容器失败,rc的垃圾机制回收第一次创建停止的容器后,重新启动的容器。查看rc对应的pod对应的容器时报的错!
原因:因为ingress中的源码的健康检查的url改成了 /healthz,而官方文档中的yaml中定义的健康检查的路由是/ingress-controller-healthz,这个url是ingress的自检url,当超过8次之后如果得到结果还是unhealthy,则会挂掉ingress对应的容器。
解决方法:将yaml中的健康检查的url改成:/healthz即可。:
readinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1
目录 (Table of Contents)
[TOCM]
- 概述
- 下载搭建环境所需要的镜像
- 配置default-http-bankend
- 配置inrgess-controller
- 配置需要测试的service
- 配置ingress
- 问题集
概述
用过kubernetes的人都知道,kubernetes的service的网络类型有三种:cluertip,nodeport,loadbanlance,各种类型的作用就不在这里描述了。如果一个service想向外部暴露服务,有nodeport和loadbanlance类型,但是nodeport类型,你的知道service对应的pod所在的node的ip,而loadbanlance通常需要第三方云服务商提供支持。如果没有第三方服务商服务的就没办法做了。除此之外还有很多其他的替代方式,以下我主要讲解的是通过ingress的方式来实现service的对外服务的暴露。
下载搭建环境所需要的镜像
- gcr.io/google_containers/nginx-ingress-controller:0.8.3 (ingress controller 的镜像)
- gcr.io/google_containers/defaultbackend:1.0 (默认路由的servcie的镜像)
- gcr.io/google_containers/echoserver:1.0 (用于测试ingress的service镜像,当然这个你可以换成你自己的service都可以)
说明:由于GFW的原因下载不下来的,都可以到时速云去下载相应的镜像(只要把grc.io
换成index.tenxcloud.com
就可以了),由于我用的是自己私用镜像仓库,所以之后看到的镜像都是我自己tag之后上传到自己私有镜像仓库的。
配置default-http-bankend
首先便捷default-http-backend.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: default-http-backend
spec:replicas: 1selector:app: default-http-backendtemplate:metadata:labels:app: default-http-backendspec:terminationGracePeriodSeconds: 60containers:- name: default-http-backend# Any image is permissable as long as:# 1. It serves a 404 page at /# 2. It serves 200 on a /healthz endpointimage: hub.yfcloud.io/google_containers/defaultbackend:1.0livenessProbe:httpGet:path: /healthzport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 5ports:- containerPort: 8080resources:limits:cpu: 10mmemory: 20Mirequests:cpu: 10mmemory: 20Mi
然后创建创建default-http-backend的rc:
kubectl create -f default-http-backend .yaml
最后创建default-http-backend的service,有两种方式创建,一种是:便捷default-http-backend-service.yaml,另一种通过如下命令创建:
kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
最后查看相应的rc以及service是否成功创建:然后自己测试能否正常访问,访问方式如下,直接通过的pod的ip/healthz或者serive的ip/(如果是srevice的ip加port)
配置inrgess-controller
首先编辑ingress-controller.yaml文件:
apiVersion: v1
kind: ReplicationController
metadata:name: nginx-ingress-controllerlabels:k8s-app: nginx-ingress-lb
spec:replicas: 1selector:k8s-app: nginx-ingress-lbtemplate:metadata:labels:k8s-app: nginx-ingress-lbname: nginx-ingress-lbspec:terminationGracePeriodSeconds: 60containers:- image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3name: nginx-ingress-lbimagePullPolicy: AlwaysreadinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1# use downward APIenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080ports:- containerPort: 80hostPort: 80- containerPort: 443hostPort: 443args:- /nginx-ingress-controller- --default-backend-service=$(POD_NAMESPACE)/default-http-backendimagePullSecrets:- name: hub.yfcloud.io.key
创建ingress-controller的rc:
kubectl create -f ingress-controller.yaml
最后验证ingress-controller是否正常启动成功,方法 如下:查看ingress-controller中对应pod的ip,然后通过ip:80/healthz 访问,成功的话会返回 ok。
配置需要测试的service
首先编辑测试用的test.yaml:
apiVersion: v1
kind: ReplicationController
metadata:name: echoheaders
spec:replicas: 1template:metadata:labels:app: echoheadersspec:containers:- name: echoheadersimage: hub.yfcloud.io/google_containers/echoserver:testports:- containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-defaultlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30302targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-x.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-xlabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30301targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
sv-alp-y.yaml:
apiVersion: v1
kind: Service
metadata:name: echoheaders-ylabels:app: echoheaders
spec:type: NodePortports:- port: 80nodePort: 30284targetPort: 8080protocol: TCPname: httpselector:app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: echomap
spec:rules:- host: foo.bar.comhttp:paths:- path: /foobackend:serviceName: echoheaders-xservicePort: 80- host: bar.baz.comhttp:paths:- path: /barbackend:serviceName: echoheaders-yservicePort: 80- path: /foobackend:serviceName: echoheaders-xservicePort: 80
最后测试,测试方法有两种,如下:
方法一:
curl -v http://nodeip:80/foo -H 'host: foo.bar.com'
结果如下:
* About to connect() to 183.131.19.232 port 80 (#0)
* Trying 183.131.19.232...
* Connected to 183.131.19.232 (183.131.19.232) port 80 (#0)
> GET /foo HTTP/1.1
> User-Agent: curl/7.29.0
> Accept: */*
> host: foo.bar.com
>
< HTTP/1.1 200 OK
< Server: nginx/1.11.3
< Date: Wed, 12 Oct 2016 10:04:40 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
<
CLIENT VALUES:
client_address=('10.1.58.3', 57364) (10.1.58.3)
command=GET
path=/foo
real path=/foo
query=
request_version=HTTP/1.1SERVER VALUES:
server_version=BaseHTTP/0.6
sys_version=Python/3.5.0
protocol_version=HTTP/1.0HEADERS RECEIVED:
Accept=*/*
Connection=close
Host=foo.bar.com
User-Agent=curl/7.29.0
X-Forwarded-For=183.131.19.231
X-Forwarded-Host=foo.bar.com
X-Forwarded-Port=80
X-Forwarded-Proto=http
X-Real-IP=183.131.19.231
* Connection #0 to host 183.131.19.232 left intact
其他路由的测试修改对应的url即可。
**注意:**nodeip是你的ingress-controller所对应的pod所在的node的ip。
方法二:
将访问url的主机的host中加上:
nodeip foo.bar.com
nodeip bar.baz.com
在浏览器中直接访问:
foo.bar.com/foo
bar.baz.com/bar
bar.baz.com/foo
都是可以的。
问题集
在创建ingress-controller的时候报错(ingress的yaml文件是官网中的yaml文件配置,我只改了相对应的镜像。):
问题一:
以上错误信息是ingress-controller创建失败的原因,通过docker log 查看rc中的对应的ingress-controller的容器的日志。
原因:从错误信息来看是因为ingress内部程序默认是通过localhost:8080连接master的apiserver,如果是单机版的k8s环境,就不会报这个错,如果是集群环境,并且你的ingress-controller的pod所对应的容器不是在master节点上(因为有的集群环境master也是node,这样的话,如果你的pod对应的容器在master节点上也不会报这个错),就会报这个错。
解决方法:在ingress-controller.yaml中加上如下参数,
- name: KUBERNETES_MASTERvalue: http://183.131.19.231:8080
之后的yaml文件就是如前面定义的yaml文件。
问题二:
这个问题是在创建ingress rc成功之后,马上查看rc对应的pod对应的容器时报的错!
从这个问题衍生出个连带的问题,如下图:
问题1:
这个问题是在创建ingress rc成功之后,当第一个容器失败,rc的垃圾机制回收第一次创建停止的容器后,重新启动的容器。查看rc对应的pod对应的容器时报的错!
原因:因为ingress中的源码的健康检查的url改成了 /healthz,而官方文档中的yaml中定义的健康检查的路由是/ingress-controller-healthz,这个url是ingress的自检url,当超过8次之后如果得到结果还是unhealthy,则会挂掉ingress对应的容器。
解决方法:将yaml中的健康检查的url改成:/healthz即可。:
readinessProbe:httpGet:path: /healthzport: 80scheme: HTTPlivenessProbe:httpGet:path: /healthzport: 80scheme: HTTPinitialDelaySeconds: 10timeoutSeconds: 1
http://blog.csdn.net/u013812710/article/details/52801656
转载于:https://my.oschina.net/xiaominmin/blog/1598617
Kubernetes Nginx Ingress 安装与使用相关推荐
- Kubernetes Nginx Ingress教程
最近发现好多人问Ingress,同时一直也没去用Nginx的Ingress,索性捣鼓一把,发现跟原来确实有了点变化,在这里写篇文章记录一下 一.Ingress介绍 Kubernetes暴露服务的方式目 ...
- Kubernetes使用Nginx Ingress暴露Dashboard
Kubernetes使用Nginx Ingress暴露Dashboard [TOC] 1. 环境说明 可用的kubernetes集群 可用的nginx ingress controller 可用的da ...
- 初试 Kubernetes 暴漏服务类型之 Nginx Ingress
目录 Ingress 介绍 环境.软件准备 部署 Default Backend 部署 Ingress Controller 部署 Ingress Name based virtual hosting ...
- Kubernetes暴漏服务类型之Nginx Ingress
Kubernetes暴漏服务类型之Nginx Ingress 一.Ingress 介绍 LoadBlancer Service NodePort Service 1.NodePort类型的服务 Ing ...
- 如何在Kubernetes 上部署安装PHP + Nginx 多容器应用
引言 Kubernetes是一个开源的容器编排系统.它允许你创建.更新和扩展容器,而无需担心停机. 要运行一个PHP应用程序,Nginx充当PHP-FPM的代理.将此设置打包到单个容器中可能是一个繁琐 ...
- k8s 使用Nginx Ingress实现灰度发布和蓝绿发布
**导语:**云原生最佳实践系列,涵盖了灰度发布.弹性伸缩.集群迁移.网络通信.应用容器化改造等等场景,针对各行业面临的应用现状,提出最佳解决方案,并提供详细操作指导,希望对您有所帮助. Ingres ...
- 12、Kubernetes核心技术Ingress
前言 原来我们需要将端口号对外暴露,通过 ip + 端口号就可以进行访问 原来是使用Service中的NodePort来实现 在每个节点上都会启动端口 在访问的时候通过任何节点,通过ip + 端口号就 ...
- Kubernetes 部署 Ingress 控制器 Traefik v1.7.4
标签: kubernetes ingress traefik nginx haproxy kong 介绍 Traefik Ingress 对象 上节课我们学习了在Kubernete ...
- Kubernetes 使用 ingress 配置 https 集群(十五)
目录 一.背景 1.1 需求 1.2 Ingress 1.3 环境介绍 二.安装部署 2.1.创建后端 Pod 应用 2.2 创建后端 Pod Service 2.3.创建 ingress 资源 2. ...
最新文章
- 正则式高人谈解答正则式的心得
- python五子棋人人对战_五子棋-人人对战
- jquery实现加载更多效果
- Lua 5.1 参考手册
- 【Java】6.4 final 修饰符
- 剑指Offer(Java版):数字在排序数组中出现的次数
- 谈SOA在国内推进状况
- 一亿小目标成就_成就卓越的一种方式:自我选择
- Scrapy - Request 和 Response(请求和响应)
- java简易记账软件_0006JavaSE简单的项目FamilyAccount家庭记账控制台应用程序
- 【kafka】Kafka常用JMX监控指标整理
- 练打字-测试看图说话(AD安装)
- Fiddler——模拟限速
- JS 逻辑中断(一)
- laravel学习笔记
- BetaFlight深入传感设计之二:Mag传感模块
- struts1.x 升级到struts2的几点问题
- python提取实部虚部_Python 复数数据类型详解(complex)[学习 Python 必备基础知识][看此一篇就够了]|python基础教程|python入门|python教程...
- Yate for mac(标记和管理音频文件工具)
- struts2 ajax json 中文乱码的问题