`
lykops
  • 浏览: 86255 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

kubernetes资源对象--ingress

 
阅读更多

Ingress在K8S1.1之前还没有。

概念

Ingress是一种HTTP方式的路由转发机制,为K8S服务配置HTTP负载均衡器,通常会将服务暴露给K8S群集外的客户端。

Ingress是一个允许入站连接到达集群服务的规则集合。Ingress能把K8S service配置成外网可访问集群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

通讯拓扑图

通过下面的例子,总结下面的通讯图(通讯方向从左至右)

VIP:为了防止node出现单点故障,使用LVS+keepalived等软件实现的。

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行:正如 services doc中描述的那样,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; charset=UTF-8
< 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

分享到:
评论

相关推荐

    kubernetes-server-linux-amd64.tar

    1. **kube-apiserver**:作为Kubernetes的前端,提供RESTful API接口,允许客户端(如kubectl)与集群进行交互,执行各种操作,如创建、更新和删除资源对象。 2. **kube-controller-manager**:包含多个控制循环,...

    kubernetes-client-linux-amd64.tar.gz

    Kubernetes客户端Linux AMD64资源包,`kubernetes-client-linux-amd64.tar.gz`,是专为基于Linux的AMD64(也称为x86_64)架构设计的Kubernetes命令行接口(CLI)工具集。这个压缩包包含了一系列用于与Kubernetes集群...

    kubernetes-server-linux-amd64.tar.gz

    1. **API服务器**:它是集群的中央数据存储和通信中心,处理所有资源对象的增删改查操作,并通过etcd存储集群状态。 2. **控制器管理器**:负责运行一系列协调控制器,如ReplicaSet控制器保证Pod副本数量的正确性,...

    ingress-nginx-controller(含镜像和代码).rar

    ingress-nginx-controller 是 Kubernetes 社区维护的一个项目,它提供了对 Ingress 资源的实现,使得可以通过定义简单的 YAML 文件来管理对外暴露的服务路由。Nginx 作为业界广泛使用的高性能反向代理服务器,其稳定...

    ingress-nginx-controller-1.9.yaml

    在 Kubernetes 集群中,Ingress 是一种用于对外提供服务的资源对象,它定义了外部网络如何访问内部的 Service。Nginx Ingress 控制器是广泛应用的一种解决方案,通过配置 Ingress 规则,可以实现基于域名和路径的...

    kubernetes-handbook-jimmysong-v1.3

    - **资源对象与基本概念**:包括Pod、Deployment、StatefulSet等资源对象的详细介绍和使用场景。 - **Pod状态与生命周期管理**:涵盖Pod的生命周期事件和管理策略,如Pod Hook、Preset、PDB(Pod中断预算)等。 ###...

    kubernetes-server-linux-amd64-v1.17.17.tar.gz

    7. **Ingress**:Ingress资源用于定义外部网络到集群内部服务的规则,可以实现基于路径的路由和SSL终止等功能。 8. **Helm**:Helm是Kubernetes的应用包管理工具,它允许开发者和管理员打包和分发复杂的Kubernetes...

    kubernetes-handbook-jimmysong-v1.4-20180903.pdf

    资源对象,如Nodes、Namespaces、Labels和Annotations,是Kubernetes集群管理的基础。Taints和Tolerations允许对节点进行精细的调度控制,防止某些Pod被分配到特定的节点上。此外,Controller如Deployment、...

    Kubernetes-Best-Practices

    2. **Ingress控制器**:配置Ingress资源,对外暴露服务并进行路径路由。 四、版本控制与持续集成/持续部署(CI/CD) 1. **使用GitOps**:将集群状态和配置存入Git,实现版本控制和团队协作。 2. **Jenkins或Tekton*...

    k8s 新版本 部署 Ingress-nginx controller.doc

    部署 Ingress-nginx controller 是实现 k8s 中 Ingress 资源的关键步骤。需要注意的是,新版本的 Ingress-nginx controller 需要指定 IngressClass,否则可能会出现问题。同时,需要手动下载 Ingress-nginx ...

    kubernetes之kube-controllers下载

    例如,`manifest.json` 文件通常包含 Kubernetes 对象的 YAML 描述,可以用来部署或更新集群组件。其他以哈希命名的文件可能是二进制文件、证书或加密数据,它们可能与集群的安装、配置或安全相关。 在使用这些文件...

    NGINX Ingress Controller:用于 Kubernetes 的 NGINX 入口控制器-开源

    ingress-nginx 是 Kubernetes 的入口控制器,使用 NGINX 作为反向代理和负载均衡器。 它围绕 Kubernetes Ingress 资源构建,使用 ConfigMap 来存储 NGINX 配置。 这个 Ingress 控制器的目标是组装一个配置文件...

    36丨为什么说Kubernetes只有softmulti-tenancy?.pdf

    Kubernetes 是一个强大的容器编排系统,它在设计之初就面临着多租户环境下的资源管理和网络隔离问题。然而,Kubernetes 的网络模型并非采用传统的硬性多租户(hard multi-tenancy)策略,而是采用了软性多租户(soft...

    citrix-k8s-ingress-controller:适用于Kubernetes的Citrix ADC(NetScaler)入口控制器:

    "citrix-k8s-ingress-controller"是Citrix为Kubernetes设计的专用入口控制器,它将Citrix ADC的强大功能集成到Kubernetes生态系统中,以实现更高效、安全的流量管理。 1. **Kubernetes Ingress**: Kubernetes ...

    ingress-nginx.tar.gz

    - 在Kubernetes集群中部署Ingress-Nginx通常包括创建Deployment和Service对象,以及配置相关的RBAC权限。`ingress-nginx`目录可能包含这些部署所需的YAML文件。 - 部署完成后,可以通过创建Ingress资源来指定哪些...

    ingress-nginx-mandatory.rar

    在这个场景下,"ingress-nginx"是一个关键组件,它是Kubernetes的Ingress控制器,基于流行的Nginx web服务器,提供了强大的负载均衡、SSL终止和路径匹配等功能。 "ingress-nginx-mandatory.rar"文件很可能是用于...

    ingress-controller.tar.gz

    Ingress是Kubernetes提供的一种资源对象,允许外部网络访问内部服务,通常用于实现负载均衡、SSL终止和路径路由等功能。在"ingress-controller.tar.gz"中,我们预计会找到一个或多个YAML文件,这些文件描述了如何...

    ingress-nginx源码

    1. **Ingress资源对象** Ingress是一种定义外部网络到Kubernetes服务之间映射的API资源。通过创建一个或多个ingress规则,我们可以将特定的域名或路径映射到服务上,实现HTTP/HTTPS流量的路由。 2. **Nginx配置...

    Kubernetes ingress yaml文件包

    总结,Kubernetes ingress yaml文件包提供了定义Ingress资源的方法,通过配置路由规则和TLS,使外部访问能够灵活、安全地与Kubernetes集群内的服务交互。理解和掌握Ingress YAML的结构和配置对于有效地管理和扩展...

Global site tag (gtag.js) - Google Analytics