k8s!Ingress服务

一 ingress

  1. 背景
    service暴露服务的方式,在实际生产环境中不太合适:
ClusterIP的方式只能在集群内部访问。
NodePort方式的话,测试环境使用还行,当有几十上百的服务在集群中运行时,NodePort的端口管理是灾难。
LoadBalance方式受限于云平台,且通常在云平台部署ELB还需要额外的费用。
  1. 引入

ingress
ingress可以简单理解为service的service,他通过独立的ingress对象来制定请求转发的规则(路由和proxy规则),把请求路由到一个或多个service(L4)中。这样就把服务与请求规则解耦了,可以从业务维度(NGINX — 域名)统一考虑业务的暴露,而不用为每个service单独考虑。
举个例子,现在集群有api、文件存储、前端3个service,可以通过一个ingress对象来实现图中的请求转发:ingress规则是很灵活的,可以根据不同域名、不同path转发请求到不同的service,并且支持https/http(阿里云中ingress,使用了这个技术的时候,会自带给你创建一个加密的HTTPS的证书)
ng + tomcat
www.ky11.com/ ————》 Nginx
www.ky11.com/tomcat ——》tomcat
而 / 和 /tomcat ——》在ingress的yml文件中定义PATH来决定的

  1. K8S中Ingress结构 :

ingress(L7) service(L4) label selector pods
port: 80 ——》 域名1 ————————》app-service ————》app selector ————》app

1.1ingress 介绍
  1. ingress-api与ingress-controller

  2. ingress分为两个概念,ingress-api和ingress-controller

① ingress-api:指的是k8s中的一个api对象,一般用yaml配置,一般作用是定义请求如何转发到service的规则,也就是配置的规则(可根据http header、path 等进行路由转发)Ingress 控制器有各种类型,包括 Google Cloud Load Balancer, Nginx,Contour,Istio,等等。它还有各种插件
② ingress-controller:一个容器,容器中运行着负载均衡的程序,比如ingress-nginx、ingress-haproxy。ingress-controller会对ingress定义的规则(yml文件中的配置项/列表清单)进行解析(将反向代理的规则、匹配路径的方式注入到容器中负载均衡服务的配置文件中),根据配置的规则来实现请求转发。
ingress常见的部署范式
PS:考虑到的原因

ingress-controller是作为pod来运行的,以什么方式部署比较好
ingress解决了把如何请求路由到集群内部,那它自己怎么暴露给外部比较好

  1. Deployment+LoadBalancer模式的Service
    这中方式适合在公有云,用deployment部署ingress-controller,创建一个type为LoadBalancer的service关联这组pod2. Deployment+NodePort模式的Service

2.同样用deployment模式部署ingress-controller,并创建对应的服务,但是type为NodePort。这样,ingress就会暴露在集群节点ip的特定端口上。由于nodeport暴露的端口是随机端口,一般会在前面再搭建一套负载均衡器来转发请求

  1. DaemonSet+HostNetwork+nodeSelector
    用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。
1.2 ingress 的优势

1、动态配置服务
如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress-nginx, 只需要配置好(定义好YML文件)这个服务, 当服务启动时, 会自动注册(yml配置清单会注入到ingress 容器中的负载均衡服务的配置)到Ingress的中, 不需要而外的操作。

2、减少不必要的端口映射
配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式

1.3 Ingress-nginx工作原理

1)ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化, ——————》动态感知变化
2)然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置, ——》动态生成配置
3)再写到nginx-ingress-controller的pod里,这个Ingress controller的pod里运行着一个Nginx服务,ingress控制器会把生成的nginx配置写入/etc/nginx.conf文件中, ——》由ingress控制器注入到nginx_pod中
4)然后reload一下使配置生效。以此达到域名分别配置和动态更新的问题。 ——>重载nginx_Pod配置

二、实验

2.1 创建ns
kubectl create ns ky11
kubectl get namespaces
2.2 创建deploy、service资源
vim httpd.yml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: web01
  namespace: ky11
spec:
  replicas: 3 
  template:
    metadata:
      labels:
        app: httpd01
    spec:
      containers:
      - name: httpd
        image: httpd
---
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
  namespace: ky11
spec:
  selector:
    app: httpd01
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
--->wq

kubectl apply -f httpd.yml
2.3 创建tomcat及其service
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: web02
  namespace: ky11
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: tomcat01
    spec:
      containers:
      - name: tomcat
        image: tomcat:8.5.45 
---
apiVersion: v1
kind: Service
metadata:
  name: tomcat-svc
  namespace: ky11
spec:
  selector:
    app: tomcat01
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080

--->wq

kubectl apply -f tomcat.yml
2.4 检查
kubectl get svc -n ky11

CURL -I “httpd-svc”
CURL -I “tomcat-svc”
2.5 创建Ingress-nginx资源对象
  1. 下载网址:
https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
#修改212行内容
  spec:                               #212行的spec字段
      hostNetwork: true      #添加此行,表示使用主机网络
      # wait up to five minutes for the drain of connections
      terminationGracePeriodSeconds: 300
      serviceAccountName: nginx-ingress-serviceaccount
      nodeSelector:
        kubernetes.io/os: linux
      containers:
        - name: nginx-ingress-controller
          image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.29.0
##修改以上镜像
  1. 发布、查看
kubectl  apply  -f mandatory.yaml

kubectl  get  pod -n ingress-nginx -o wide


############定义ingress 规则

vim ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  namespace: ky11
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: www.test01.com
    http:
      paths:
      - path: /
        backend:
          serviceName: httpd-svc
          servicePort: 80
      - path: /tomcat
        backend:
          serviceName: tomcat-svc
          servicePort: 8080

kubectl apply -f ingress.yaml

kubectl get ingresses -n ky11
2.6 在win10主机上配置映射
访问www.test01.com 及www.test01.com/tomcat

PS:
在上面的访问测试中,虽然访问到了对应的服务,但是有一个弊端,就是在做DNS解析的时候,只能指定Ingress-nginx容器所在的节点IP。而指定k8s集群内部的其他节点IP(包括master)都是不可以访问到的,如果这个节点一旦宕机,Ingress-nginx容器被转移到其他节点上运行(不考虑节点标签的问题,其实保持Ingress-nginx的yaml文件中默认的标签的话,那么每个节点都是有那个标签的)。随之还要我们手动去更改DNS解析的IP(要更改为Ingress-nginx容器所在节点的IP,通过命令“kubectl
get pod -n ingress-nginx -o wide”可以查看到其所在节点)。
所以需要为Ingress-nginx规则再创建一个类型为nodePort的Service,这样,在配置DNS解析时,就可以使用www.test01.com绑定所有node节点,包括master节点的IP。

三 示例

cat service-nodeport.yaml 
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx



 kubectl apply -f service-nodeport.yaml
kubectl  get  svc -n ingress-nginx
3.1 再次访问www.test1.com:端口
3.2 jenkins 常用插件
 Git Parameter:这是一个参数构建扩展,可以在构建的时候选择git的某一个分支来构建服务。

 Docker:利用Docker容器动态创建Jenkins Slave。如果有了Kubernetes/Openshift集群,就不需要这个插件了。直接使用下面的Kubernetes插件。
jenkins非root启动的话,为了运行docker需要执行sudo chmod 777 /var/run/docker.sock

 Kubernetes:这个插件可以将Jenkins Slave Node动态配置为Kubernetes集群上的pod。

  Openshift:这个插件支持调度Openshift的对象,包括触发 BuildConfig、Deployment、Scale up a Deployment,给ImageStream打新的Tag,以及创建新的对象、删除已有对象等。
 
 GitLab: 配置Gitlab的相关认证,同时也支持GitLab的Webhook触发。

 GitLab Hook: 支持GitLab更好的触发。

Gogs WebHook: 支持Gogs代码仓库的触发。
 
Maven:这个插件为Maven 2 / 3项目提供了高级集成功能。

Pyenv Pipeline:方便对python进行项目级别的环境隔离。

jenkins机器上需要安装python、pip、virtualenv
 
Python:这个插件支持在Jenkins的构建过程中执行Python脚本。

SonarQube Scanner:支持SonarQube的代码扫描。

Ansible:在构建任务中可以执行Ansible任务。

Publish Over SSH:通过SSH拷贝文件到目标机器,同时可以在目标机器上执行脚本

Publish Over SSH:事先要在设置中添加目标机器的访问方式。

Job Generator:定义一个参数化的模板,通过这个模板快速的在 Jenkins 上创建出任务

Pipeline:Job:添加一个新的Job类型:Pipeline。

Multijob:把多个Job组织起来。

Parameterized Trigger:这是一个扩展型的插件,使各个job连接的时候可以传递一些job相关的信息。

Join:这也是一个触发job的插件,亮点在于它触发job的条件是等待所有当前job的下游的job都完成才会发生。

Build Pipeline:这个插件提供一个构建流水线的视图。同时它提供了一个任务的手动触发器。

Monitoring监控:监控Jenkins节点的CPU、系统负载、平均响应时间和内存使用。
3.3 使用的插件类型

① 用户及权限
② 代码管理的
③ 项目视图的
④ 构建触发
⑤ 构建任务环境
⑥ 构建通知

Jenkins 用户权限管理是Jenkins Administration中非常很重要的环节,由于大部分企业都会有自己的域控管理,所以和LDAP集成并基于用户组实现权限模型设计与管理是企业级Jenkins实践的重要内容。

l  LDAP (https://plugins.jenkins.io/ldap),这个插件允许使用LDAP对用户进行认证,LDAP 服务器可以为Active Directory 或者 OpenLDAP。
l  Active Directory https://plugins.jenkins.io/active-directory,这个插件允许使用Active Directory对用户进行认证,同时结合诸如Matrix Authorization Strategy插件,可以识别用户所在的所有用户组,对用户授权进行灵活配置。
l  基于Windows Active Directory进行域管理的企业,推荐采用Active Directory。
l  GitHub Authentication https://plugins.jenkins.io/github-oauth,这个插件提供了使用GitHub进行用户认证和授权的方案。
l  Gitlab Authentication https://plugins.jenkins.io/gitlab-oauth,这个插件提供了使用GitLab进行用户认证和授权的方案。
l  Matrix Authorization Strategy https://plugins.jenkins.io/matrix-auth,这个插件提供了基于矩阵的授权策略,支持全局和项目级别的配置。
l  Role-based Authorization Strategy https://plugins.jenkins.io/role-strategy,这个插件提供了一种基于角色(Role)的用户权限管理策略,支持创建global角色、Project角色、Slave角色,以及给用户分配这些角色。这款插件是最常用的Jenkins权限策略和管理插件。
  • 代码管理

Jenkins 项目中配置Source Code Management 去下载代码进行构建任务,是非常普遍的应用场景。Jenkins插件支持很多SCM的系统,使用最常见的是Git 和SVN。

l  Git https://plugins.jenkins.io/git,支持使用Github、GitLab、Gerrit等系统管理代码仓库。
l  Subversion https://plugins.jenkins.io/subversion,支持Subversion系统管理源代码。
  • 项目及视图
    Jenkins中对Project 和 view的管理,是用户日常工作中使用很多的功能。
l  Folder https://plugins.jenkins.io/cloudbees-folder,这个插件支持用户使用目录管理项目,目录支持嵌套,并且支持目录中创建视图。
l  List view Jenkins 默认支持List类型的视图,用户可以创建List视图过滤所关心的项目。
l  Sectioned View https://plugins.jenkins.io/sectioned-view,这个插件支持一种新的视图,视图可以分为多个部分,每部分可以单独配置显示所选择的项目信息。
l   Nested View https://plugins.jenkins.io/nested-view,这个插件支持一种新的视图,其表示直接显示项目,而是以目录图标显示所包含的子视图,每个子视图显示所选项目信息。
l  Build Pipeline https://plugins.jenkins.io/build-pipeline-plugin,这个插件提供了一种Build Pipeline 视图,用于显示上、下游项目构建的关系。
  • 构建触发

Jenkins支持多种Build 触发方式,尤其一些自动化触发方式非常有用

l  Build periodically,Jenkins 内置功能,可以设置类似crontab时间,周期性地自动触发构建。
l  Poll SCM,Jenkins 内置功能,类似Build periodically,可以设置类似crontab时间,不同的是不是直接进行构建,而是周期性地在后台检查所配置的SCM有没有更新,只有当有代码更新时才会触发构建。
l  Trigger builds remotely (e.g., from scripts),Jenkins 内置功能,远程触发构建,通过设置token可以支持远程脚本中触发Jenkins构建。
l  Gerrit Trigger https://plugins.jenkins.io/gerrit-trigger,这个插件将Jenkins集成到Gerrit code review中,支持Jenkins配置Gerrit服务器等信息,实现Gerrit event 触发Jenkins 构建。
l  GitLab https://plugins.jenkins.io/gitlab-plugin,    这个插件将Jenkins 集成到GitLab web hook中,支持Gitlab 分支及Merge Request等相关事件触发Jenkins构建。
l  GitHub Integration https://plugins.jenkins.io/github-pullrequest ,这个插件将Jenkins集成到GitHub中,支持Gitgub分支及Pull requests 触发Jenkins 构建。
l  JIRA Trigger https://plugins.jenkins.io/jira-trigger,这个插件将Jenkins集成到Jira WebHooks中,支持Jira issue的状态等变化时触发Jenkins构建。
  • 构建参数

Jenkins除了支持普通的参数类型(布尔型、字符串型、多行文本型、选择型和文件型 )外,还有一些插件支持更加丰富实用的参数类型,比如参数间动态关联、多层级参数、隐藏参数等 。

l  nodelabelparameter  https://plugins.jenkins.io/nodelabelparameter,这个插件增加了一个新的参数类型,Node  Label,从而使用户通过参数可以选择项目构建运行的节点。
l  其他插件不一一列举,可以查看插件说明
Ø  https://plugins.jenkins.io/hidden-parameter

Ø  https://plugins.jenkins.io/extended-choice-parameter

Ø  https://plugins.jenkins.io/validating-string-parameter

Ø  https://plugins.jenkins.io/extensible-choice-parameter

Ø  https://wiki.jenkins.io/display/JENKINS/Active+Choices+Plugin
  • 构建任务及环境

围绕构建任务,有许多小的插件,却提供了一些实用的功能

l  Workspace Cleanup https://plugins.jenkins.io/ws-cleanup,这个插件支持在构建前后 删除或者部分删除workspace
l  description setter https://plugins.jenkins.io/description-setter,这个插件支持正则表达式匹配构建log输出,设置构建的描述
l  build-name-setter https://plugins.jenkins.io/build-name-setter,这个插件支持设置构建的显示名字,而不是默认的为#1#2,……,#buildnum
l  Environment Injector https://plugins.jenkins.io/envinject,这个插件支持在构建任务的不同阶段插入环境变量,并且在构建结束导出所有的环境变量等功能。
  • 构建通知

把构建状态及时地通知用户,是Jenkins的一个必不可少的功能。Jenkins支持多种主动和被动的通知方式。

l  Mailer  https://plugins.jenkins.io/mailer,这个插件支持基本的邮件通知功能,比如构建失败和构建恢复成功可以发送邮件通知给相关人员。
l  Email Extension https://plugins.jenkins.io/email-ext,这个插件是邮件通知的扩展,支持定制邮件内容,触发条件以及邮件接收者,功能比基本邮件通知要灵活强大的多。
l  Slack Notification https://plugins.jenkins.io/slack,这个插件支持把构建结果推送到Slack channel。
容器化Slave
Jenkins的Master-Slave架构实现了分布式构建,可以充分的横向扩展Slave来提升构建能力,将Slave容器化是目前主流的构建环境标准化、集群化和弹性化的方式。

l  https://plugins.jenkins.io/docker-plugin,这个插件可以配置docker host ,从而动态的提供Jenkins Agent(Slave),运行构建后再销毁这个slave。
l  https://plugins.jenkins.io/kubernetes,这个插件支持利用Kubernetes  cluster 动态的提供Jenkins Agent(Slave),利用Kubernetes 调度机制来优化Jenkins 负载等。
  • gAdmin相关插件
l  Configuration Slicing  https://plugins.jenkins.io/configurationslicing,这个插件支持批量修改项目配置
l  Mask Passwords https://plugins.jenkins.io/mask-passwords,这个插件支持遮挡构建log输出的password等敏感信息
l  Backup https://plugins.jenkins.io/backup,这个插件添加备份功能到Jenkins management
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值