kubernetes的service的网络类型ingress的搭建

来源:互联网 发布:税务数据采集软件 编辑:程序博客网 时间:2024/04/29 19:53

目录 (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: v1kind: ReplicationControllermetadata:  name: default-http-backendspec:  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: v1kind: ReplicationControllermetadata:  name: nginx-ingress-controller  labels:    k8s-app: nginx-ingress-lbspec:  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: v1kind: ReplicationControllermetadata:  name: echoheadersspec:  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: v1kind: Servicemetadata:  name: echoheaders-default  labels:    app: echoheadersspec:  type: NodePort  ports:  - port: 80    nodePort: 30302    targetPort: 8080    protocol: TCP    name: http  selector:    app: echoheaders

sv-alp-x.yaml:

apiVersion: v1kind: Servicemetadata:  name: echoheaders-x  labels:    app: echoheadersspec:  type: NodePort  ports:  - port: 80    nodePort: 30301    targetPort: 8080    protocol: TCP    name: http  selector:    app: echoheaders

sv-alp-y.yaml:

apiVersion: v1kind: Servicemetadata:  name: echoheaders-y  labels:    app: echoheadersspec:  type: NodePort  ports:  - port: 80    nodePort: 30284    targetPort: 8080    protocol: TCP    name: http  selector:    app: echoheaders

接着是

配置ingress

编辑ingress-alp.yaml:

apiVersion: extensions/v1beta1kind: Ingressmetadata:  name: echomapspec:  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=GETpath=/fooreal path=/fooquery=request_version=HTTP/1.1SERVER VALUES:server_version=BaseHTTP/0.6sys_version=Python/3.5.0protocol_version=HTTP/1.0HEADERS RECEIVED:Accept=*/*Connection=closeHost=foo.bar.comUser-Agent=curl/7.29.0X-Forwarded-For=183.131.19.231X-Forwarded-Host=foo.bar.comX-Forwarded-Port=80X-Forwarded-Proto=httpX-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.comnodeip   bar.baz.com

在浏览器中直接访问:

foo.bar.com/foobar.baz.com/barbar.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
2 0
原创粉丝点击