这次先来看看这俩术语吧,这里参照nginx:
- ingress是什么,详见。
- 基本上相当于nginx的/etc/nginx/conf.d目录中的配置文件,只是文件写法上的区别。
- ingress controller是什么,详见。
- 能实现按ingress规则代理请求的都属于ingress controller。
- 其实就相当于nginx服务本身,根据ingress也就相当于配置文件,代理不同的请求。
- nginx相关的ingress controller,目前有两个官方的😄:
- 俩nginx的ingress controller的区别,详见
我与ingress-nginx的那点事
- 哎,dashboard弄好了,但是一直用api server 代理path太长有点难受,知道有ingress这么个东西,那就怎么用着怎么来吧
- 一切一切,都是为了dashboard访问舒服点,对后面的其他app部署可能一会好点,😄~
仔细瞅瞅文档
- 本文我们使用的是ingress-nginx,也就k8s亲生ingress controller 😄
- ingress-nginx 文档地址,不吹不黑,这个文档写的确实挺好,简单到位,下面简单概述下文档内容(用我这个小学生英语水平的理解):
- Welcome
- 常见FAQ,没啥说的
- ingress-nginx工作原理,这个可以看看,如何加载配置,热更。
- 如何调试定位ingress-nginx的问题
- ingress-nginx插件(这个我理解就类似于cli工具,用来操作ingress-nginx的)
- Deployment:
- Installation Guide - (安装指南):主要介绍如何多种方式安装ingress-nginx,例helm,kubectl工具,Minikube 或者 MicroK8s工具。
- 这块有个小坑点吧,至少我认为是,因为这块的给的例子yaml文件,是云集群的方案。。。也就是需要一个外部的Load Blancer, ingress-nginx服务type为LoadBalancer [type类型解释详见],因为我是裸机搭的集群,没有Load Blancer。
- 所以ingress-nginx服务类型,这块我选的是NodePort类型,直接走物理机固定端口访问ingress-nginx,这个等会
- Bare-metal considerations - (裸机注意事项):
- A pure software solution MetalLB - (纯软件方案):没太整明白咋玩的,好像是直接走的2层直接访问ingress-nginx的服务ip。
- Over a NodePort Service - (使用NodePort映射ingress-nginx服务):
- 目前我选择的就是这个,对裸机来说简单,给ingress-nginx服务配置一个nodePort固定端口,通过访问node ip(也可以给node绑定外网ip使用外网ip也可)和这固定端口,来访问ingress-nginx服务。
- Via the host network - (走host network的方式):直接将ingress-nginx服务和宿主机用一个子网,直接访问服务的ip和端口。
- Using a self-provisioned edge - (使用自建网络):和云方案一样,需要一个前置的Load Blancer,就是类似完全的自建机房网络设施,我理解是暴露一个公网的代理,完事这个代理,将流量转发到整个集群,这样集群ip不会对外暴露,只对外暴露自建网络的入口代理地址。
- External IPs - (外网ip):给ingress-nginx服务配置外网ip,直接访问外网ip访问服务,详见
- RBAC - (基于角色的权限控制配置):没啥好说的和前面创建dashboard的管理员角色差不多。
- Upgrade - (如何升级已有ingress-nginx服务)
- Hardening guide:应该是inrgess-nginx和nginx的对比吧
- Installation Guide - (安装指南):主要介绍如何多种方式安装ingress-nginx,例helm,kubectl工具,Minikube 或者 MicroK8s工具。
- User guide:用户指南,这块就不一一说了。。。有点多,具体自己看吧,下面这个几个看下就能配置inrgess了。
- ConfigMap:利用configmap配置ingress,这个我目前没去研究,不过一样的只是配置写法区别。
- Custom NGINX template: 利用自定义模板配置ingress,这个同样暂时还没使用到。
- Annotions:这块需要关注一下,配置ingress的时候,可以使用注解的方式进行配置就很方便,下面配置ingress使用的就这个这种方式,挺简单的。
- TLS/HTTPS:这个是如何配置ingress-nginx使用https,例子使用的是自签证书。
- Examples:好多例子,,,
- Developer Guide:开发者指南,是时候给ingress-nginx贡献代码了,xdm上,我先溜了😄。
- Welcome
开始安装
下载yaml文件,使用裸机的deploy.yaml,见仓库地址
1
2
3
4
5
6
7切换目录到自定义的插件目录
cd ~/.kube/addons
科学上网下载,或者将下面地址使用jsdelivr转换一下
curl -o ingress-nginx-baremetal.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml
修改一下ingress-nginx-baremetal.yaml文件,加上ingress-nginx-controller service的http和https分别一个固定的nodePort端口,例:30080,30443需要修改一下ingress-nginx-baremetal.yaml,加一个固定的nodePort,默认是随机的,端口范围详见
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40# 前面的省略这就不贴了
apiVersion: v1
kind: Service
metadata:
annotations:
labels:
helm.sh/chart: ingress-nginx-4.0.10
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/version: 1.1.0
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/component: controller
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
# 使用后节点端口映射service的方式
type: NodePort
ipFamilyPolicy: SingleStack
ipFamilies:
- IPv4
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
appProtocol: http
# http固定的端口号
nodePort: 30080
- name: https
port: 443
protocol: TCP
targetPort: https
appProtocol: https
# https固定的端口号
nodePort: 30443
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
# 后面的省略这就不贴了创建ingress-nginx相关工作负载,运行起来
1
2
3
4
5创建ingress-nginx
kubectl apply -f ingress-nginx-baremetal.yaml
查看deployment状态
kctl -n ingress-nginx get all -o wide
配置ingress
通过ingress配置,访问dashboard服务
拿前面已经安装的dashboard当例子,大概说明下当前情况和思路:
- dashboard服务我使用的是http,就想着集群内部又不直接暴露出去,内部使用http也没啥,明文方便查问题,也少tls层这么一层(虽然内网影响不大)。
- ingress这块对外使用https,对内访问service使用http,也就是集群内部使用http
下面我们开始配置:
首先需要一个证书,并且将证书,托管到secret上:
现在证书有了,我们配置ingress,详见,这里给出一个现成的例子
创建ingress.yaml,贴入如下内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: kubernetes-dashboard
namespace: kubernetes-dashboard
# 这块就是上面说的注解相关的配置,具体查文档,可以对照文档看看下面这4个注解分别啥意思
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
# 这个是挂在刚才创建的secret,我这块创建的secret叫kubernetes-dashboard-ingress-secret
tls:
- secretName: kubernetes-dashboard-ingress-secret
rules:
\t# 在本地配置一下host,绑定集群node ip
- host: 'dashboard.example.com'
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: kubernetes-dashboard
port:
number: 80kubectl apply -f ingress.yaml,这样就可以规则就生效了,打开浏览器直接访问:https://dashboard.example.com:30443 ,就可以访问dashboard了
END
到这里,我理解k8s集群基本上就算整好了,虽然很简陋,至少,整个流程跑通了,不得不书k8s官方的概念是真的多,刚开始看着实有点头疼,不过了解了架构之后从图形流程去入手理解概念就好多了😄。接下来,去看看helm这个工具了,🤣~