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 安装与使用相关推荐

  1. Kubernetes Nginx Ingress教程

    最近发现好多人问Ingress,同时一直也没去用Nginx的Ingress,索性捣鼓一把,发现跟原来确实有了点变化,在这里写篇文章记录一下 一.Ingress介绍 Kubernetes暴露服务的方式目 ...

  2. Kubernetes使用Nginx Ingress暴露Dashboard

    Kubernetes使用Nginx Ingress暴露Dashboard [TOC] 1. 环境说明 可用的kubernetes集群 可用的nginx ingress controller 可用的da ...

  3. 初试 Kubernetes 暴漏服务类型之 Nginx Ingress

    目录 Ingress 介绍 环境.软件准备 部署 Default Backend 部署 Ingress Controller 部署 Ingress Name based virtual hosting ...

  4. Kubernetes暴漏服务类型之Nginx Ingress

    Kubernetes暴漏服务类型之Nginx Ingress 一.Ingress 介绍 LoadBlancer Service NodePort Service 1.NodePort类型的服务 Ing ...

  5. 如何在Kubernetes 上部署安装PHP + Nginx 多容器应用

    引言 Kubernetes是一个开源的容器编排系统.它允许你创建.更新和扩展容器,而无需担心停机. 要运行一个PHP应用程序,Nginx充当PHP-FPM的代理.将此设置打包到单个容器中可能是一个繁琐 ...

  6. k8s 使用Nginx Ingress实现灰度发布和蓝绿发布

    **导语:**云原生最佳实践系列,涵盖了灰度发布.弹性伸缩.集群迁移.网络通信.应用容器化改造等等场景,针对各行业面临的应用现状,提出最佳解决方案,并提供详细操作指导,希望对您有所帮助. Ingres ...

  7. 12、Kubernetes核心技术Ingress

    前言 原来我们需要将端口号对外暴露,通过 ip + 端口号就可以进行访问 原来是使用Service中的NodePort来实现 在每个节点上都会启动端口 在访问的时候通过任何节点,通过ip + 端口号就 ...

  8. Kubernetes 部署 Ingress 控制器 Traefik v1.7.4

    标签: kubernetes   ingress   traefik   nginx   haproxy   kong 介绍 Traefik Ingress 对象 上节课我们学习了在Kubernete ...

  9. Kubernetes 使用 ingress 配置 https 集群(十五)

    目录 一.背景 1.1 需求 1.2 Ingress 1.3 环境介绍 二.安装部署 2.1.创建后端 Pod 应用 2.2 创建后端 Pod Service 2.3.创建 ingress 资源 2. ...

最新文章

  1. 正则式高人谈解答正则式的心得
  2. python五子棋人人对战_五子棋-人人对战
  3. jquery实现加载更多效果
  4. Lua 5.1 参考手册
  5. 【Java】6.4 final 修饰符
  6. 剑指Offer(Java版):数字在排序数组中出现的次数
  7. 谈SOA在国内推进状况
  8. 一亿小目标成就_成就卓越的一种方式:自我选择
  9. Scrapy - Request 和 Response(请求和响应)
  10. java简易记账软件_0006JavaSE简单的项目FamilyAccount家庭记账控制台应用程序
  11. 【kafka】Kafka常用JMX监控指标整理
  12. 练打字-测试看图说话(AD安装)
  13. Fiddler——模拟限速
  14. JS 逻辑中断(一)
  15. laravel学习笔记
  16. BetaFlight深入传感设计之二:Mag传感模块
  17. struts1.x 升级到struts2的几点问题
  18. python提取实部虚部_Python 复数数据类型详解(complex)[学习 Python 必备基础知识][看此一篇就够了]|python基础教程|python入门|python教程...
  19. Yate for mac(标记和管理音频文件工具)
  20. struts2 ajax json 中文乱码的问题

热门文章

  1. python运行软件-提高Python程序的运行速度
  2. dlib做人脸检测判断有没有检测到人脸
  3. window中常用的命令
  4. codeforces 126B Password(哈希)
  5. Spring MVC中handlerMapping的设计
  6. re2c编译选项的说明
  7. Qt Model/View 学习笔记 (四)
  8. nginx的hash表结构
  9. APP专项测试关注点介绍
  10. 自定义本地音乐播放器