目录 (Table of Contents)
[TOCM]
概述
用过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: 1 selector: app: default-http-backend template: metadata: labels: app: default-http-backend spec: terminationGracePeriodSeconds: 60 containers: - 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 endpoint image: hub.yfcloud.io/google_containers/defaultbackend:1.0 livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 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-controller labels: k8s-app: nginx-ingress-lb spec: replicas: 1 selector: k8s-app: nginx-ingress-lb template: metadata: labels: k8s-app: nginx-ingress-lb name: nginx-ingress-lb spec: terminationGracePeriodSeconds: 60 containers: - image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3 name: nginx-ingress-lb imagePullPolicy: Always readinessProbe: httpGet: path: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1 # use downward API env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: KUBERNETES_MASTER value: http://183.131.19.231:8080 ports: - containerPort: 80 hostPort: 80 - containerPort: 443 hostPort: 443 args: - /nginx-ingress-controller - --default-backend-service=$(POD_NAMESPACE)/default-http-backend imagePullSecrets: - 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: 1 template: metadata: labels: app: echoheaders spec: containers: - name: echoheaders image: hub.yfcloud.io/google_containers/echoserver:test ports: - containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-default labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30302 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-x.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-x labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30301 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-y.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-y labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30284 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: echomap spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: echoheaders-x servicePort: 80 - host: bar.baz.com http: paths: - path: /bar backend: serviceName: echoheaders-y servicePort: 80 - path: /foo backend: serviceName: echoheaders-x servicePort: 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.1 SERVER VALUES: server_version=BaseHTTP/0.6 sys_version=Python/3.5.0 protocol_version=HTTP/1.0 HEADERS 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_MASTER value: 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: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1
目录 (Table of Contents)
[TOCM]
概述
用过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: 1 selector: app: default-http-backend template: metadata: labels: app: default-http-backend spec: terminationGracePeriodSeconds: 60 containers: - 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 endpoint image: hub.yfcloud.io/google_containers/defaultbackend:1.0 livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 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-controller labels: k8s-app: nginx-ingress-lb spec: replicas: 1 selector: k8s-app: nginx-ingress-lb template: metadata: labels: k8s-app: nginx-ingress-lb name: nginx-ingress-lb spec: terminationGracePeriodSeconds: 60 containers: - image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3 name: nginx-ingress-lb imagePullPolicy: Always readinessProbe: httpGet: path: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1 # use downward API env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: KUBERNETES_MASTER value: http://183.131.19.231:8080 ports: - containerPort: 80 hostPort: 80 - containerPort: 443 hostPort: 443 args: - /nginx-ingress-controller - --default-backend-service=$(POD_NAMESPACE)/default-http-backend imagePullSecrets: - 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: 1 template: metadata: labels: app: echoheaders spec: containers: - name: echoheaders image: hub.yfcloud.io/google_containers/echoserver:test ports: - containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-default labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30302 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-x.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-x labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30301 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-y.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-y labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30284 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: echomap spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: echoheaders-x servicePort: 80 - host: bar.baz.com http: paths: - path: /bar backend: serviceName: echoheaders-y servicePort: 80 - path: /foo backend: serviceName: echoheaders-x servicePort: 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.1 SERVER VALUES: server_version=BaseHTTP/0.6 sys_version=Python/3.5.0 protocol_version=HTTP/1.0 HEADERS 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_MASTER value: 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: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1
目录 (Table of Contents)
[TOCM]
概述
用过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: 1 selector: app: default-http-backend template: metadata: labels: app: default-http-backend spec: terminationGracePeriodSeconds: 60 containers: - 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 endpoint image: hub.yfcloud.io/google_containers/defaultbackend:1.0 livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 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-controller labels: k8s-app: nginx-ingress-lb spec: replicas: 1 selector: k8s-app: nginx-ingress-lb template: metadata: labels: k8s-app: nginx-ingress-lb name: nginx-ingress-lb spec: terminationGracePeriodSeconds: 60 containers: - image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3 name: nginx-ingress-lb imagePullPolicy: Always readinessProbe: httpGet: path: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1 # use downward API env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: KUBERNETES_MASTER value: http://183.131.19.231:8080 ports: - containerPort: 80 hostPort: 80 - containerPort: 443 hostPort: 443 args: - /nginx-ingress-controller - --default-backend-service=$(POD_NAMESPACE)/default-http-backend imagePullSecrets: - 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: 1 template: metadata: labels: app: echoheaders spec: containers: - name: echoheaders image: hub.yfcloud.io/google_containers/echoserver:test ports: - containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-default labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30302 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-x.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-x labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30301 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-y.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-y labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30284 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: echomap spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: echoheaders-x servicePort: 80 - host: bar.baz.com http: paths: - path: /bar backend: serviceName: echoheaders-y servicePort: 80 - path: /foo backend: serviceName: echoheaders-x servicePort: 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.1 SERVER VALUES: server_version=BaseHTTP/0.6 sys_version=Python/3.5.0 protocol_version=HTTP/1.0 HEADERS 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_MASTER value: 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: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1
目录 (Table of Contents)
[TOCM]
概述
用过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: 1 selector: app: default-http-backend template: metadata: labels: app: default-http-backend spec: terminationGracePeriodSeconds: 60 containers: - 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 endpoint image: hub.yfcloud.io/google_containers/defaultbackend:1.0 livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 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-controller labels: k8s-app: nginx-ingress-lb spec: replicas: 1 selector: k8s-app: nginx-ingress-lb template: metadata: labels: k8s-app: nginx-ingress-lb name: nginx-ingress-lb spec: terminationGracePeriodSeconds: 60 containers: - image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3 name: nginx-ingress-lb imagePullPolicy: Always readinessProbe: httpGet: path: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1 # use downward API env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: KUBERNETES_MASTER value: http://183.131.19.231:8080 ports: - containerPort: 80 hostPort: 80 - containerPort: 443 hostPort: 443 args: - /nginx-ingress-controller - --default-backend-service=$(POD_NAMESPACE)/default-http-backend imagePullSecrets: - 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: 1 template: metadata: labels: app: echoheaders spec: containers: - name: echoheaders image: hub.yfcloud.io/google_containers/echoserver:test ports: - containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-default labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30302 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-x.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-x labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30301 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-y.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-y labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30284 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: echomap spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: echoheaders-x servicePort: 80 - host: bar.baz.com http: paths: - path: /bar backend: serviceName: echoheaders-y servicePort: 80 - path: /foo backend: serviceName: echoheaders-x servicePort: 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.1 SERVER VALUES: server_version=BaseHTTP/0.6 sys_version=Python/3.5.0 protocol_version=HTTP/1.0 HEADERS 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_MASTER value: 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: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1
目录 (Table of Contents)
[TOCM]
概述
用过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: 1 selector: app: default-http-backend template: metadata: labels: app: default-http-backend spec: terminationGracePeriodSeconds: 60 containers: - 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 endpoint image: hub.yfcloud.io/google_containers/defaultbackend:1.0 livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 ports: - containerPort: 8080 resources: limits: cpu: 10m memory: 20Mi requests: cpu: 10m memory: 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-controller labels: k8s-app: nginx-ingress-lb spec: replicas: 1 selector: k8s-app: nginx-ingress-lb template: metadata: labels: k8s-app: nginx-ingress-lb name: nginx-ingress-lb spec: terminationGracePeriodSeconds: 60 containers: - image: hub.yfcloud.io/google_containers/nginx-ingress-controller:0.8.3 name: nginx-ingress-lb imagePullPolicy: Always readinessProbe: httpGet: path: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1 # use downward API env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: KUBERNETES_MASTER value: http://183.131.19.231:8080 ports: - containerPort: 80 hostPort: 80 - containerPort: 443 hostPort: 443 args: - /nginx-ingress-controller - --default-backend-service=$(POD_NAMESPACE)/default-http-backend imagePullSecrets: - 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: 1 template: metadata: labels: app: echoheaders spec: containers: - name: echoheaders image: hub.yfcloud.io/google_containers/echoserver:test ports: - containerPort: 8080
测试service的yaml这里创建多个:
sv-alp-default.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-default labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30302 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-x.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-x labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30301 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
sv-alp-y.yaml:
apiVersion: v1 kind: Service metadata: name: echoheaders-y labels: app: echoheaders spec: type: NodePort ports: - port: 80 nodePort: 30284 targetPort: 8080 protocol: TCP name: http selector: app: echoheaders
接着是
配置ingress
编辑ingress-alp.yaml:
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: echomap spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: echoheaders-x servicePort: 80 - host: bar.baz.com http: paths: - path: /bar backend: serviceName: echoheaders-y servicePort: 80 - path: /foo backend: serviceName: echoheaders-x servicePort: 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.1 SERVER VALUES: server_version=BaseHTTP/0.6 sys_version=Python/3.5.0 protocol_version=HTTP/1.0 HEADERS 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_MASTER value: 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: /healthz port: 80 scheme: HTTP livenessProbe: httpGet: path: /healthz port: 80 scheme: HTTP initialDelaySeconds: 10 timeoutSeconds: 1
http://blog.csdn.net/u013812710/article/details/52801656
相关推荐
kubernetes的quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0镜像包,版本为v0.20.0。文件先解压,之后得到nginx-ingress-controller.0.20.0.tar
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
因为网络原因不能下载quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0,可以使用这个镜像
3. **安装ingress-nginx**:使用Helm命令安装ingress-nginx图表,例如`helm install ingress-nginx ingress-nginx/ingress-nginx --version 4.0.17`。 4. **创建ingress资源**:编写ingress YAML文件,定义外部访问...
我们将从安装Nginx Ingress控制器作为舵图 由于最新的Kubernetes版本默认情况下启用了RBAC,因此我们需要在安装RBAC时牢记这一点。 您可以通过运行kubectl api-versions | grep rbac检查Kubernetes集群中是否启用了...
Kubernetes 1.19.4安装Nginx-Ingress-Controller全套资源 包含以下内容: deploy.yml jettech-kube-webhook-certgen-v1.5.0.tar k8s.gcr.io-ingress-nginx-controller-v0.41.2.tar nginx-1.19.5.tar
### 解决Kubernetes使用Helm安装Ingress的问题 #### Ingress Controller的重要性 Ingress是Kubernetes中的一个重要组件,主要用于管理外部访问集群内服务的规则,它充当了一个路由的角色,能够根据用户定义的规则将...
ingress-nginx 是 Kubernetes 的入口控制器,使用 NGINX 作为反向代理和负载均衡器。 它围绕 Kubernetes Ingress 资源构建,使用 ConfigMap 来存储 NGINX 配置。 这个 Ingress 控制器的目标是组装一个配置文件...
在Kubernetes环境中,Nginx Ingress Controller是一个关键组件,用于处理集群的外部访问路由,同时它也负责日志记录。日志对于监控、故障排查和审计至关重要。本篇文章将详细探讨Nginx Ingress Controller的日志持久...
本文将深入探讨 ingress-nginx 控制器的安装与使用,以及如何验证其配置是否生效。 首先,我们关注的是标题中的 "ingress-nginx-controller-1.9.yaml" 文件。这是一个用于部署 Nginx Ingress 控制器的 YAML 文件,...
:rocket: 参加我们的帮助改善NGINX Ingress Controller! :rocket: NGINX入口控制器 此存储库为NGINX和NGINX Plus提供了Ingress控制器的实现。 注意:该项目不同于库中的NGINX Ingress控制器。 请参阅以了解主要...
用于构建容器的资产,以向nginx-ingress Kubernetes Ingress控制器提供自定义默认后端 编辑错误页面 容器具有一组基于错误代码返回的错误HTML和JSON文件。 这些文件存储在www/目录中,并复制到容器中的/www/目录中。...
Nginx 作为业界广泛使用的高性能反向代理服务器,其稳定性和性能使得 ingress-nginx 成为了 Kubernetes 集群的首选 ingress 控制器。 二、Ingress 资源理解 Ingress 是 Kubernetes 中的一个 API 对象,用于定义...
kubernetes 服务发现 ingress文件
总结,Kubernetes ingress yaml文件包提供了定义Ingress资源的方法,通过配置路由规则和TLS,使外部访问能够灵活、安全地与Kubernetes集群内的服务交互。理解和掌握Ingress YAML的结构和配置对于有效地管理和扩展...
在Kubernetes安装上NGINX Ingress Controller的Ansible角色。 要求 此角色要求Ansible 2.10或更高版本。 该角色设计用于: Ubuntu 18.04、20.04、20.10 CentOS 7、8流 openSUSE Leap 15.2,风滚草 Debian 10 浅...
kubernetes部署ingress-nginx,由于官方给的镜像拉取国内拉取不到,所以更换了阿里云镜像加速。直接apply即可。
kubernetes 中的 pod 中容器想要对外部用户...端口的方式访问,而在 ingress 当中可以使用七层协议(HTTP/HTTPS)的服务方式来实现负载均衡以及 k8s 集群内部服务和客户端之间的通信(既可以通过域名和主机名的方式)
app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx name: ingress-nginx --- apiVersion: v1 automountServiceAccountToken: true kind: ServiceAccount metadata: labels: ...