Ingress 是什么?

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。

可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。

本文使用host network模式,示意图如下

下载部署文件

  1. wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/baremetal/deploy.yaml

修改images为国内仓库

  1. k8s.gcr.io/ingress-nginx/controller:v0.35.0@sha256:fc4979d8b8443a831c9789b5155cded454cb7de737a8b727bc2ba0106d2eae8b

修改为,也可以自行使用魔法到k8s.gcr.io下载

  1. scofield/ingress-nginx-controller:v0.35.0

修改网络模式为host network

  1. template:
  2. spec:
  3. hostNetwork: true
  4. dnsPolicy: ClusterFirstWithHostNet

执行部署

kubectl apply -f deploy.yaml

  1. [root@k8s-master001 ingress-nginx]# kubectl get po -n ingress-nginx
  2. [root@k8s-master001 ingress-nginx]# kubectl get po,svc -n ingress-nginx -o wide
  3. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  4. pod/ingress-nginx-admission-create-dfg8g 0/1 Completed 0 47m 10.244.2.155 k8s-master003 <none> <none>
  5. pod/ingress-nginx-admission-patch-cfl4r 0/1 Completed 1 47m 10.244.1.134 k8s-master002 <none> <none>
  6. pod/ingress-nginx-controller-6fdd8c7f88-5gzdv 1/1 Running 0 2m42s 10.26.25.21 k8s-master002 <none> <none>

注意:ingress-nginx-controller的IP应该是宿主机IP,这里是10.26.25.21,至此,ingress-nginx就部署好了

使用ingress-nginx暴露http服务

部署一个最常用的http服务nginx,使用ingress-nginx暴露http服务

1、编写demo.yaml

  1. ---
  2. apiVersion: apps/v1
  3. kind: StatefulSet
  4. metadata:
  5. name: nginx
  6. labels:
  7. app: nginx
  8. spec:
  9. serviceName: nginx
  10. replicas: 1
  11. selector:
  12. matchLabels:
  13. app: nginx
  14. template:
  15. metadata:
  16. labels:
  17. app: nginx
  18. spec:
  19. terminationGracePeriodSeconds: 180
  20. initContainers:
  21. - name: init
  22. image: busybox
  23. command: ["chmod","777","-R","/var/www"]
  24. imagePullPolicy: Always
  25. volumeMounts:
  26. - name: volume
  27. mountPath: /var/www/html
  28. containers:
  29. - name: nginx
  30. image: nginx
  31. imagePullPolicy: Always
  32. ports:
  33. - containerPort: 80
  34. name: port
  35. volumeMounts:
  36. - name: volume
  37. mountPath: /var/www/html
  38. volumeClaimTemplates:
  39. - metadata:
  40. name: volume
  41. spec:
  42. accessModes: ["ReadWriteOnce"]
  43. storageClassName: rook-ceph
  44. resources:
  45. requests:
  46. storage: 1Gi
  47. ---
  48. apiVersion: v1
  49. kind: Service
  50. metadata:
  51. name: nginx
  52. labels:
  53. app: nginx
  54. spec:
  55. type: NodePort
  56. ports:
  57. - port: 80
  58. targetPort: 80
  59. selector:
  60. app: nginx

2、执行部署

  1. [root@k8s-master001 ingress-nginx]# kubectl apply -f demo.yaml
  2. statefulset.apps/nginx configured
  3. service/nginx created
  4. [root@k8s-master001 ~]# kubectl get po,svc
  5. NAME READY STATUS RESTARTS AGE
  6. pod/nginx-0 1/1 Running 0 21m
  7. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  8. service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d21h
  9. service/nginx NodePort 10.106.146.193 <none> 80:31389/TCP 21m
  10. [root@k8s-master001 ~]# curl -I 10.106.146.193
  11. HTTP/1.1 200 OK
  12. Server: nginx/1.19.2
  13. Date: Wed, 16 Sep 2020 07:03:26 GMT
  14. Content-Type: text/html
  15. Content-Length: 612
  16. Last-Modified: Tue, 11 Aug 2020 14:50:35 GMT
  17. Connection: keep-alive
  18. ETag: "5f32b03b-264"
  19. Accept-Ranges: bytes

3、nginx已经部署好,而且访问已经OK,接下来创建Ingress

demo-ingress.yaml

  1. ---
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: nginx
  6. annotations:
  7. kubernetes.io/ingress.class: nginx
  8. spec:
  9. rules:
  10. - host: nginx.text.cn
  11. http:
  12. paths:
  13. - path: /
  14. backend:
  15. serviceName: nginx
  16. servicePort: 80
  1. [root@k8s-master001 ~]# kubectl apply -f nginx-ingress.yaml
  2. error: error validating "nginx-ingress.yaml": error validating data: [ValidationError(Ingress.spec.rules[0].http.paths[0].backend): unknown field "serviceName" in io.k8s.api.networking.v1.IngressBackend, ValidationError(Ingress.spec.rules[0].http.paths[0].backend): unknown field "servicePort" in io.k8s.api.networking.v1.IngressBackend]; if you choose to ignore these errors, turn validation off with --validate=false

修改apiVersion为networking.k8s.io/v1

  1. ---
  2. apiVersion: networking.k8s.io/v1
  3. kind: Ingress
  4. metadata:
  5. name: nginx
  6. annotations:
  7. kubernetes.io/ingress.class: nginx
  8. spec:
  9. rules:
  10. - host: nginx.text.cn
  11. http:
  12. paths:
  13. - pathType: Prefix
  14. path: /
  15. backend:
  16. service:
  17. name: nginx
  18. port:
  19. number: 80
  1. [root@k8s-master001 ingress-nginx]# kubectl apply -f demo-ingress.yaml
  2. Error from server (InternalError): error when applying patch:
  3. {"metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"networking.k8s.io/v1\",\"kind\":\"Ingress\",\"metadata\":{\"annotations\":{\"kubernetes.io/ingress.class\":\"nginx\"},\"name\":\"nginx\",\"namespace\":\"default\"},\"spec\":{\"rules\":[{\"host\":\"nginx.ieasou.cn\",\"http\":{\"paths\":[{\"backend\":{\"service\":{\"name\":\"nginx\",\"port\":{\"number\":80}}},\"path\":\"/\",\"pathType\":\"Prefix\"}]}}]}}\n","kubernetes.io/ingress.class":"nginx"}},"spec":{"rules":[{"host":"nginx.ieasou.cn","http":{"paths":[{"backend":{"service":{"name":"nginx","port":{"number":80}}},"path":"/","pathType":"Prefix"}]}}]}}
  4. to:
  5. Resource: "networking.k8s.io/v1, Resource=ingresses", GroupVersionKind: "networking.k8s.io/v1, Kind=Ingress"
  6. Name: "nginx", Namespace: "default"
  7. for: "demo-ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/extensions/v1beta1/ingresses?timeout=30s": x509: certificate is valid for k8s-master002, kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster.local, not ingress-nginx-controller-admission.ingress-nginx.svc

还是不行。。。

解决办法1、把Webhook删了

admission webhook 传送门

  1. [root@k8s-master001 ingress-nginx]# kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
  2. validatingwebhookconfiguration.admissionregistration.k8s.io "ingress-nginx-admission" deleted

再来

  1. [root@k8s-master001 ingress-nginx]# kubectl apply -f demo-ingress.yaml
  2. ingress.networking.k8s.io/nginx configured

解决办法2、降级为0.32.0(未测)

传送门了解更多

4、现在来查看创建好的ingress,已经创建好了

  1. [root@k8s-master001 ingress-nginx]# kubectl get ing
  2. Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
  3. NAME CLASS HOSTS ADDRESS PORTS AGE
  4. nginx <none> nginx.ieasou.cn 10.26.25.21 80 3d19h

5、访问验证,现在在外部就可以通过域名nginx.text.cn访问到nginx了

  1. [root@k8s-master001 ingress-nginx]# vim /etc/hosts
  2. 10.26.25.21 nginx.text.cn
  3. [root@k8s-master001 ingress-nginx]# curl -I nginx.text.cn
  4. HTTP/1.1 200 OK
  5. Server: nginx/1.19.2
  6. Date: Wed, 16 Sep 2020 08:05:06 GMT
  7. Content-Type: text/html
  8. Content-Length: 612
  9. Connection: keep-alive
  10. Vary: Accept-Encoding
  11. Last-Modified: Tue, 11 Aug 2020 14:50:35 GMT
  12. ETag: "5f32b03b-264"
  13. Accept-Ranges: bytes

使用ingress-nginx暴露TCP服务

部署一个常用的redis服务,使用ingress-nginx暴露tcp服务

1、编写redis.yaml文件

  1. ---
  2. apiVersion: apps/v1
  3. kind: StatefulSet
  4. metadata:
  5. name: redis
  6. labels:
  7. app: redis
  8. spec:
  9. serviceName: redis
  10. replicas: 1
  11. selector:
  12. matchLabels:
  13. app: redis
  14. template:
  15. metadata:
  16. labels:
  17. app: redis
  18. spec:
  19. terminationGracePeriodSeconds: 180
  20. initContainers:
  21. - name: init
  22. image: busybox
  23. command: ["chmod","777","-R","/var/www"]
  24. imagePullPolicy: Always
  25. volumeMounts:
  26. - name: volume
  27. mountPath: /data
  28. containers:
  29. - name: redis
  30. image: redis
  31. imagePullPolicy: Always
  32. ports:
  33. - containerPort: 6379
  34. name: port
  35. volumeMounts:
  36. - name: volume
  37. mountPath: /data
  38. volumeClaimTemplates:
  39. - metadata:
  40. name: volume
  41. spec:
  42. accessModes: ["ReadWriteOnce"]
  43. storageClassName: rook-ceph
  44. resources:
  45. requests:
  46. storage: 1Gi
  47. ---
  48. apiVersion: v1
  49. kind: Service
  50. metadata:
  51. name: redis
  52. labels:
  53. app: redis
  54. spec:
  55. type: NodePort
  56. ports:
  57. - port: 6379
  58. targetPort: 6379
  59. selector:
  60. app: redis

查看并查看结果

  1. [root@k8s-master001 ingress-nginx]# kubectl apply -f redis.yaml
  2. [root@k8s-master001 ingress-nginx]# kubectl get po,svc
  3. NAME READY STATUS RESTARTS AGE
  4. pod/redis-0 1/1 Running 0 104s
  5. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  6. service/redis NodePort 10.98.28.146 <none> 80:32193/TCP 104s
  7. 测试连接redis,能够连接
  8. [root@k8s-master001 ingress-nginx]# telnet 10.26.25.20 32193
  9. Trying 10.26.25.20...
  10. Connected to 10.26.25.20.
  11. Escape character is '^]'.
  12. info
  13. $3615
  14. # Server
  15. redis_version:6.0.8

2、默认ingress-nginx的deploy.yaml部署文件并没有开启tcp服务支持,这里需要修改部署文件并重新部署。一般情形,如果需要支持tcp,udp等转发,提前规划并修改deploy.yaml文件

修改如下:--tcp-services-configmap,这里顺便把udp也开启了--udp-services-configmap

  1. containers:
  2. - name: controller
  3. image: scofield/ingress-nginx-controller:v0.35.0
  4. imagePullPolicy: IfNotPresent
  5. lifecycle:
  6. preStop:
  7. exec:
  8. command:
  9. - /wait-shutdown
  10. args:
  11. - /nginx-ingress-controller
  12. - --election-id=ingress-controller-leader
  13. - --ingress-class=nginx
  14. - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
  15. - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-service
  16. - --udp-services-configmap=$(POD_NAMESPACE)/udp-service
  17. - --validating-webhook=:8443
  18. - --validating-webhook-certificate=/usr/local/certificates/cert
  19. - --validating-webhook-key=/usr/local/certificates/key

重新部署ingress-nginx

  1. kubectl apply -f deploy.yaml

3、创建tcp服务需要的configmap,注意namespace一定要和ingress-nginx部署的namespace一致

tcp-service.yaml

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: tcp-service
  5. namespace: ingress-nginx
  6. data:
  7. 6379: "default/redis:6379"
  1. [root@k8s-master001 ingress-nginx]# kubectl apply -f tcp-service.yaml
  2. configmap/tcp-service created

4、创建redis-ingress.yaml文件

  1. ---
  2. apiVersion: networking.k8s.io/v1
  3. kind: Ingress
  4. metadata:
  5. name: redis
  6. annotations:
  7. kubernetes.io/ingress.class: nginx
  8. spec:
  9. rules:
  10. - host: redis.test.cn
  11. http:
  12. paths:
  13. - pathType: Prefix
  14. path: /
  15. backend:
  16. service:
  17. name: redis
  18. port:
  19. number: 6379

5、创建ingress

  1. kubectl apply -f redis-ingress.yaml
  2. [root@k8s-master001 ingress-nginx]# kubectl get ing
  3. NAME CLASS HOSTS ADDRESS PORTS AGE
  4. redis <none> redis.ieasou.cn 10.26.25.20 80 13m

6、验证

  1. [root@k8s-master001 ingress-nginx]# telnet redis.test.cn 6379
  2. Trying 10.26.25.20...
  3. Connected to redis.test.cn.
  4. Escape character is '^]'.
  5. info
  6. $3622
  7. # Server
  8. redis_version:6.0.8
  9. redis_git_sha1:00000000



更多用法,请移步

容器云平台No.8~kubernetes负载均衡之ingress-nginx的更多相关文章

  1. 容器云平台No.4~kubernetes 服务暴露之Ingress

    这是容器云平台第四篇,接上一篇继续, 首先kubernetes服务暴露有如下几种方式: NodePort Loadbalance ClusterIP Ingress 本文紧贴第一篇架构图,只介绍Ing ...

  2. 容器云平台No.9~kubernetes日志收集系统EFK

    EFK介绍 EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案. 通过EFK,可以把集群的所有日志收集到El ...

  3. 容器云平台No.7~kubernetes监控系统prometheus-operator

    简介 prometheus-operator Prometheus:一个非常优秀的监控工具或者说是监控方案.它提供了数据搜集.存储.处理.可视化和告警一套完整的解决方案.作为kubernetes官方推 ...

  4. 容器云平台No.3~kubernetes使用

    今天是是第三篇,接着上一篇继续 首先,通过kubectl可以看到,三个节点都正常运行 [root@k8s-master001 ~]# kubectl get no NAME STATUS ROLES ...

  5. Kubernetes容器云平台建设实践

    [51CTO.com原创稿件]Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.伴随着云原生技术的迅速崛起,如今Kubernetes 事实上已经 ...

  6. 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)

    [编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...

  7. 容器云平台No.1~基于Docker及Kubernetes构建的容器云平台

    开篇 最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了.算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件.首先来看下架构图(实在画的太丑 ...

  8. 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD

    什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...

  9. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

随机推荐

  1. 一张图带你玩转docker

  2. sge的简单的应用

    1.sge提交脚本qsub 1.qsub work.sh work.sh 不能以数字开头 2.qsub work.sh  默认工作路径为/home/username 3.qsub -cwd work. ...

  3. 如何为指定python解释器安装pip

    有时候我们通常会有很多python解释器,例如python2.python3.python(Anaconda). 参考链接:https://www.cnblogs.com/michaelcjl/p/1 ...

  4. First-Spike-Based Visual Categorization Using Reward-Modulated STDP

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Abstract 强化学习(RL)最近以击败欧洲围棋冠军等重大成就重新受到欢迎.在这里,我们第一次表明,RL可以有效地用于训练一个脉冲神经 ...

  5. SPSSAU数据分析思维培养系列2:分析方法

    大家好!在上篇文章中,我们一起学习了如何掌握正确的数据处理思维(文章链接:https://www.cnblogs.com/spssau/p/12523530.html).在完成数据准备和清理工作后,就 ...

  6. .NetCore使用Redis,StackExchange.Redis队列,发布与订阅,分布式锁的简单使用

    环境:之前一直是使用serverStack.Redis的客服端,今天来使用一下StackExchange.Redis(个人感觉更加的人性化一些,也是免费的,性能也不会差太多),版本为StackExch ...

  7. 3d相册展示

    示例代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta ...

  8. T4m

    Unity T4M 中文讲解 http://blog.csdn.net/tianmao111/article/details/46482963

  9. mac android 真机调试

    1.已经安装好Androidstudio或者eclipse 2.下载配置好Android Sdk等 3.将android手机通过USB数据线连接Mac,打开终端输入system_profiler SP ...

  10. 分布式事务和分布式hash

    分布式事务是什么? 分布式事务就是保证各个微服务之间数据一致,本质上就是保证不同数据库的数据一致性.一致性状态包含 强一致性,任何时刻,所有节点中数据都是一样的 弱一致性,数据更新后,只能访问到部分节 ...