Ingress是个什么鬼,网上资料很多(推荐官方),大家自行研究。简单来讲,就是一个负载均衡的玩意,其主要用来解决使用NodePort暴露Service的端口时Node IP会漂移的问题。同时,若大量使用NodePort暴露主机端口,管理会非常混乱。

好的解决方案就是让外界通过域名去访问Service,而无需关心其Node IP及Port。那为什么不直接使用Nginx?这是因为在K8S集群中,如果每加入一个服务,我们都在Nginx中添加一个配置,其实是一个重复性的体力活,只要是重复性的体力活,我们都应该通过技术将它干掉。

Ingress就可以解决上面的问题,其包含两个组件Ingress Controller和Ingress:

  • Ingress
    将Nginx的配置抽象成一个Ingress对象,每添加一个新的服务只需写一个新的Ingress的yaml文件即可
  • Ingress Controller
    将新加入的Ingress转化成Nginx的配置文件并使之生效

好了,废话不多,走你~

准备操作

官方文档

人生苦短,不造轮子,本文将以官方的标准脚本为基础进行搭建,参考请戳官方文档。官方文档中要求依次执行如下命令:

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/namespace.yaml \| kubectl apply -f -curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/default-backend.yaml \| kubectl apply -f -curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/configmap.yaml \| kubectl apply -f -curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/tcp-services-configmap.yaml \| kubectl apply -f -curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/udp-services-configmap.yaml \| kubectl apply -f -

以上yaml文件创建Ingress用到的Namespace、ConfigMap,以及默认的后端default-backend。最关键的一点是,由于之前我们基于Kubeadm创建了K8S集群,则还必须执行:

curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/rbac.yaml \| kubectl apply -f -curl https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/with-rbac.yaml \| kubectl apply -f -

这是由于Kubeadm创建的集群默认开启了RABC,因此Ingress也必须创建相应的RABC权限控制。

导入镜像

但是,直接按照上述方式执行,我们的Ingress很可能会无法使用。所以,我们需要将上述Yaml文件全部wget下来,经过一些修改后才能执行kubectl apply -f创建。另外需要注意的是,这些yaml文件中提到的一些镜像,国内目前无法下载,如:

gcr.io/google_containers/defaultbackend:1.4
quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.14.0

本人已经提前下载好,大家请戳:

地址:https://pan.baidu.com/s/1N-bK9hI7JTZZB6AzmaT8PA
密码:1a8a

拿到镜像后,在每个节点上执行如下命令导入镜像:

docker load < quay.io#kubernetes-ingress-controller#nginx-ingress-controller_0.14.0.tar
docker tag 452a96d81c30 quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.14.0
docker load < gcr.io#google_containers#defaultbackend.tar
docker tag 452a96d81c30 gcr.io/google_containers/defaultbackend

如上所示,导入镜像后,别忘记给打tag,否则镜像名称为<none>:

image.png

主要文件介绍

这里,我们先对一些重要的文件进行简单介绍。

default-backend.yaml

default-backend的作用是,如果外界访问的域名不存在的话,则默认转发到default-http-backend这个Service,其会直接返回404:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: default-http-backendlabels:app: default-http-backendnamespace: ingress-nginx
spec:replicas: 1selector:matchLabels:app: default-http-backendtemplate:metadata:labels:app: default-http-backendspec:terminationGracePeriodSeconds: 60containers:- name: default-http-backend# Any image is permissible as long as:# 1. It serves a 404 page at /# 2. It serves 200 on a /healthz endpointimage: gcr.io/google_containers/defaultbackend:1.4livenessProbe:httpGet:path: /healthzport: 8080scheme: HTTPinitialDelaySeconds: 30timeoutSeconds: 5ports:- containerPort: 8080resources:limits:cpu: 10mmemory: 20Mirequests:cpu: 10mmemory: 20Mi
---apiVersion: v1
kind: Service
metadata:name: default-http-backendnamespace: ingress-nginxlabels:app: default-http-backend
spec:ports:- port: 80targetPort: 8080selector:app: default-http-backend

rbac.yaml

rbac.yaml负责Ingress的RBAC授权的控制,其创建了Ingress用到的ServiceAccount、ClusterRole、Role、RoleBinding、ClusterRoleBinding。在上文《从零开始搭建Kubernetes集群》中,我们已对这些概念进行了简单介绍。

apiVersion: v1
kind: ServiceAccount
metadata:name: nginx-ingress-serviceaccountnamespace: ingress-nginx---apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:name: nginx-ingress-clusterrole
rules:- apiGroups:- ""resources:- configmaps- endpoints- nodes- pods- secretsverbs:- list- watch- apiGroups:- ""resources:- nodesverbs:- get- apiGroups:- ""resources:- servicesverbs:- get- list- watch- apiGroups:- "extensions"resources:- ingressesverbs:- get- list- watch- apiGroups:- ""resources:- eventsverbs:- create- patch- apiGroups:- "extensions"resources:- ingresses/statusverbs:- update---apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:name: nginx-ingress-rolenamespace: ingress-nginx
rules:- apiGroups:- ""resources:- configmaps- pods- secrets- namespacesverbs:- get- apiGroups:- ""resources:- configmapsresourceNames:# Defaults to "<election-id>-<ingress-class>"# Here: "<ingress-controller-leader>-<nginx>"# This has to be adapted if you change either parameter# when launching the nginx-ingress-controller.- "ingress-controller-leader-nginx"verbs:- get- update- apiGroups:- ""resources:- configmapsverbs:- create- apiGroups:- ""resources:- endpointsverbs:- get---apiVersion: rbac.authorization.k8s.io/v1beta1
kind: RoleBinding
metadata:name: nginx-ingress-role-nisa-bindingnamespace: ingress-nginx
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: nginx-ingress-role
subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx---apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:name: nginx-ingress-clusterrole-nisa-binding
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: nginx-ingress-clusterrole
subjects:- kind: ServiceAccountname: nginx-ingress-serviceaccountnamespace: ingress-nginx

with-rbac.yaml

with-rbac.yaml是Ingress的核心,用于创建ingress-controller。前面提到过,ingress-controller的作用是将新加入的Ingress进行转化为Nginx的配置。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: nginx-ingress-controllernamespace: ingress-nginx
spec:replicas: 1selector:matchLabels:app: ingress-nginxtemplate:metadata:labels:app: ingress-nginxannotations:prometheus.io/port: '10254'prometheus.io/scrape: 'true'spec:serviceAccountName: nginx-ingress-serviceaccountcontainers:- name: nginx-ingress-controllerimage: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.14.0args:- /nginx-ingress-controller- --default-backend-service=$(POD_NAMESPACE)/default-http-backend- --configmap=$(POD_NAMESPACE)/nginx-configuration- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services- --udp-services-configmap=$(POD_NAMESPACE)/udp-services- --annotations-prefix=nginx.ingress.kubernetes.ioenv:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceports:- name: httpcontainerPort: 80- name: httpscontainerPort: 443livenessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 1readinessProbe:failureThreshold: 3httpGet:path: /healthzport: 10254scheme: HTTPperiodSeconds: 10successThreshold: 1timeoutSeconds: 1securityContext:runAsNonRoot: false

如上,可以看到nginx-ingress-controller启动时传入了参数,分别为前面创建的default-backend-service以及configmap。

创建Ingress

1.创建Ingress-controller

需要注意的是,官方提供的with-rbac.yaml文件不能直接使用,我们必须修改两处:

加入hostNetwork配置

如下,在serviceAccountName上方添加hostNetwork: true:

spec:hostNetwork: trueserviceAccountName: nginx-ingress-serviceaccountcontainers:- name: nginx-ingress-controllerimage: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.14.0args:- /nginx-ingress-controller- --default-backend-service=$(POD_NAMESPACE)/default-http-backend- --configmap=$(POD_NAMESPACE)/nginx-configuration- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services- --udp-services-configmap=$(POD_NAMESPACE)/udp-services- --annotations-prefix=nginx.ingress.kubernetes.io

配置hostNetwork: true是一种直接定义Pod网络的方式。定义后,Ingress-controller的IP就与宿主机k8s-node1一样(192.168.56.101),并且端口80也是宿主机上的端口。这样,我们通过该192.168.56.101:80,就可以直接访问到Ingress-controller(实际上就是nginx),然后Ingress-controller则会转发我们的请求到相应后端。

加入环境变量

在其env部分加入如下环境变量:

          env:- name: POD_NAMEvalueFrom:fieldRef:fieldPath: metadata.name- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespace- name: KUBERNETES_MASTER value: http://192.168.56.101:8080

否则,创建后会提示如下错误:

[root@k8s-node1 ingress]# kubectl describe pod nginx-ingress-controller-9fbd7596d-rt9sf  -n ingress-nginx
省略前面...
Events:Type     Reason                 Age                From                Message----     ------                 ----               ----                -------Normal   Scheduled              30s                default-scheduler   Successfully assigned nginx-ingress-controller-9fbd7596d-rt9sf to k8s-node1Normal   SuccessfulMountVolume  30s                kubelet, k8s-node1  MountVolume.SetUp succeeded for volume "nginx-ingress-serviceaccount-token-lq2dt"Warning  BackOff                21s                kubelet, k8s-node1  Back-off restarting failed containerNormal   Pulled                 11s (x3 over 29s)  kubelet, k8s-node1  Container image "quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.14.0" already present on machineNormal   Created                11s (x3 over 29s)  kubelet, k8s-node1  Created containerWarning  Failed                 10s (x3 over 28s)  kubelet, k8s-node1  Error: failed to start container "nginx-ingress-controller": Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"/nginx-ingress-controller\": stat /nginx-ingress-controller: no such file or directory": unknown

修改with-rbac.yaml后,使用kubectl -f create命令分别执行如下yaml文件,即可创建Ingress-controller:

创建成功后如下所示:

[root@k8s-node1 ingress]# kubectl get pod -n ingress-nginx -o wide
NAME                                        READY     STATUS    RESTARTS   AGE       IP              NODE
default-http-backend-5c6d95c48-pdjn9        1/1       Running   0          23s       192.168.36.81   k8s-node1
nginx-ingress-controller-547cd7d9cb-jmvpn   1/1       Running   0          8s        192.168.36.82   k8s-node1

2.创建自定义Ingress

有了ingress-controller,我们就可以创建自定义的Ingress了。这里已提前搭建好了Kibana服务,我们针对Kibana创建一个Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:name: kibana-ingressnamespace: defaultspec:rules:- host: myk8s.comhttp:paths:- path: /backend:serviceName: kibanaservicePort: 5601

其中:

  • rules中的host必须为域名,不能为IP,表示Ingress-controller的Pod所在主机域名,也就是Ingress-controller的IP对应的域名。
  • paths中的path则表示映射的路径。如映射/表示若访问myk8s.com,则会将请求转发至Kibana的service,端口为5601。

创建成功后,查看:

[root@k8s-node1 ingress]# kubectl get ingress -o wide
NAME             HOSTS       ADDRESS   PORTS     AGE
kibana-ingress   myk8s.com             80        6s

我们再执行kubectl exec nginx-ingress-controller-5b79cbb5c6-2zr7f -it cat /etc/nginx/nginx.conf -n ingress-nginx,可以看到生成nginx配置,篇幅较长,各位自行筛选:

    ## start server myk8s.comserver {server_name myk8s.com ;listen 80;listen [::]:80;set $proxy_upstream_name "-";location /kibana {log_by_lua_block {}port_in_redirect off;set $proxy_upstream_name "";set $namespace      "kube-system";set $ingress_name   "dashboard-ingress";set $service_name   "kibana";client_max_body_size                    "1m";proxy_set_header Host                   $best_http_host;# Pass the extracted client certificate to the backend# Allow websocket connectionsproxy_set_header                        Upgrade           $http_upgrade;proxy_set_header                        Connection        $connection_upgrade;proxy_set_header X-Real-IP              $the_real_ip;proxy_set_header X-Forwarded-For        $the_real_ip;proxy_set_header X-Forwarded-Host       $best_http_host;proxy_set_header X-Forwarded-Port       $pass_port;proxy_set_header X-Forwarded-Proto      $pass_access_scheme;proxy_set_header X-Original-URI         $request_uri;proxy_set_header X-Scheme               $pass_access_scheme;# Pass the original X-Forwarded-Forproxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;# mitigate HTTPoxy Vulnerability# https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/proxy_set_header Proxy                  "";# Custom headers to proxied serverproxy_connect_timeout                   5s;proxy_send_timeout                      60s;proxy_read_timeout                      60s;proxy_buffering                         "off";proxy_buffer_size                       "4k";proxy_buffers                           4 "4k";proxy_request_buffering                 "on";proxy_http_version                      1.1;proxy_cookie_domain                     off;proxy_cookie_path                       off;# In case of errors try the next upstream server before returning an errorproxy_next_upstream                     error timeout invalid_header http_502 http_503 http_504;proxy_next_upstream_tries               0;# No endpoints available for the requestreturn 503;}location / {log_by_lua_block {}port_in_redirect off;set $proxy_upstream_name "";set $namespace      "default";set $ingress_name   "kibana-ingress";set $service_name   "kibana";client_max_body_size                    "1m";proxy_set_header Host                   $best_http_host;# Pass the extracted client certificate to the backend# Allow websocket connectionsproxy_set_header                        Upgrade           $http_upgrade;proxy_set_header                        Connection        $connection_upgrade;proxy_set_header X-Real-IP              $the_real_ip;proxy_set_header X-Forwarded-For        $the_real_ip;proxy_set_header X-Forwarded-Host       $best_http_host;proxy_set_header X-Forwarded-Port       $pass_port;proxy_set_header X-Forwarded-Proto      $pass_access_scheme;proxy_set_header X-Original-URI         $request_uri;proxy_set_header X-Scheme               $pass_access_scheme;# Pass the original X-Forwarded-Forproxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;# mitigate HTTPoxy Vulnerability# https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/proxy_set_header Proxy                  "";# Custom headers to proxied serverproxy_connect_timeout                   5s;proxy_send_timeout                      60s;proxy_read_timeout                      60s;proxy_buffering                         "off";proxy_buffer_size                       "4k";proxy_buffers                           4 "4k";proxy_request_buffering                 "on";proxy_http_version                      1.1;proxy_cookie_domain                     off;proxy_cookie_path                       off;# In case of errors try the next upstream server before returning an errorproxy_next_upstream                     error timeout invalid_header http_502 http_503 http_504;proxy_next_upstream_tries               0;# No endpoints available for the requestreturn 503;}}## end server myk8s.com

3.设置host

首先,我们需要在Ingress-controller的Pod所在主机上(这里为k8s-node1),将上面提到的域名myk8s.com追加入/etc/hosts文件:

192.168.56.101 myk8s.com

除此之外,如果想在自己的Windows物理机上使用浏览器访问kibana,也需要在C:\Windows\System32\drivers\etc\hosts文件内加入上述内容。设置后,分别在k8s-node1和物理机上测试无误即可:

测试

在Windows物理机上,使用Chrome访问myk8s.com,也就是相当于访问了192.168.56.101:80

随意访问一个错误的地址myk8s.com/abc,返回预期的404:

从零开始搭建K8S--搭建K8S Ingress相关推荐

  1. 通过搭建MySQL掌握k8s(Kubernetes)重要概念(上):网络与持久卷

    上一篇"通过实例快速掌握k8s(Kubernetes)核心概念"讲解了k8s的核心概念,有了核心概念整个骨架就完整了,应付无状态程序已经够了,但还不够丰满.应用程序分成两种,无状态 ...

  2. 2019最新k8s集群搭建教程 (centos k8s 搭建)

    2019-k8s-centos 2019最新k8s集群搭建教程 (centos k8s 搭建) 网上全是要么过时的,要么残缺的,大多数都是2016年,2017年的文档,照着尝试了N次,各种卸了重装,最 ...

  3. 使用国内的镜像源搭建 kubernetes(k8s)集群

    概述 老话说的好:努力学习,提高自己,让自己知道的比别人多,了解的别人多. 言归正传,之前我们聊了 Docker,随着业务的不断扩大,Docker 容器不断增多,物理机也不断增多,此时我们会发现,登录 ...

  4. k8s部署tomcat及web应用_k8s介绍 k8s搭建一个应用(mysql+tomcat)

    k8s介绍 k8s搭建一个应用(mysql+tomcat) kubetnetes介绍 官网 https://kubernetes.io/ Kubernetes也就是k8s Kubernetes是一个开 ...

  5. K8S搭建自动化部署环境(三)Jenkins下载、安装和启动

    各位大佬,前文如下: K8S搭建自动化部署环境(一)安装Kubernetes K8S搭建自动化部署环境(二)安装K8S管理工具Kuboard V3 一.jenkins 下载 jenkins下载地址:h ...

  6. k8s搭建--裸机搭建(Bare Metal)

    本篇文章从新建虚拟机开始,教大家在linux系统中的k8s搭建,博主本人搭建了三个节点,一个master和两个node节点,其实一个主节点一个工作节点就足够了,搭建过程供大家参考. 第一步,新建虚拟机 ...

  7. K8s系列之:搭建高可用K8s v1.23.5集群详细步骤,3个master节点,3个Node节点

    K8s系列之:搭建高可用K8s v1.23.5集群详细步骤,3个master节点,3个Node节点 一.K8s集群节点划分 二.k8s集群环境准备 三.关闭swap 四.关闭ipv6 五.桥接IPv4 ...

  8. 搭建Kubernetes(k8s)集群(cka考试环境)

    搭建Kubernetes(k8s)集群 基础介绍 containerd简介 Docker vs containerd K8S为什么要放弃使用Docker作为容器运行时,而使用containerd呢? ...

  9. 通过搭建MySQL掌握k8s(Kubernetes)重要概念(下):参数配置

    本文通过搭建MySQL环境来了解k8s的重要概念,包括持久卷,网络和参数配置.这是下篇,专门讲解参数配置.如果你有些地方不能完全看明白,请先看上篇"通过搭建MySQL掌握k8s(Kubern ...

  10. 《Centos7——k8s搭建》

    目录 k8s搭建 1.关闭防火墙 2.时间同步 3.修改主机名(三台分别修改) 4. 编辑hosts文件 5: 安装指定版本的docker 6:运行docker 7:docker镜像加速 8:上传k8 ...

最新文章

  1. Kotlin 类的定义
  2. jQuery面向对象写法规定写法样式规定
  3. windows update失败还原更改,无法开机
  4. 一个工作一年的程序员的告白
  5. angular点击按钮弹出页面_Win10提示“由于启动计算机时出现了页面文件配置问题”解决方法...
  6. 目瞪口呆!台湾豪门美女过如此奢华生活?
  7. 通达信资金净流入公式_通达信指标公式:资金净流入,监控资金流入流出,分享...
  8. 多多进宝推广团队_多多进宝推广团长玩法指南
  9. leetcode:78. 子集
  10. fetch bulk collect limt 学习
  11. ARM Neon Intrinsics 学习指北:从入门、进阶到学个通透
  12. 2022-2027年中国基金行业市场全景评估及发展战略规划报告
  13. 站长VS微商 你选择哪个?
  14. CoreData多线程安全
  15. 华硕计算机硬件信息,华硕EeePC T101MT配置信息及散热
  16. c语言windows库函数,C语言访问Windows COM组件函数
  17. 深度学习~模糊神经网络(FNN)
  18. 交叉线和直通线的做法
  19. Deep learning with Python 学习笔记(6)
  20. Thread wait和sleep的区别

热门文章

  1. 【中科蓝讯AB532X】自定义按键处理函数的实现
  2. 豆瓣8.0!烂番茄99%鲜!苹果高分冲奥动画《狼行者》精彩幕后来了!
  3. 那些外卖cps饿了么一键领取最佳红包的公众号或者小程序怎么搭建?
  4. 清华大学 计算机技术 非全日制,2018年清华大学计算机系计算机技术考研(085211)考试科目、参考书目、复习经验---新祥旭考研...
  5. C语言:【换钱问题】人民币问题
  6. 「图学习推荐系统」最新2022综述
  7. uniapp打包成h5页面
  8. CSS隐藏多余文字的几个方法
  9. 测试开发进阶——APP性能监测工具——itest
  10. C语言学习:二进制码与格雷码的转换