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

scofield 菜鸟运维杂谈

这是容器云平台第四篇,接上一篇继续,
首先kubernetes服务暴露有如下几种方式:

  • NodePort
  • Loadbalance
  • ClusterIP
  • Ingress
    本文紧贴第一篇架构图,只介绍Ingress,其余的后续再详细说。。

Ingress是什么?


Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP,当然TCP也是可以管理滴。
Ingress 可以提供负载均衡、SSL 终结和基于域名的虚拟托管。
大白话就是:把kubernetes集群部署的服务暴露出来,让集群外部的用户或者服务能访问到。

能为kubernetes提供ingress的控制器很多,本文就用基于HAProxy的控制器:Haproxy Ingreess。
HAProxy是一个快速可靠的TCP和HTTP反向代理和负载均衡器。
当然,一个kubernetes集群也可以同时部署多种ingress控制器。

HAProxy Ingress


HAProxy Ingress 通过监控Kubernetes API,获取services后端的pod状态,动态更新haproxy的配置文件,以实现负载均衡。
它允许每个代理每秒有数千个请求,不管集群的大小,具有非常低的延迟。

简单做个介绍,接下来开始实战。

部署HAProxy Ingress到kubernetes集群


  1. 下载yaml部署文件:wget https://haproxy-ingress.github.io/resources/haproxy-ingress.yaml
  2. 修改haproxy-ingress.yaml,因为现在使用的是1.19版本,有的api版本已经过期,需要修改下
  3. rbac.authorization.k8s.io/v1beta1 改为rbac.authorization.k8s.io/v1,如果不修改会有Warning,但是目前不影响
  4. 部署:kubectl apply -f haproxy-ingress.yaml
 1    [root@k8s-master001 opt]# kubectl  apply -f haproxy-ingress.yaml  2    namespace/ingress-controller created 3    serviceaccount/ingress-controller created 4    Warning: rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole 5    clusterrole.rbac.authorization.k8s.io/ingress-controller created 6    Warning: rbac.authorization.k8s.io/v1beta1 Role is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 Role 7    role.rbac.authorization.k8s.io/ingress-controller created 8    Warning: rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding 9    clusterrolebinding.rbac.authorization.k8s.io/ingress-controller created10    Warning: rbac.authorization.k8s.io/v1beta1 RoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 RoleBinding11    rolebinding.rbac.authorization.k8s.io/ingress-controller created12    configmap/haproxy-ingress created13    daemonset.apps/haproxy-ingress created
  1. 查看部署状态
1    [root@k8s-master001 opt]# kubectl  get all -n ingress-controller2    NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR AGE3    daemonset.apps/haproxy-ingress   0         0         0       0            0           role=ingress-controller   6m2s

什么鬼,为什么没有haproxy相关的pod呢?


5.现在再来看下 haproxy-ingress.yaml 这个文件,发现其中定义了nodeSelector节点标签选择器,但是现在集群节点没有任何机器有这个标签,因此需要给node设置合理的标签,要不然不会创建pod
现在手动给master003添加一个标签role=ingress-controller

1    [root@k8s-master001 opt]#  kubectl label node k8s-master003 role=ingress-controller2    node/k8s-master003 labeled

6.再来查看下,已经有haproxy-ingress-6mfqr,状态为Running,表示已经部署好了,是不是so easy~~~

1    [root@k8s-master001 opt]# kubectl  get all -n ingress-controlle2    NAME                        READY   STATUS    RESTARTS   AGE3    pod/haproxy-ingress-6mfqr   1/1     Running   1          2m40s45    NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR             AGE6    daemonset.apps/haproxy-ingress   1         1         1       1            1           role=ingress-controller   18m

使用Ingress暴露服务


这里使用上一篇部署的nginx作为示例,部署上篇,现在查看下nginx状态

1[root@k8s-master001 ~]# kubectl  get po,svc2NAME          READY   STATUS    RESTARTS   AGE3pod/nginx-0   1/1     Running   0          32h45NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE6service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        2d2h7service/nginx        NodePort    10.106.27.213   <none>        80:30774/TCP   32h

可以看到有一个名为nginx的service

 1[root@k8s-master001 ~]# cat ingress.yaml  2apiVersion: extensions/v1beta1 3kind: Ingress 4metadata: 5  name: nginx 6  annotations: 7    kubernetes.io/ingress.class: haproxy 8spec: 9  rules:10  - host: nginx.test.cn11    http:12      paths:13       - path: /14         backend:15           serviceName: nginx16           servicePort: 80

执行部署,会有个Warning,因为kubernetes apiVersion更新,以后会不在支持extensions/v1beta1,这里不影响,先忽略。

1[root@k8s-master001 ~]# kubectl  apply -f ingress.yaml2Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress3ingress.extensions/nginx configured

查看部署结果

1[root@k8s-master001 ~]# kubectl  get ing 2NAME    CLASS    HOSTS             ADDRESS   PORTS   AGE3nginx   <none>   nginx.test.cn             80      21m

现在,需要自己把nginx.test.cn解析到haproxy-ingresss所在节点的IP,本文haproxy-ingresss部署到了master003(10.26.25.22)
测试的话,直接修改/etc/hosts文件,然后可以访问nginx.test.cn

 1[root@k8s-master001 ~]# curl -I nginx.text.cn 2HTTP/1.1 200 OK 3server: nginx/1.19.2 4date: Sat, 12 Sep 2020 12:40:01 GMT 5content-type: text/html 6content-length: 612 7last-modified: Tue, 11 Aug 2020 14:50:35 GMT 8etag: "5f32b03b-264" 9accept-ranges: bytes10strict-transport-security: max-age=15768000

从结果可以看到,返回状态码,说明可以访问到部署的nginx服务了。


注:文中图片来源于网络,如有侵权,请联系我及时删除。

©著作权归作者所有:来自51CTO博客作者mb5fdb131956bf3的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 容器云平台No.3~kubernetes简单使用
  2. 11:VMware Horizon View 8.0-部署配置UAG网关
  3. 语音也能做持续集成和持续部署?看 Jenkins + Alexa 如何实现
  4. 闲聊Kubernetes Pod垂直自动伸缩(VPA)
  5. 在Kubernetes上部署应用时我们常忽略的几件事
  6. 浅析Kubernrtes服务类型(Service Types)
  7. Kubernetes集群管理容器实践(概念篇)
  8. Kubernetes客户端和管理界面大集合
  9. Docker技术这些应用场景,你知道吗?

随机推荐

  1. 再解 5 题!国庆之后续更,假期愉快!
  2. 什么样的 Java 对象会被当垃圾回收?
  3. Lock锁子类了解一下
  4. 读完《MyBatis技术内幕》,聊几句感触
  5. JVM 家族
  6. 从对象生命周期的经验统计到垃圾回收算法
  7. Nacos集群模式部署
  8. 穿插一个 MyBatis 分页插件 PageHelper
  9. CCNP(ISCW)实验:用命令行配置GRE OVER IPS
  10. Java 类的静态变量存放在哪块内存中?