Ingress`其实就是从 kuberenets 集群外部访问集群的一个入口,将外部的请求转发到集群内不同的 Service 上,其实就相当于 nginx、haproxy 等负载均衡代理服务器,Ingress controller 可以理解为一个监听器,通过不断地与 kube-apiserver 打交道,实时的感知后端 service、pod 的变化,当得到这些变化信息后,Ingress controller 再结合 Ingress 的配置,更新反向代理负载均衡器,达到服务发现的作用.

在Kubernetes 目前 提供了以下几种方案:

NodePort

LoadBalancer

Ingress

使用ingress-nginx,先创建pod服务,默认yaml文件

  1. wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

vim mandatory.yaml

  1. apiVersion: v1
  2. kind: Namespace
  3. metadata:
  4. name: ingress-nginx
  5. ---
  6. apiVersion: extensions/v1beta1
  7. kind: Deployment
  8. metadata:
  9. name: default-http-backend
  10. labels:
  11. app.kubernetes.io/name: default-http-backend
  12. app.kubernetes.io/part-of: ingress-nginx
  13. namespace: ingress-nginx
  14. spec:
  15. replicas: 1
  16. selector:
  17. matchLabels:
  18. app.kubernetes.io/name: default-http-backend
  19. app.kubernetes.io/part-of: ingress-nginx
  20. template:
  21. metadata:
  22. labels:
  23. app.kubernetes.io/name: default-http-backend
  24. app.kubernetes.io/part-of: ingress-nginx
  25. spec:
  26. terminationGracePeriodSeconds: 60
  27. containers:
  28. - name: default-http-backend
  29. # Any image is permissible as long as:
  30. # 1. It serves a 404 page at /
  31. # 2. It serves 200 on a /healthz endpoint
  32. image: k8s.gcr.io/defaultbackend-amd64:1.5
  33. livenessProbe:
  34. httpGet:
  35. path: /healthz
  36. port: 8080
  37. scheme: HTTP
  38. initialDelaySeconds: 30
  39. timeoutSeconds: 5
  40. ports:
  41. - containerPort: 8080
  42. resources:
  43. limits:
  44. cpu: 10m
  45. memory: 20Mi
  46. requests:
  47. cpu: 10m
  48. memory: 20Mi
  49. ---
  50. apiVersion: v1
  51. kind: Service
  52. metadata:
  53. name: default-http-backend
  54. namespace: ingress-nginx
  55. labels:
  56. app.kubernetes.io/name: default-http-backend
  57. app.kubernetes.io/part-of: ingress-nginx
  58. spec:
  59. ports:
  60. - port: 80
  61. targetPort: 8080
  62. selector:
  63. app.kubernetes.io/name: default-http-backend
  64. app.kubernetes.io/part-of: ingress-nginx
  65. ---
  66. kind: ConfigMap
  67. apiVersion: v1
  68. metadata:
  69. name: nginx-configuration
  70. namespace: ingress-nginx
  71. labels:
  72. app.kubernetes.io/name: ingress-nginx
  73. app.kubernetes.io/part-of: ingress-nginx
  74. ---
  75. kind: ConfigMap
  76. apiVersion: v1
  77. metadata:
  78. name: tcp-services
  79. namespace: ingress-nginx
  80. labels:
  81. app.kubernetes.io/name: ingress-nginx
  82. app.kubernetes.io/part-of: ingress-nginx
  83. ---
  84. kind: ConfigMap
  85. apiVersion: v1
  86. metadata:
  87. name: udp-services
  88. namespace: ingress-nginx
  89. labels:
  90. app.kubernetes.io/name: ingress-nginx
  91. app.kubernetes.io/part-of: ingress-nginx
  92. ---
  93. apiVersion: v1
  94. kind: ServiceAccount
  95. metadata:
  96. name: nginx-ingress-serviceaccount
  97. namespace: ingress-nginx
  98. labels:
  99. app.kubernetes.io/name: ingress-nginx
  100. app.kubernetes.io/part-of: ingress-nginx
  101. ---
  102. apiVersion: rbac.authorization.k8s.io/v1beta1
  103. kind: ClusterRole
  104. metadata:
  105. name: nginx-ingress-clusterrole
  106. labels:
  107. app.kubernetes.io/name: ingress-nginx
  108. app.kubernetes.io/part-of: ingress-nginx
  109. rules:
  110. - apiGroups:
  111. - ""
  112. resources:
  113. - configmaps
  114. - endpoints
  115. - nodes
  116. - pods
  117. - secrets
  118. verbs:
  119. - list
  120. - watch
  121. - apiGroups:
  122. - ""
  123. resources:
  124. - nodes
  125. verbs:
  126. - get
  127. - apiGroups:
  128. - ""
  129. resources:
  130. - services
  131. verbs:
  132. - get
  133. - list
  134. - watch
  135. - apiGroups:
  136. - "extensions"
  137. resources:
  138. - ingresses
  139. verbs:
  140. - get
  141. - list
  142. - watch
  143. - apiGroups:
  144. - ""
  145. resources:
  146. - events
  147. verbs:
  148. - create
  149. - patch
  150. - apiGroups:
  151. - "extensions"
  152. resources:
  153. - ingresses/status
  154. verbs:
  155. - update
  156. ---
  157. apiVersion: rbac.authorization.k8s.io/v1beta1
  158. kind: Role
  159. metadata:
  160. name: nginx-ingress-role
  161. namespace: ingress-nginx
  162. labels:
  163. app.kubernetes.io/name: ingress-nginx
  164. app.kubernetes.io/part-of: ingress-nginx
  165. rules:
  166. - apiGroups:
  167. - ""
  168. resources:
  169. - configmaps
  170. - pods
  171. - secrets
  172. - namespaces
  173. verbs:
  174. - get
  175. - apiGroups:
  176. - ""
  177. resources:
  178. - configmaps
  179. resourceNames:
  180. # Defaults to "<election-id>-<ingress-class>"
  181. # Here: "<ingress-controller-leader>-<nginx>"
  182. # This has to be adapted if you change either parameter
  183. # when launching the nginx-ingress-controller.
  184. - "ingress-controller-leader-nginx"
  185. verbs:
  186. - get
  187. - update
  188. - apiGroups:
  189. - ""
  190. resources:
  191. - configmaps
  192. verbs:
  193. - create
  194. - apiGroups:
  195. - ""
  196. resources:
  197. - endpoints
  198. verbs:
  199. - get
  200. ---
  201. apiVersion: rbac.authorization.k8s.io/v1beta1
  202. kind: RoleBinding
  203. metadata:
  204. name: nginx-ingress-role-nisa-binding
  205. namespace: ingress-nginx
  206. labels:
  207. app.kubernetes.io/name: ingress-nginx
  208. app.kubernetes.io/part-of: ingress-nginx
  209. roleRef:
  210. apiGroup: rbac.authorization.k8s.io
  211. kind: Role
  212. name: nginx-ingress-role
  213. subjects:
  214. - kind: ServiceAccount
  215. name: nginx-ingress-serviceaccount
  216. namespace: ingress-nginx
  217. ---
  218. apiVersion: rbac.authorization.k8s.io/v1beta1
  219. kind: ClusterRoleBinding
  220. metadata:
  221. name: nginx-ingress-clusterrole-nisa-binding
  222. labels:
  223. app.kubernetes.io/name: ingress-nginx
  224. app.kubernetes.io/part-of: ingress-nginx
  225. roleRef:
  226. apiGroup: rbac.authorization.k8s.io
  227. kind: ClusterRole
  228. name: nginx-ingress-clusterrole
  229. subjects:
  230. - kind: ServiceAccount
  231. name: nginx-ingress-serviceaccount
  232. namespace: ingress-nginx
  233. ---
  234. apiVersion: extensions/v1beta1
  235. kind: Deployment
  236. metadata:
  237. name: nginx-ingress-controller
  238. namespace: ingress-nginx
  239. labels:
  240. app.kubernetes.io/name: ingress-nginx
  241. app.kubernetes.io/part-of: ingress-nginx
  242. spec:
  243. replicas: 1
  244. selector:
  245. matchLabels:
  246. app.kubernetes.io/name: ingress-nginx
  247. app.kubernetes.io/part-of: ingress-nginx
  248. template:
  249. metadata:
  250. labels:
  251. app.kubernetes.io/name: ingress-nginx
  252. app.kubernetes.io/part-of: ingress-nginx
  253. annotations:
  254. prometheus.io/port: "10254"
  255. prometheus.io/scrape: "true"
  256. spec:
  257. serviceAccountName: nginx-ingress-serviceaccount
  258. hostNetwork: true
  259. nodeSelector:
  260. app: ingress
  261. containers:
  262. - name: nginx-ingress-controller
  263. image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.20.0
  264. args:
  265. - /nginx-ingress-controller
  266. - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
  267. - --configmap=$(POD_NAMESPACE)/nginx-configuration
  268. - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
  269. - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
  270. - --publish-service=$(POD_NAMESPACE)/ingress-nginx
  271. - --annotations-prefix=nginx.ingress.kubernetes.io
  272. securityContext:
  273. capabilities:
  274. drop:
  275. - ALL
  276. add:
  277. - NET_BIND_SERVICE
  278. # www-data -> 33
  279. runAsUser: 33
  280. env:
  281. - name: POD_NAME
  282. valueFrom:
  283. fieldRef:
  284. fieldPath: metadata.name
  285. - name: POD_NAMESPACE
  286. valueFrom:
  287. fieldRef:
  288. fieldPath: metadata.namespace
  289. ports:
  290. - name: http
  291. containerPort: 80
  292. - name: https
  293. containerPort: 443
  294. livenessProbe:
  295. failureThreshold: 3
  296. httpGet:
  297. path: /healthz
  298. port: 10254
  299. scheme: HTTP
  300. initialDelaySeconds: 10
  301. periodSeconds: 10
  302. successThreshold: 1
  303. timeoutSeconds: 1
  304. readinessProbe:
  305. failureThreshold: 3
  306. httpGet:
  307. path: /healthz
  308. port: 10254
  309. scheme: HTTP
  310. periodSeconds: 10
  311. successThreshold: 1
  312. timeoutSeconds: 1
  313. ---

将ingress固定漂移到node02节点上

  1. [root@master ingress-nginx]# kubectl get no
  2. NAME STATUS ROLES AGE VERSION
  3. master Ready master 9d v1.10.0
  4. node02 Ready <none> 8d v1.10.0

给node02节点打上lable标签,设置hostNetwork: true提高网络访问效率

  1. kubectl label node node02 app=ingress

yaml文件配置好,lable标签也打好开始创建ingress

  1. kubectl apply -f mandatory.yaml

查看pod状态

  1. [root@master ingress-nginx]# kubectl get pod -n ingress-nginx
  2. NAME READY STATUS RESTARTS AGE
  3. default-http-backend-66c4fbf5b4-vkrzq 1/1 Running 4 21h
  4. nginx-ingress-controller-658cd45944-tqgvm 1/1 Running 1 21h
  1. # default
  2. 如果外界访问的域名不存在的话,则默认转发到default-http-backend这个Service,其会直接返回404

创建i一个ingress-demo测试一下,首先创建tomcat

  1. ---
  2. # deployment
  3. apiVersion: apps/v1
  4. kind: Deployment
  5. metadata:
  6. name: tomcat-demo
  7. spec:
  8. selector:
  9. matchLabels:
  10. app: tomcat-demo
  11. replicas: 1
  12. template:
  13. metadata:
  14. labels:
  15. app: tomcat-demo
  16. spec:
  17. containers:
  18. - name: tomcat-demo
  19. image: registry.cn-hangzhou.aliyuncs.com/liuyi01/tomcat:8.0.51-alpine
  20. ports:
  21. - containerPort: 8080
  22. ---
  23. # service
  24. apiVersion: v1
  25. kind: Service
  26. metadata:
  27. name: tomcat-demo
  28. spec:
  29. ports:
  30. - port: 80
  31. protocol: TCP
  32. targetPort: 8080
  33. selector:
  34. app: tomcat-demo
  35. ---
  36. #ingress
  37. apiVersion: extensions/v1beta1
  38. kind: Ingress
  39. metadata:
  40. name: tomcat-demo
  41. spec:
  42. rules:
  43. - host: ingress1.com
  44. http:
  45. paths:
  46. - path: /
  47. backend:
  48. serviceName: tomcat-demo
  49. servicePort: 8080

在创建一个nginx服务测试

  1. # deployment
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5. name: tomcat-demo
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: tomcat-demo
  10. replicas: 1
  11. template:
  12. metadata:
  13. labels:
  14. app: tomcat-demo
  15. spec:
  16. containers:
  17. - name: tomcat-demo
  18. image: registry.cn-hangzhou.aliyuncs.com/liuyi01/tomcat:8.0.51-alpine
  19. ports:
  20. - containerPort: 8080
  21. ---
  22. # service
  23. apiVersion: v1
  24. kind: Service
  25. metadata:
  26. name: tomcat-demo
  27. spec:
  28. ports:
  29. - port: 80
  30. protocol: TCP
  31. targetPort: 8080
  32. selector:
  33. app: tomcat-demo
  34. ---
  35. #ingress
  36. apiVersion: extensions/v1beta1
  37. kind: Ingress
  38. metadata:
  39. name: tomcat-demo
  40. spec:
  41. rules:
  42. - host: ingress2.com
  43. http:
  44. paths:
  45. - path: /
  46. backend:
  47. serviceName: tomcat-demo
  48. servicePort: 8080

创建nginx和tomcat pod服务

  1. [root@master nginx-ingress]# kubectl apply -f .
  2. # 查看pod情况,服务都起来了
  3. [root@master nginx-ingress]# kubectl get pod
  4. NAME READY STATUS RESTARTS AGE
  5. load-generator-7bbbb4fdd4-l5vmz 1/1 Running 9 8d
  6. myapp-deploy-6b9c9f847c-d6fsp 1/1 Running 0 2h
  7. mynginx-85f8f5d89c-mhhzc 1/1 Running 0 2h
  8. nginx-demo-6c5d64fd5f-xnscz 1/1 Running 0 1h
  9. testservice-796fbc64bb-bczbs 1/1 Running 8 7d
  10. tomcat-demo-686b48d96c-zxfpt 1/1 Running 0 2h

配置域名解析,当前测试环境我们使用hosts文件进行解析

  1. 192.168.14.32 ingress1.com
  2. 192.168.14.32 ingress2.com

接下来通过不同域名去访问,得到不同服务

外部服务发现-ingress的更多相关文章

  1. Kubernetes之服务发现及负载Services

    Service 概述 kubernetes 中的pod是有生生灭灭的,时刻都有可能被新的pod所代替,而不可复活(pod的生命周期).一旦一个pod生命终止,通过ReplicaSets动态创建和销毁p ...

  2. Kubernetes服务发现之Service详解

    一.引子 Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然后一旦被销毁生命就永远结束.通过ReplicationController 能够动态地创建和销毁Pod(列如,需 ...

  3. (转) Docker - Docker1.12服务发现,负载均衡和Routing Mesh

    看到一篇介绍 Docker swarm以及如何编排的好文章,挪放到这里,自己学习的同时也分享出来. 原文链接: http://wwwbuild.net/dockerone/414200.html -- ...

  4. Docker与k8s的恩怨情仇(七)—— “服务发现”大法让你的内外交互原地起飞

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 第一章:Docker与k8s的恩怨情仇(一)-成为PaaS前浪的Cloud Foundry 第二章:Dock ...

  5. Kubernetes如何使用kube-dns实现服务发现

    大纲: •       Kubernetes中如何发现服务 •       如何发现Pod提供的服务 •       如何使用Service发现服务 •       如何使用kube-dns发现服务 ...

  6. SpringCloud接入EDAS——服务发现篇

    旁白 很久没有写技术文章了,最近不是写水文就是写小说.说到底,还是最近很少研究技术的缘故,已经到了江郎才尽的地步了. 不过,LZ无意间看到自己团队的小伙伴写的一些文章,觉得还是不错的,于是便动了心思, ...

  7. asp.net core系列 61 Ocelot 构建服务发现简单示例

    一.概述 Ocelot允许指定服务发现提供程序,如Consul或Eureka. 这二个中间件是用来实现:服务治理或秒服务发现,服务发现查找Ocelot正在转发请求的下游服务的主机和端口.目前Ocelo ...

  8. Ocelot + Consul + Registrator 基于Docker 实现服务发现、服务自动注册

    目录 1. Consul集群搭建 1.1 F&Q Consul官方推荐的host网络模式运行 2. Registrator服务注册工具 2.1 F&Q Registrator悬挂服务 ...

  9. Presto服务发现(Discovery Service)

    Presto 集群配置不管是coordinator还是worker配置项中都有一项discovery.uri,这个是一个比较核心的东西,简单来说就是服务发现的地址. coordinator和worke ...

随机推荐

  1. (原)理解码率控制模式(x264,x265,vpx)

    理解码率控制模式(x264,x265,vpx) 原文链接:https://slhck.info/video/2017/03/01/rate-control.html 翻译:lihaiping1603@ ...

  2. XT交易所API

    HTTPAPI xt为用户提供了一个简单的而又强大的API,旨在帮助用户快速高效的将xt交易功能整合到自己应用当中. API地址域名地址 域名地址:https://www.xt.com/ 使用说明 使 ...

  3. vue双循环或者多循环作用于同一元素时,在外套template标签

    如图,两个v-for,都是要循环创建tr标签.同理,v-if也是套template

  4. 浅谈 Docker 安全合规建设

    通过阅读网上帖子及浏览相关信息,大家可能会产生一种错觉:Docker 安全性不足,对 Docker 导入生产环境持保守态度.不过实际情况是,虽然我们需要对容器的安全性高度关注,但只要使用得当,完全可以 ...

  5. 浅谈Java Object

    在Java中,所有的类都继承自Object类,因此万物皆对象?也没错! 那有人会问,我的子类继承的是父类不是Object,怎么说? 如果一个类没用显示的继承某一个类,那么他就会隐式的继承 Object ...

  6. 关于vuecli的一些问题

    在vue打包之后,我们引入的css路径和js路径会变成绝对路径 需要在vue.config.js里面设置publicpath为"./" 同时在做前后端分离开发时,我们通常会用到ax ...

  7. vue2.0版本中v-html中过滤器的使用

    Vue 2.0 不再支持在 v-html 中使用过滤器 解决方法: 1:全局方法(推荐) 2:computed 属性 3:$options.filters(推荐) 1:使用全局方法: 可以在 Vue ...

  8. 论DOM中文档和元素的位置大小属性及其区别

    element.offsetLeft/Top  获取元素相对于最近的有定位的父元素的坐标,如果没有有定位的父元素,则是文档坐标 element.scrollTop/Left 获取元素滚动卷去的距离 e ...

  9. timeout超时时长优化和hystrix dashboard可视化分布式系统

    在生产环境中部署一个短路器,一开始需要将一些关键配置设置的大一些,比如timeout超时时长,线程池大小,或信号量容量 然后逐渐优化这些配置,直到在一个生产系统中运作良好 (1)一开始先不要设置tim ...

  10. 关键字ref、out

    通常,变量作为参数进行传递时,不论在方法内进行了什么操作,其原始初始化的值都不会被影响: 例如: public void TestFun1() { ; TestFun2(arg); Console.W ...