这段时间在看韩先超老师的k8s课程,并成功地通过了CKA的考试。把之前的一些重要的笔记整理一下。

k8s里面service和ingress是两个很重要的概念。下面简单的总结一下,并配置一个实验环境。

service的主要作用是把集群内部的容器的端口暴露出来,以便集群内部的其他服务或者集群外部来访问。service分成了三大类型,分别是NodePort,ClusterIP和 Loadbalance。

Cluster集群内部的访问都可以通过ClusterIP来实现,这个也是他默认的类型。

为了把端口暴露给外界,本地的节点可以使用NodePort,把节点的端口号暴露出去,访问顺序即 客户请求 -> node 节点的 IP:port -> service IP: port -> pod IP: port;
Screen Shot 20220113 at 2.13.07 pm.png

如果是云平台,可以使用Loadbalancer。但是值得注意的是,service相当于一个第四层的负载平衡,因此配置loadbalancer的时候,必须使用network balancer 而不是 application loadbalancer。以aws为例,我们可以直接把service的类型设置为loadbalancer,然后后面通过标签选择器绑定pod。这样的配置很方便,但是缺陷就是无法灵活的通过域名来转发请求,作为demo演示效果还行,如果直接使用成本就太高了,每个service都得一个单独的nlb。因此我们需要考虑一个七层的负载代理。

ingress和ingress controller,从另外一个角度来说,就相当于一个七层的负载均衡。简单的比喻他们加在一起就是一个Nginx服务,可以在上面配置反向代理,把不同的域名指向不同的service上面。为了便于管理,把Nginx.conf抽象出来,叫做ingress ,实际上就是一些规则的集合,每次更新这些规则的yaml文件的时候ingress controller会自动通过API来更新他的nginx.conf 内容。

Screen Shot 20220113 at 2.43.50 pm.png
下面看看怎么配置一个ingress的实验环境。

豆子的k8s集群是配置在virtualbox上的,网络是NAT,对外是隔离的,因此从我的电脑上访问还得配置nat rule,另外dns的解析也是直接在本地电脑的hosts文件上修改了。

一般情况下,如果需要配置一个ingress的测试环境,我们需要部署以下的内容

  1. deployment.yaml 来配置 一个 application 的pod
  2. service.yaml 来配置application 前面的 service
  3. ingress.yaml来配置相关的规则,并和我们的ingress controller关联起来
  4. rbac.yaml 来配置 service account,role 和 cluster role ,并把这个role 和 cluster role和我们的service account 绑定起来
  5. ingress-controller.yaml 来 配置一个 nginx ingress controller的pod,里面指定第四步创建的service account
  6. 一个backend.yaml 来生成一个默认的后端的pod,比如直接访问IP返回404,访问 /healthz 返回 200
  7. 我们的ingress controller也是在集群内部,如果想要暴露出去,要么在他前面也配置一个service,类型为NodePort或者loadbalancer,或者直接共享节点的IP。