设为首页 收藏本站
查看: 931|回复: 0

[经验分享] [置顶]kubernetes资源类型--ingress

[复制链接]

尚未签到

发表于 2018-1-4 16:45:00 | 显示全部楼层 |阅读模式
  
Ingress在K8S1.1之前还没有。

概念
  
Ingress是一种HTTP方式的路由转发机制,为K8S服务配置HTTP负载均衡器,通常会将服务暴露给K8S群集外的客户端。
  
Ingress是一个允许入站连接到达集群服务的规则集合。Ingress能把Service(K8Sservice)配置成外网可访问集群service的URL、负载均衡、SSL、基于名称的虚拟主机等。
  
单纯创建一个Ingress没有任何意义,需要部署一个Ingress Controller(Ingress控制器,下文简称IC)来实现Ingress。在GCE/GKE环境下,会自动在master节点上部署一个IC。在非GCE/GKE的环境中,必须部署和运行一个IC。
  
IC是通过轮询实时监听K8S apiserver监视Ingress资源的应用程序,一旦资源发生了变化(包括增加、删除和修改),将ingress资源存储到本地缓存,并通知HTTP代理服务器(例如nginx)进行实时更新转发规则。
  
这与其他类型的控制器不同,其他类型的控制器通常作为kube-controller-manager二进制文件的一部分运行,在集群启动时自动启动。而IC通常使用负载平衡器,它还可以配置边界路由和其他前端,这有助于以HA方式处理流量。HTTP代理服务器有GCE Load-Balancer、HaProxy、Nginx等开源方案,不同的HTTP代理服务器需要不同的Ingress控制器实现。
  
如果与HAProxy进行比较:
  
ingress是配置文件部分,例如haproxy.conf
  
IC是前端,实现配置文件中的frontend **部分
  

frontend fe_web1  mode http
  maxconn 20000
  bind web1:80
  acl web1_acl hdr_reg(host) -i ^/web1
  use_backend be_web1if web1_acl
  

  

  
HTTP代理服务器是后端,实现配置文件中的backend **部分
  

backend be_web1  mode http
  option httpchk GET / HTTP/1.1\r\nHost:\ web1
  balance roundrobin
  server testdmp test-dmp-v1:80 check
  

  

通讯拓扑图
  
通过下面的例子,总结下面的通讯图(通讯方向从左至右) DSC0000.jpg
  
VIP:为了防止node出现单点故障,使用LVS+keepalived等软件实现的。
  
node(kube node)的docker把IC(ingress controller) pod开启443和80端口映射到公网,实现外部访问。
  
ICpod的作用是ingress的规则发现,根据规则转发流量给后端的BackendLB。

创建Ingress的yaml文件参数说明
  

1: apiVersion:extensions/v1beta1  
2: kind:Ingress
  
3: metadata:
  
4:   name: lykops-ingress
  
5: spec:
  
6:   rules:
  
7:   - http:
  
8:       paths:
  
9:       - path:/lykops
  
10:        backend:
  
11:           serviceName: lykops
  
12:           servicePort:80
  

  

  
如果没有配置Ingress controller就将其POST到API server不会有任何用处
  
配置说明
  

1-4行:跟K8S的其他配置一样,ingress的配置也需要apiVersion,kind和metadata字段。  

  
5-7行: Ingress spec 中包含配置一个LB或proxy server的所有信息。最重要的是,它包含了一个匹配所有入站请求的规则列表。目前ingress只支持http规则。
  

  
8-9行:每条http规则包含以下信息:一个host配置项(比如for.bar.com,在这个例子中默认是*),path列表(比如:/testpath),每个path都关联一个backend(比如test:80)。在LB将流量转发到backend之前,所有的入站请求都要先匹配host和path。
  

  
10-12行:正如 servicesdoc中描述的那样,backend是一个service:port的组合。Ingress的流量被转发到它所匹配的backend。
  

  

部署例子
  
这是例子基于名称的虚拟主机的ingess。

部署http负载均衡器
  

cat << EOF > lykops-ingess-backup-l7lb.yaml  
apiVersion: extensions/v1beta1
  
kind: DaemonSet
  
metadata:
  name: lykops-ingess-backup-l7lb
  labels:
  software: apache
  project: test
  app: backup-l7lb
  version: v1
  
spec:
  template:
  metadata:
  labels:
  name: lykops-ingess-backup-l7lb
  software: apache
  project: lykops
  app: backup-l7lb
  version: v1
  spec:
  terminationGracePeriodSeconds: 60
  containers:
  - name: lykops-ingess-backup-l7lb
  image: docker.io/googlecontainer/defaultbackend:1.0
  #livenessProbe:
  # httpGet:
  #   port: 80
  #   scheme: HTTP
  # initialDelaySeconds: 30
  # timeoutSeconds: 5
  ports:
  - containerPort: 80
  resources:
  limits:
  cpu: 10m
  memory: 20Mi
  requests:
  cpu: 10m
  memory: 20Mi
  
EOF
  
kubectl create -f lykops-ingess-backup-l7lb.yaml
  

  
cat << EOF > lykops-ingess-backup-l7lb-svc.yaml
  
apiVersion: v1
  
kind: Service
  
metadata:
  name: test-ingess-backup-l7lb
  labels:
  software: apache
  project: lykops
  app: backup-l7lb
  version: v1
  
spec:
  selector:
  name: lykops-ingess-backup-l7lb
  software: apache
  project: lykops
  app: backup-l7lb
  version: v1
  ports:
  -name: http
  port: 80
  protocol: TCP
  
EOF
  
kubectl create -f lykops-ingess-backup-l7lb-svc.yaml
  

  

  
注意:
  

注释部分用途,注释之后telnet 这个service clusterIP 80,会立即断开;访问页面,提示“连接被重置”,无法访问。  
如果不注释,livenessProbe检测认为失败,会不断创建pod
  

  

配置ingress-controller
  

cat << EOF > lykops-inging-control.yaml  
apiVersion: extensions/v1beta1
  
kind: DaemonSet
  
metadata:
  name: lykops-inging-control
  labels:
  software: apache
  project: lykops
  app: inging-control
  version: v1
  
spec:
  template:
  metadata:
  labels:
  name: lykops-inging-control
  software: apache
  project: lykops
  app: inging-control
  version: v1
  spec:
  terminationGracePeriodSeconds: 60
  containers:
  - image: docker.io/googlecontainer/nginx-ingress-controller:0.8.3
  name: lykops-inging-control
  #readinessProbe:
  #  httpGet:
  #    path: /healthz
  #    port: 80
  #    scheme: HTTP
  #livenessProbe:
  #  httpGet:
  #    path: /healthz
  #    port: 80
  #    scheme: HTTP
  #  initialDelaySeconds: 10
  #  timeoutSeconds: 1
  env:
  - name: POD_NAME
  valueFrom:
  fieldRef:
  fieldPath: metadata.name
  - name: POD_NAMESPACE
  valueFrom:
  fieldRef:
  fieldPath: metadata.namespace
  - name: KUBERNETES_MASTER
  value: http://192.168.20.128:8080
  ports:
  - containerPort: 80
  hostPort: 80
  - containerPort: 443
  hostPort: 443
  args:
  - /nginx-ingress-controller
  #- --default-backend-service=${POD_NAMESPACE}/default-http-backend
  - --default-backend-service=default/test-ingess-backup-l7lb
  
EOF
  
kubectl create -f lykops-inging-control.yaml
  

  

  
注意:
  

注释部分用途,注释之后访问页面,页面返回502错误。  

  
如果不注释,livenessProbe检测认为失败,会不断创建pod。
  

  

配置ingress
  

cat << EOF > lykops-inging.yaml  
apiVersion: extensions/v1beta1
  
kind: Ingress
  
metadata:
  name: lykops-inging
  labels:
  project: lykops
  app: inging
  version: v1
  
spec:
  rules:
  - host: web1
  http:
  paths:
  - path: /
  backend:
  serviceName: dpm-web-v1
  servicePort: 80
  - host: web2
  http:
  paths:
  - path: /
  backend:
  serviceName: dpm-web-v2
  servicePort: 80
  
EOF
  
kubectl create -f test-inging.yaml
  

  

测试
  
测试方法有两种 1、curl -v http://kube-node的IP地址 -H 'host: web3'
  

curl -v http://192.168.20.131 -H 'host: web3'  
* About to connect() to 192.168.20.131 port 80 (#0)
  
*   Trying 192.168.20.131...
  
* Connected to 192.168.20.131 (192.168.20.131) port 80 (#0)
  
> GET / HTTP/1.1
  
> User-Agent: curl/7.29.0
  
> Accept: */*
  
> host: web3
  
>
  
< HTTP/1.1 200 OK
  
< Server: nginx/1.11.3
  
< Date: Thu, 10 Aug 2017 07:30:15 GMT
  
< Content-Type: text/html;
  
< Content-Length: 122
  
< Connection: keep-alive
  
< Last-Modified: Tue, 01 Aug 2017 07:48:36 GMT
  
< ETag: "e03d22-7a-555ac5ff23d00"
  
< Accept-Ranges: bytes
  
<
  
<h1>Kubernetes v1.5.2</h1>
  
<h1>Host Name  : 9f16cf3bba3a</h1>
  
<h1>IP Address : 172.16.58.2</h1>
  
<h1>app version: v3 </h1>
  
* Connection #0 to host 192.168.20.131 left intact
  

  

  
2、将访问url的主机的host中加上:nodeip web1

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-431579-1-1.html 上篇帖子: kubernetes 安装备注 下篇帖子: kubernetes deployment
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表