前言

Kubernetes提供了两种内建的云端负载均衡机制(cloud load balancing)用于发布公共应用,一种是工作于传输层的Service资源,它实现的是“TCP负载均衡器”,另一种是Ingress资源,它实现的是“HTTP(S)负载均衡器”

  • TCP负载均衡器

    无论是iptables还是ipvs模型的Service资源都配置于Linux内核中的Netfilter之上进行四层调度,是一种类型更为通用的调度器,支持调度HTTPMySQL等应用层服务。不过,也正是由于工作于传输层从而使得它无法做到类似卸载HTTPS中的SSL会话等一类操作,也不支持基于URL的请求调度机制,而且,Kubernetes也不支持为此类负载均衡器配置任何类型的健康状态检查机制。

  • HTTP(S)负载均衡器

    HTTP(S)负载均衡器是应用层负载均衡机制的一种,支持根据环境做出更好的调度决策。与传输层调度器相比,它提供了诸如可自定义URL映射和TLS卸载等功能,并支持多种类型的后端服务器健康状态检查机制。

Ingress概述

什么是Ingress?

通常情况下,servicepod仅可在集群内部网络中通过IP地址访问。所有到达边界路由器的流量或被丢弃或被转发到其他地方。从概念上讲,可能像下面这样:

  1. internet
  2. |
  3. ------------
  4. [ Services ]

Ingress是授权入站连接到达集群服务的规则集合。

  1. internet
  2. |
  3. [ Ingress ]
  4. --|-----|--
  5. [ Services ]

你可以给Ingress配置提供外部可访问的URL、负载均衡、SSL、基于名称的虚拟主机等。用户通过POST Ingress资源到API Server的方式来请求IngressIngress controller负责实现Ingress,通常使用负载平衡器,它还可以配置边界路由和其他前端,这有助于以HA方式处理流量。

Ingress和Ingress Controller

IngressKubernetes API的标准资源类型之一,它其实就是一组基于DNS名称(host)或URL路径把请求转发至指定的Service资源的规则,用于将集群外部的请求流量转发至集群内部完成服务发布。然而,Ingress资源自身并不能进行“流量穿透”,它仅是一组路由规则的集合,这些规则要想真正发挥作用还需要其他功能的辅助,如监听某套接字,然后根据这些规则的匹配机制路由请求流量。这种能够为Ingress资源监听套接字并转发流量的组件称为Ingress控制器(Ingress Controller)。

Ingress控制器并不直接运行为kube-controller-manager的一部分,它是Kubernetes集群的一个重要组件,类似CoreDNS,需要在集群上单独部署。

Ingress工作流程

如下图所示,流量到达外部负载均衡器(externalLB)后,首先转发至Service资源Ingres-nginx上,然后通过Ingress控制器基于Ingress资源定义的规则将客户端请求流量直接转发至与Service对应的后端Pod资源之上。这种转发机制会绕过Service资源(app Serviceapi Service),从而省去了由kube-proxy实现的端口代理开销。Ingress规则需要由一个Service资源对象辅助识别相关的所有Pod资源。如下Ingress通过app service资源去匹配后端的pod1pod2;这个app service只是起到一个辅助识别功能。

先决条件

在使用Ingress resource之前,必须先了解下面几件事情。Ingressbeta版本的resource,在kubernetes1.1之前还没有。你需要一个Ingress Controller来实现Ingress,单纯的创建一个Ingress没有任何意义。

GCE/GKE会在master节点上部署一个Ingress Controller。你可以在一个Pod中部署任意个自定义的Ingress Controller。你必须正确的annotate每个Ingress,比如运行多个Ingress Controller和关闭glbc

Ingress清单文件几个字段说明

Ingress资源是基于HTTP虚拟主机或URL的转发规则,spec字段中嵌套了rulesbackendtls等字段进行定义。下面这个示例中,它包含了一个转发规则,把发往www.ilinux.io的请求代理给名为myapp-svcService资源。

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: ingress-demo
  5. namespace: default
  6. annotations:
  7. kubernetes.io/ingress.class: "nginx"
  8. spec:
  9. rules:
  10. - host: www.ilinux.io
  11. http:
  12. paths:
  13. - backend:
  14. serviceName: myapp-svc
  15. servicePort: 80
  16.  
  17. #说明:上面资源清单文件中的annotations用于识别其所属的Ingress控制器的类别,这一点在集群上部署多个Ingress控制器时尤为重要。

Ingress Spec# kubectl explain ingress.spec)中的字段是定义Ingress资源的核心组成部分,主要嵌套如下三个字段:

  • rules <[]Object>:用于定义当前Ingress资源的转发规则列表;未由rules定义规则,或者没有匹配到任何规则时,所有流量都会转发到由backend定义的默认后端。

  • backend <Object>:默认的后端用于服务那些没有匹配到任何规则的请求;定义Ingress资源时,至少应该定义backendrules两者之一;此字段用于让负载均衡器指定一个全局默认的后端。

  • tls <[]Object>:TLS配置,目前仅支持通过默认端口443提供服务;如果要配置指定的列表成员指向了不同的主机,则必须通过SNI TLS扩展机制来支持此功能。

ingress.spec.rules.http.paths.backend对象的定义由两个必须的内嵌字段组成:serviceNameservicePort,分别用于指定流量转发的后端目标Service资源的名称和端口。

部署Ingress Controller(Nginx)

描述

Ingress 控制器自身是运行于Pod中的容器应用,一般是NginxEnvoy一类的具有代理及负载均衡功能的守护进程,它监视着来自API ServerIngress对象状态,并根据规则生成相应的应用程序专有格式的配置文件并通过重载或重启守护进程而使新配置生效。

Ingress控制器其实就是托管于Kubernetes系统之上的用于实现在应用层发布服务的Pod资源,跟踪Ingress资源并实时生成配置规则。

运行为Pod资源的Ingress控制器进程通过下面两种方式接入外部请求流量:

1、以Deployment控制器管理Ingress控制器的Pod资源,通过NodePortLoadBalancer类型的Service对象为其接入集群外部的请求流量,这就意味着,定义一个Ingress控制器时,必须在其前端定义一个专用的Service资源。

2、借助于DaemonSet控制器,将Ingress控制器的Pod资源各自以单一实例的方式运行于集群的所有或部分工作节点之上,并配置这类Pod对象以HostPort(如下图中的a)或HostNetwork(如下图中的b)的方式在当前节点接入外部流量。

部署

Ingress-nginx官网

Ingress-nginx GitHub仓库地址

Ingress安装文档

1)在github上下载配置清单yaml文件,并创建部署

  1. [root@k8s-master ~]# mkdir ingress-nginx #这里创建一个目录专门用于ingress-nginx(可省略)
  2. [root@k8s-master ~]# cd ingress-nginx/
  3. [root@k8s-master ingress-nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml #下载配置清单yaml文件
  4. [root@k8s-master ingress-nginx]# ls #查看下载的文件
  5. mandatory.yaml
  6.  
  7. [root@k8s-master ingress-nginx]# kubectl apply -f mandatory.yaml #创建Ingress
  8. namespace/ingress-nginx created
  9. configmap/nginx-configuration created
  10. configmap/tcp-services created
  11. configmap/udp-services created
  12. serviceaccount/nginx-ingress-serviceaccount created
  13. clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
  14. role.rbac.authorization.k8s.io/nginx-ingress-role created
  15. rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
  16. clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
  17. deployment.apps/nginx-ingress-controller created

2)验证

  1. [root@k8s-master ingress-nginx]# kubectl get pods -n ingress-nginx #查看生成的pod,注意这里在ingress-nginx名称空间
  2. NAME READY STATUS RESTARTS AGE
  3. nginx-ingress-controller-79f6884cf6-5fb6v 1/1 Running 0 18m
  4. [root@k8s-master ingress-nginx]# kubectl describe pod nginx-ingress-controller-79f6884cf6-5fb6v -n ingress-nginx 查看该pod的详细信息
  5. Name: nginx-ingress-controller-79f6884cf6-5fb6v
  6. Namespace: ingress-nginx
  7. Priority: 0
  8. Node: k8s-node2/192.168.1.33
  9. Start Time: Fri, 27 Sep 2019 17:53:07 +0800
  10. Labels: app.kubernetes.io/name=ingress-nginx
  11. app.kubernetes.io/part-of=ingress-nginx
  12. pod-template-hash=79f6884cf6
  13. Annotations: prometheus.io/port: 10254
  14. prometheus.io/scrape: true
  15. Status: Running
  16. IP: 10.244.2.73
  17. ......

3)如果是裸机部署,还需要安装service。(比如VMware虚拟机、硬件服务器等)

  1. ---同样去官网下载配置清单文件,也可以自定义创建。
  2. [root@k8s-master ingress-nginx]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/service-nodeport.yaml
  3. [root@k8s-master ingress-nginx]# kubectl apply -f service-nodeport.yaml #创建service资源
  4. service/ingress-nginx created
  5. [root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginx #查看service资源
  6. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  7. ingress-nginx NodePort 10.107.40.182 <none> 80:32699/TCP,443:30842/TCP 9s
  8. [root@k8s-master ingress-nginx]# kubectl describe svc/ingress-nginx -n ingress-nginx #查看该service的详细信息
  9. Name: ingress-nginx
  10. Namespace: ingress-nginx
  11. Labels: app.kubernetes.io/name=ingress-nginx
  12. app.kubernetes.io/part-of=ingress-nginx
  13. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  14. {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/par...
  15. Selector: app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx
  16. Type: NodePort
  17. IP: 10.107.40.182
  18. Port: http 80/TCP
  19. TargetPort: 80/TCP
  20. NodePort: http 32699/TCP
  21. Endpoints: 10.244.2.73:80
  22. Port: https 443/TCP
  23. TargetPort: 443/TCP
  24. NodePort: https 30842/TCP
  25. Endpoints: 10.244.2.73:443
  26. Session Affinity: None
  27. External Traffic Policy: Cluster
  28. Events: <none>

通过上面创建的service资源对象可以看出,随机分配的httpNodePort32668httpsNodePort的为30606。该端口也可以自定义,在前面的service章节说过。单一般不建议自定义。

示例1:使用Ingress发布Nginx

该示例中创建的所有资源都位于新建的testing名称空间中。与其他的资源在逻辑上进行隔离,以方便管理。

首先创建一个单独的目录为了方便管理

  1. [root@k8s-master ~]# mkdir ingress-nginx/ingress
  2. [root@k8s-master ~]# cd ingress-nginx/ingress/

(1)、创建testing名称空间(也可以使用命令直接创建# kubectl create namespace my-namespace,不过这里使用资源清单格式创建)

  1. [root@k8s-master ingress]# vim namespace-testing.yaml #编写namespace清单文件
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. name: testing
  6. labels:
  7. env: testing
  8. [root@k8s-master ingress]#
  9. [root@k8s-master ingress]# kubectl apply -f namespace-testing.yaml #创建namespace
  10. namespace/testing created
  11. [root@k8s-master ingress]#
  12. [root@k8s-master ingress]# kubectl get namespace testing #验证
  13. NAME STATUS AGE
  14. testing Active 12s

(2)、部署nginx实例,这里使用Deployment控制器于testing中部署nginx相关的Pod对象。

  1. [root@k8s-master ingress]# vim deployment-nginx.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: deploy-nginx
  6. namespace: testing
  7. spec:
  8. replicas: 3
  9. selector:
  10. matchLabels:
  11. app: nginx
  12. template:
  13. metadata:
  14. labels:
  15. app: nginx
  16. spec:
  17. containers:
  18. - name: nginx
  19. image: nginx:1.12
  20. ports:
  21. - name: http
  22. containerPort: 80
  23. [root@k8s-master ingress]#
  24. [root@k8s-master ingress]# kubectl apply -f deployment-nginx.yaml
  25. deployment.apps/deploy-nginx created
  26. [root@k8s-master ingress]#
  27. [root@k8s-master ingress]# kubectl get deploy -n testing
  28. NAME READY UP-TO-DATE AVAILABLE AGE
  29. deploy-nginx 3/3 3 3 5s
  30. [root@k8s-master ingress]#
  31. [root@k8s-master ingress]# kubectl get pods -n testing
  32. NAME READY STATUS RESTARTS AGE
  33. deploy-nginx-686bddcb56-9g7pq 1/1 Running 0 6s
  34. deploy-nginx-686bddcb56-gqpm2 1/1 Running 0 6s
  35. deploy-nginx-686bddcb56-vtwkq 1/1 Running 0 6s

(3)、创建Service资源,关联后端的Pod资源。这里通过service资源svc-nginx80端口去暴露容器的80端口。

  1. [root@k8s-master ingress]# vim service-nginx.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: svc-nginx
  6. namespace: testing
  7. labels:
  8. app: svc-nginx
  9. spec:
  10. selector:
  11. app: nginx
  12. ports:
  13. - name: http
  14. port: 80
  15. targetPort: 80
  16. protocol: TCP
  17. [root@k8s-master ingress]#
  18. [root@k8s-master ingress]# kubectl apply -f service-nginx.yaml
  19. service/svc-nginx created
  20. [root@k8s-master ingress]#
  21. [root@k8s-master ingress]# kubectl get svc -n testing
  22. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  23. svc-nginx ClusterIP 10.99.233.90 <none> 80/TCP 6s
  24. [root@k8s-master ingress]#
  25. [root@k8s-master ingress]# kubectl describe svc/svc-nginx -n testing
  26. Name: svc-nginx
  27. Namespace: testing
  28. Labels: app=svc-nginx
  29. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  30. {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"svc-nginx"},"name":"svc-nginx","namespace":"testing"},"s...
  31. Selector: app=nginx
  32. Type: ClusterIP
  33. IP: 10.99.233.90
  34. Port: http 80/TCP
  35. TargetPort: 80/TCP
  36. Endpoints: 10.244.1.76:80,10.244.1.77:80,10.244.2.74:80
  37. Session Affinity: None
  38. Events: <none>

(4)、创建Ingress资源,匹配Service资源svc-nginx,并将svc-nginx的80端口暴露。

  1. [root@k8s-master ingress]# vim ingress-nginx.yaml
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: nginx
  6. namespace: testing
  7. annotations:
  8. kubernetes.io/ingress.class: "nginx"
  9. spec:
  10. rules:
  11. - host: nginx.ilinux.io
  12. http:
  13. paths:
  14. - path:
  15. backend:
  16. serviceName: svc-nginx
  17. servicePort: 80
  18. [root@k8s-master ingress]#
  19. [root@k8s-master ingress]# kubectl apply -f ingress-nginx.yaml
  20. ingress.extensions/nginx created
  21. [root@k8s-master ingress]#
  22. [root@k8s-master ingress]# kubectl get ingress -n testing
  23. NAME HOSTS ADDRESS PORTS AGE
  24. nginx nginx.ilinux.io 80 16s
  25. [root@k8s-master ingress]#
  26. [root@k8s-master ingress]# kubectl describe ingress -n testing
  27. Name: nginx
  28. Namespace: testing
  29. Address:
  30. Default backend: default-http-backend:80 (<none>)
  31. Rules:
  32. Host Path Backends
  33. ---- ---- --------
  34. tomcat.ilinux.io
  35. svc-nginx:80 (10.244.1.76:80,10.244.1.77:80,10.244.2.74:80)
  36. Annotations:
  37. kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx"},"name":"nginx","namespace":"testing"},"spec":{"rules":[{"host":"nginx.ilinux.io","http":{"paths":[{"backend":{"serviceName":"svc-nginx","servicePort":80},"path":null}]}}]}}
  38.  
  39. kubernetes.io/ingress.class: nginx
  40. Events: <none>

(5)、测试,通过Ingress控制器的前端的Service资源的NodePort来访问此服务,

  1. #首先查看前面部署Ingress控制器的前端的Service资源的映射端口
  2. [root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginx
  3. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. ingress-nginx NodePort 10.107.40.182 <none> 80:32699/TCP,443:30842/TCP 3m59s
  5.  
  6. #终端测试,添加hosts
  7. [root@k8s-master ~]# cat /etc/hosts
  8. 192.168.1.31 k8s-master nginx.ilinux.io
  9. 192.168.1.32 k8s-node1 nginx.ilinux.io
  10. 192.168.1.33 k8s-node2 nginx.ilinux.io
  11. #访问测试
  12. [root@k8s-master ~]# curl nginx.ilinux.io:32699
  13. <!DOCTYPE html>
  14. <html>
  15. <head>
  16. <title>Welcome to nginx!</title>
  17. <style>
  18. ......

验证是否调度到后端的Pod资源,查看日志

  1. [root@k8s-master ~]# kubectl get pods -n testing
  2. NAME READY STATUS RESTARTS AGE
  3. deploy-nginx-686bddcb56-9g7pq 1/1 Running 0 56m
  4. deploy-nginx-686bddcb56-gqpm2 1/1 Running 0 56m
  5. deploy-nginx-686bddcb56-vtwkq 1/1 Running 0 56m
  6. [root@k8s-master ~]# kubectl logs deploy-nginx-686bddcb56-9g7pq -n testing
  7. 10.244.2.75 - - [28/Sep/2019:02:33:45 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.29.0" "10.244.0.0"
  8. 10.244.2.75 - - [28/Sep/2019:02:44:02 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" "10.244.0.0"

(6)、配置TLS Ingress资源(这里使用自签证书)

  1. 1)生成key
  2. [root@k8s-master ingress]# openssl genrsa -out tls.key 2048
  3. 2)生成证书
  4. [root@k8s-master ingress]# openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=ShenZhen/L=ShenZhen/O=DevOps/CN=nginx.ilinux.io -days 3650
  5.  
  6. 3)创建secret资源
  7. [root@k8s-master ingress]# kubectl create secret tls nginx-ingress-secret --cert=tls.crt --key=tls.key -n testing
  8. secret/nginx-ingress-secret created
  9. [root@k8s-master ingress]# kubectl get secret -n testing
  10. NAME TYPE DATA AGE
  11. default-token-lfzrt kubernetes.io/service-account-token 3 116m
  12. nginx-ingress-secret kubernetes.io/tls 2 16s
  13.  
  14. 4)编写Ingress资源清单文件
  15. [root@k8s-master ingress]# vim ingress-nginx-https.yaml
  16. apiVersion: extensions/v1beta1
  17. kind: Ingress
  18. metadata:
  19. name: nginx-ingress-tls
  20. namespace: testing
  21. annotations:
  22. kubernetes.io/ingress.class: "nginx"
  23. spec:
  24. tls:
  25. - hosts:
  26. - nginx.ilinux.io
  27. secretName: nginx-ingress-secret
  28. rules:
  29. - host: nginx.ilinux.io
  30. http:
  31. paths:
  32. - path: /
  33. backend:
  34. serviceName: svc-nginx
  35. servicePort: 80
  36.  
  37. 5)查看Ingress资源信息
  38. [root@k8s-master ingress]# kubectl get ingress -n testing
  39. NAME HOSTS ADDRESS PORTS AGE
  40. nginx nginx.ilinux.io 80 66m
  41. nginx-ingress-tls nginx.ilinux.io 80, 443 15s
  42. [root@k8s-master ingress]# kubectl describe ingress/nginx-ingress-tls -n testing
  43. Name: nginx-ingress-tls
  44. Namespace: testing
  45. Address:
  46. Default backend: default-http-backend:80 (<none>)
  47. TLS:
  48. nginx-ingress-secret terminates nginx.ilinux.io
  49. Rules:
  50. Host Path Backends
  51. ---- ---- --------
  52. nginx.ilinux.io
  53. / svc-nginx:80 (10.244.1.76:80,10.244.1.77:80,10.244.2.74:80)
  54. Annotations:
  55. kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{"kubernetes.io/ingress.class":"nginx"},"name":"nginx-ingress-tls","namespace":"testing"},"spec":{"rules":[{"host":"nginx.ilinux.io","http":{"paths":[{"backend":{"serviceName":"svc-nginx","servicePort":80},"path":"/"}]}}],"tls":[{"hosts":["nginx.ilinux.io"],"secretName":"nginx-ingress-secret"}]}}
  56.  
  57. kubernetes.io/ingress.class: nginx
  58. Events:
  59. Type Reason Age From Message
  60. ---- ------ ---- ---- -------
  61. Normal CREATE 64s nginx-ingress-controller Ingress testing/nginx-ingress-tls

(7)、测试https(这里由于是自签,所以上面提示不安全)

  1. #首先查看前面部署Ingress控制器的前端的Service资源的映射端口
  2. [root@k8s-master ingress-nginx]# kubectl get svc -n ingress-nginx
  3. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  4. ingress-nginx NodePort 10.107.40.182 <none> 80:32699/TCP,443:30842/TCP 3m59s

示例2:使用Ingress发布多个服务

将不同的服务映射不同的主机上

准备工作:这里创建一个目录保存本示例的所有资源配置清单

  1. [root@k8s-master ~]# mkdir ingress-nginx/multi_svc
  2. [root@k8s-master ~]# cd !$

创建名称空间

创建一个名称空间保存本示例的所有对象(方便管理)

  1. [root@k8s-master multi_svc]# vim namespace-ms.yaml #编写配置清单文件
  2. apiVersion: v1
  3. kind: Namespace
  4. metadata:
  5. name: multisvc
  6. labels:
  7. env: multisvc
  8.  
  9. [root@k8s-master multi_svc]# kubectl apply -f namespace-ms.yaml #创建上面定义的名称空间
  10. namespace/multisvc created
  11.  
  12. [root@k8s-master multi_svc]# kubectl get namespace multisvc #查看名称空间
  13. NAME STATUS AGE
  14. multisvc Active 9s

创建后端应用和Service

这里后端应用创建为一组nginx应用和一组tomcat应用

1)编写资源清单文件,这里将service资源对象和deployment控制器写在这一个文件里

  1. [root@k8s-master multi_svc]# vim deploy_service-ms.yaml
  2. #tomcat应用的Deployment控制器
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6. name: tomcat-deploy
  7. namespace: multisvc
  8. spec:
  9. replicas: 3
  10. selector:
  11. matchLabels:
  12. app: tomcat
  13. template:
  14. metadata:
  15. labels:
  16. app: tomcat
  17. spec:
  18. containers:
  19. - name: tomcat
  20. image: tomcat:jdk8
  21. imagePullPolicy: IfNotPresent
  22. ports:
  23. - name: httpport
  24. containerPort: 8080
  25. - name: ajpport
  26. containerPort: 8009
  27. ---
  28. #tomcat应用的Service资源
  29. apiVersion: v1
  30. kind: Service
  31. metadata:
  32. name: tomcat-svc
  33. namespace: multisvc
  34. labels:
  35. app: tomcat-svc
  36. spec:
  37. selector:
  38. app: tomcat
  39. ports:
  40. - name: httpport
  41. port: 8080
  42. targetPort: 8080
  43. protocol: TCP
  44. - name: ajpport
  45. port: 8009
  46. targetPort: 8009
  47. protocol: TCP
  48.  
  49. ---
  50. #nginx应用的Deployment控制器
  51. apiVersion: apps/v1
  52. kind: Deployment
  53. metadata:
  54. name: nginx-deploy
  55. namespace: multisvc
  56. spec:
  57. replicas: 3
  58. selector:
  59. matchLabels:
  60. app: nginx
  61. template:
  62. metadata:
  63. labels:
  64. app: nginx
  65. spec:
  66. containers:
  67. - name: nginx
  68. image: nginx:1.12
  69. imagePullPolicy: IfNotPresent
  70. ports:
  71. - name: http
  72. containerPort: 80
  73. ---
  74. #nginx应用的Service资源
  75. apiVersion: v1
  76. kind: Service
  77. metadata:
  78. name: nginx-svc
  79. namespace: multisvc
  80. labels:
  81. app: nginx-svc
  82. spec:
  83. selector:
  84. app: nginx
  85. ports:
  86. - name: http
  87. port: 80
  88. targetPort: 80
  89. protocol: TCP

2)创建上面定义资源对象并查看验证

  1. [root@k8s-master multi_svc]# kubectl apply -f deploy_service-ms.yaml
  2. deployment.apps/tomcat-deploy created
  3. service/tomcat-svc created
  4. deployment.apps/nginx-deploy created
  5. service/nginx-svc created
  6. [root@k8s-master multi_svc]# kubectl get pods -n multisvc -o wide #查看pod资源
  7. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  8. nginx-deploy-86c667ff66-hl6rx 1/1 Running 0 13s 10.244.2.78 k8s-node2 <none> <none>
  9. nginx-deploy-86c667ff66-hx4j8 1/1 Running 0 13s 10.244.2.77 k8s-node2 <none> <none>
  10. nginx-deploy-86c667ff66-tl9mm 1/1 Running 0 13s 10.244.1.79 k8s-node1 <none> <none>
  11. tomcat-deploy-6484688ddc-n25hn 1/1 Running 0 13s 10.244.1.78 k8s-node1 <none> <none>
  12. tomcat-deploy-6484688ddc-s8dts 1/1 Running 0 13s 10.244.1.80 k8s-node1 <none> <none>
  13. tomcat-deploy-6484688ddc-snszk 1/1 Running 0 13s 10.244.2.76 k8s-node2 <none> <none>
  14. [root@k8s-master multi_svc]# kubectl get svc -n multisvc #查看service资源对象
  15. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  16. nginx-svc ClusterIP 10.104.213.237 <none> 80/TCP 26s
  17. tomcat-svc ClusterIP 10.103.75.161 <none> 8080/TCP,8009/TCP 26s
  18.  
  19. [root@k8s-master multi_svc]# kubectl describe svc/nginx-svc -n multisvc #查看service对象nginx-svc的详细信息
  20. Name: nginx-svc
  21. Namespace: multisvc
  22. Labels: app=nginx-svc
  23. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  24. {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx-svc"},"name":"nginx-svc","namespace":"multisvc"},"...
  25. Selector: app=nginx
  26. Type: ClusterIP
  27. IP: 10.104.213.237
  28. Port: http 80/TCP
  29. TargetPort: 80/TCP
  30. Endpoints: 10.244.1.79:80,10.244.2.77:80,10.244.2.78:80
  31. Session Affinity: None
  32. Events: <none>
  33.  
  34. [root@k8s-master multi_svc]# kubectl describe svc/tomcat-svc -n multisvc #查看service对象tomcat-svc的详细信息
  35. Name: tomcat-svc
  36. Namespace: multisvc
  37. Labels: app=tomcat-svc
  38. Annotations: kubectl.kubernetes.io/last-applied-configuration:
  39. {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"tomcat-svc"},"name":"tomcat-svc","namespace":"multisvc"}...
  40. Selector: app=tomcat
  41. Type: ClusterIP
  42. IP: 10.103.75.161
  43. Port: httpport 8080/TCP
  44. TargetPort: 8080/TCP
  45. Endpoints: 10.244.1.78:8080,10.244.1.80:8080,10.244.2.76:8080
  46. Port: ajpport 8009/TCP
  47. TargetPort: 8009/TCP
  48. Endpoints: 10.244.1.78:8009,10.244.1.80:8009,10.244.2.76:8009
  49. Session Affinity: None
  50. Events: <none>

创建Ingress资源对象

1)编写资源清单文件

  1. [root@k8s-master multi_svc]# vim ingress_host-ms.yaml
  2. apiVersion: extensions/v1beta1
  3. kind: Ingress
  4. metadata:
  5. name: multi-ingress
  6. namespace: multisvc
  7. spec:
  8. rules:
  9. - host: nginx.imyapp.com
  10. http:
  11. paths:
  12. - path: /
  13. backend:
  14. serviceName: nginx-svc
  15. servicePort: 80
  16. - host: tomcat.imyapp.com
  17. http:
  18. paths:
  19. - path: /
  20. backend:
  21. serviceName: tomcat-svc
  22. servicePort: 8080

2)创建上面定义资源对象并查看验证

  1. [root@k8s-master multi_svc]# kubectl apply -f ingress_host-ms.yaml
  2. ingress.extensions/multi-ingress created
  3. [root@k8s-master multi_svc]# kubectl get ingress -n multisvc #查看ingress资源对象
  4. NAME HOSTS ADDRESS PORTS AGE
  5. multi-ingress nginx.imyapp.com,tomcat.imyapp.com 80 18s
  6.  
  7. [root@k8s-master multi_svc]# kubectl describe ingress/multi-ingress -n multisvc #查看ingress资源multi-ingrsss的详细信息
  8. Name: multi-ingress
  9. Namespace: multisvc
  10. Address:
  11. Default backend: default-http-backend:80 (<none>)
  12. Rules:
  13. Host Path Backends
  14. ---- ---- --------
  15. nginx.imyapp.com
  16. / nginx-svc:80 (10.244.1.79:80,10.244.2.77:80,10.244.2.78:80)
  17. tomcat.imyapp.com
  18. / tomcat-svc:8080 (10.244.1.78:8080,10.244.1.80:8080,10.244.2.76:8080)
  19. Annotations:
  20. kubectl.kubernetes.io/last-applied-configuration: {"apiVersion":"extensions/v1beta1","kind":"Ingress","metadata":{"annotations":{},"name":"multi-ingress","namespace":"multisvc"},"spec":{"rules":[{"host":"nginx.imyapp.com","http":{"paths":[{"backend":{"serviceName":"nginx-svc","servicePort":80},"path":"/"}]}},{"host":"tomcat.imyapp.com","http":{"paths":[{"backend":{"serviceName":"tomcat-svc","servicePort":8080},"path":"/"}]}}]}}
  21.  
  22. Events:
  23. Type Reason Age From Message
  24. ---- ------ ---- ---- -------
  25. Normal CREATE 39s nginx-ingress-controller Ingress multisvc/multi-ingress

测试访问

这是测试自定义的域名,故需要配置host

  1. 192.168.1.31 nginx.imyapp.com tomcat.imyapp.com
  2. 192.168.1.32 nginx.imyapp.com tomcat.imyapp.com
  3. 192.168.1.33 nginx.imyapp.com tomcat.imyapp.com

查看部署的IngressService对象的端口

  1. [root@k8s-master multi_svc]# kubectl get svc -n ingress-nginx
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. ingress-nginx NodePort 10.107.40.182 <none> 80:32699/TCP,443:30842/TCP 6h39m

访问nginx.imyapp.com:32699

访问tomcat.imyapp.com:32699

配置Ingress处理TLS传输

这里使用自签证书,通过OpenSSL进行创建

1)创建证书

  1. #创建nginx.imyapp.com域名的证书
  2. [root@k8s-master multi_svc]# openssl genrsa -out nginx.imyapp.com.key 2048
  3. [root@k8s-master multi_svc]# openssl req -new -x509 -key nginx.imyapp.com.key -out nginx.imyapp.com.crt -subj /C=CN/ST=ShenZhen/L=ShenZhen/O=DevOps/CN=nginx.imyapp.com -days 3650
  4.  
  5. #创建tomcat.imyapp.com域名的证书
  6. [root@k8s-master multi_svc]# openssl genrsa -out tomcat.imyapp.com.key 2048
  7. [root@k8s-master multi_svc]# openssl req -new -x509 -key tomcat.imyapp.com.key -out tomcat.imyapp.com.crt -subj /C=CN/ST=ShenZhen/L=ShenZhen/O=DevOps/CN=tomcat.imyapp.com -days 3650
  8.  
  9. #查看生成的证书
  10. [root@k8s-master multi_svc]# ll *.com.*
  11. -rw-r--r-- 1 root root 1298 9 28 17:23 nginx.imyapp.com.crt
  12. -rw-r--r-- 1 root root 1675 9 28 17:22 nginx.imyapp.com.key
  13. -rw-r--r-- 1 root root 1302 9 28 17:24 tomcat.imyapp.com.crt
  14. -rw-r--r-- 1 root root 1679 9 28 17:24 tomcat.imyapp.com.key

2)创建secrte

  1. #创建nginx域名的secret
  2. [root@k8s-master multi_svc]# kubectl create secret tls nginx-ingress-secret --cert=nginx.imyapp.com.crt --key=nginx.imyapp.com.key -n multisvc
  3. secret/nginx-ingress-secret created
  4.  
  5. #创建tomcat域名的secret
  6. [root@k8s-master multi_svc]# kubectl create secret tls tomcat-ingress-secret --cert=tomcat.imyapp.com.crt --key=tomcat.imyapp.com.key -n multisvc
  7. secret/tomcat-ingress-secret created
  8.  
  9. #查看secret
  10. [root@k8s-master multi_svc]# kubectl get secret -n multisvc
  11. NAME TYPE DATA AGE
  12. default-token-mf5wd kubernetes.io/service-account-token 3 5h12m
  13. nginx-ingress-secret kubernetes.io/tls 2 53s
  14. tomcat-ingress-secret kubernetes.io/tls 2 27s

3)编写带TLSIngress资源清单(这里通过复制,没有删除上面创建的ingress

  1. [root@k8s-master multi_svc]# cp ingress_host-ms.yaml ingress_host_https-ms.yaml
  2. [root@k8s-master multi_svc]# vim ingress_host_https-ms.yaml
  3. apiVersion: extensions/v1beta1
  4. kind: Ingress
  5. metadata:
  6. name: multi-ingress-https
  7. namespace: multisvc
  8. annotations:
  9. kubernetes.io/ingress.class: "nginx"
  10. spec:
  11. tls:
  12. - hosts:
  13. - nginx.imyapp.com
  14. secretName: nginx-ingress-secret
  15. - hosts:
  16. - tomcat.imyapp.com
  17. secretName: tomcat-ingress-secret
  18. rules:
  19. - host: nginx.imyapp.com
  20. http:
  21. paths:
  22. - path: /
  23. backend:
  24. serviceName: nginx-svc
  25. servicePort: 80
  26. - host: tomcat.imyapp.com
  27. http:
  28. paths:
  29. - path: /
  30. backend:
  31. serviceName: tomcat-svc
  32. servicePort: 8080

4)创建ingress资源

  1. [root@k8s-master multi_svc]# kubectl apply -f ingress_host_https-ms.yaml
  2. ingress.extensions/multi-ingress-https created
  3. [root@k8s-master multi_svc]# kubectl get ingress -n multisvc
  4. NAME HOSTS ADDRESS PORTS AGE
  5. multi-ingress nginx.imyapp.com,tomcat.imyapp.com 80 44m
  6. multi-ingress-https nginx.imyapp.com,tomcat.imyapp.com 80, 443 3s

5)测试,通过Ingress控制器的前端的Service资源的NodePort来访问此服务,上面看到ingress控制器的service资源的443端口对应的节点的30842端口。

访问nginx

访问tomcat

将不同的服务映射到相同主机的不同路径

在这种情况下,根据请求的URL中的路径,请求将发送到两个不同的服务。因此,客户端可以通过一个IP地址(Ingress 控制器的IP地址)访问两种不同的服务。

注意:这里Ingresspath的定义,需要与后端真实Service提供的Path一致,否则将被转发到一个不存在的path上,引发错误。

Ingress定义示例

  1. apiVersion: extensions/v1beta1
  2. kind: Ingress
  3. metadata:
  4. name: tomcat-ingress
  5. namespace: multisvc
  6. spec:
  7. rules:
  8. - host: www.imyapp.com
  9. http:
  10. paths:
  11. - path: /nginx
  12. backend:
  13. serviceName: nginx-svc
  14. servicePort: 80
  15. - path: /tomcat
  16. backend:
  17. serviceName: tomcat-svc
  18. servicePort: 8080

(八)Kubernetes Ingress资源的更多相关文章

  1. Kubernetes Ingress Controller的使用及高可用落地

    Kubernetes Ingress Controller的使用及高可用落地 看懂本文要具备一下知识点: Service实现原理和会应用 知道反向代理原理,了解nginx和apache的vhost概念 ...

  2. Kubernetes Ingress 学习

    Kubernetes 中暴露服务的方式有三种 Loadbalancer 这种方式往往需要云供应商支持,或者本地F5等设备支持 NodePort 这种方式调用方通过NodeIP:NodePort 的方式 ...

  3. Kubernetes Ingress管理

    目录 Ingress介绍 1.Pod漂移问题 2.端口管理问题 3.域名分配及动态更新问题 Nginx Ingress配置 1.部署默认后端 2.部署Ingress Controller 3.部署In ...

  4. Kubernetes – Ingress

    用户在 Kubernetes 上部署的服务一般运行于私有网络,Pod和Service 提供了 hostPort,NodePort等参数用于暴露这些服务端口到K8S节点上,供使用者访问.这样的方法有明显 ...

  5. kubernetes学习资源

    参考文章: 1.kubernetes学习资源 1. <Kubernetes与云原生应用>系列之Kubernetes的系统架构与设计理念 2.[docker专业介绍的网站dockerinfo ...

  6. k8s的ingress资源简述

    ingress controller是独立与controller-manager的Ingress的主要作用是可以利用nginx,haproxy,envoy,traefik等负载均衡器来暴露集群内部服务 ...

  7. [转帖]kubernetes ingress 在物理机上的nodePort和hostNetwork两种部署方式解析及比较

    kubernetes ingress 在物理机上的nodePort和hostNetwork两种部署方式解析及比较 https://www.cnblogs.com/xuxinkun/p/11052646 ...

  8. Kubernetes Ingress日志分析入门

    本文主要介绍如何基于日志服务构建Kubernetes Ingress日志分析平台,并提供一些简单的动手实验方便大家快速了解日志服务相关功能. 部署Ingress日志方案 登录容器服务管理控制台. 将上 ...

  9. Kubernetes Ingress简单入门

    作者:Nick Ramirez 原文链接:https://thenewstack.io/kubernetes-ingress-for-beginners/ 本文转载自Rancher Labs 不知道你 ...

随机推荐

  1. nginx lnmp之nginx+php

    配置如下(在server部分添加): location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; ...

  2. Ubuntu 16.04安装ANSYS 2019 R1

    参考:<ANSYS15.0 for Linux下载及安装教程> 参考链接: https://wenku.baidu.com/view/92bdf21b312b3169a451a4b5.ht ...

  3. rabbitmq安装集群

    centos 7.3 64 172.18.39.241 k8s-mini-241172.18.39.242 k8s-mini-242172.18.39.243 k8s-master-243 vim / ...

  4. Spring Boot启动命令参数详解及源码分析

    使用过Spring Boot,我们都知道通过java -jar可以快速启动Spring Boot项目.同时,也可以通过在执行jar -jar时传递参数来进行配置.本文带大家系统的了解一下Spring ...

  5. 避免因为Arcgis Server服务设置不当导致Oracle Process溢出的方法

    我之前写过一篇文章<arcsoc进程无限增长导致oracle processes溢出>(见链接:https://www.cnblogs.com/6yuhang/p/9379086.html ...

  6. 「UNR#2」黎明前的巧克力

    「UNR#2」黎明前的巧克力 解题思路 考虑一个子集 \(S\) 的异或和如果为 \(0\) 那么贡献为 \(2^{|S|}\) ,不难列出生产函数的式子,这里的卷积是异或卷积. \[ [x^0]\p ...

  7. SET QUOTED_IDENTIFIER选项对索引的影响

    早上来到公司,发现用于整理索引碎片的Job跑失败了,查看job history,发现以下错误消息: ALTER INDEX failed because the following SET optio ...

  8. Linux学习笔记之Linux磁盘及文件系统管理笔记

    Linux磁盘及文件系统管理 CPU,memory(RAM),I/O i/o: disks,ehtercard disks:持久存储数据 接口类型: IDE(ata): 并口,133MB/s;并行总线 ...

  9. VS代码调试出现:当前不会命中断点。还没有为该文档加载任何符号。

    第一步:一定要检查最顶部自己设置的是 Release模式还是Debug模式!!!下面这个图就是在我搜了好多解决方式之后,突然发现自己开的是Release模式!!!吐血. 第二步:如果你已经确定了自己是 ...

  10. TRIO-basic指令--CAM

    大家好,今天更新TRIO的运动指令CAM(也就是CAM函数),CAM指令是控制器直接发送编码器脉冲形成的运动曲线,比如:正弦,余弦曲线,根据自己的精度需求进行描点,但并不一定点数越多精度就越高,以实际 ...