k8s重点知识Ingress技法精讲
Posted Friends of the wind
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s重点知识Ingress技法精讲相关的知识,希望对你有一定的参考价值。
理论
Ingress 解决什么问题
- 动态配置服务
如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要额外的操作。
- 减少暴露不必要端口
配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式
Ingress 工作原理
- ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,
- 然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置
- 再写到nginx-ingress-control的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中
- 然后reload一下使配置生效。以此达到域名分配置和动态更新的问题。
Ingress网站:
https://github.com/kubernetes/ingress-nginx
https://kubernetes.github.io/ingress-nginx/
示例
提示:使用vim创建yaml并运行,否则,复制可能导致格式错误。
1、 创建2个Deployment
第一个: nginx镜像,replicas:3
vim deploy1.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: deploy1
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
第二个: httpd镜像,replicas:4
vim deploy2.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: deploy2
spec:
selector:
matchLabels:
app: httpd
replicas: 4
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd
imagePullPolicy: IfNotPresent
2、 创建2个SVC资源,
第一个和第一个Deploy绑定
vim svc1.yaml
kind: Service
apiVersion: v1
metadata:
name: svc1
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
第二个和第二个Deploy绑定
vim svc2.yaml
kind: Service
apiVersion: v1
metadata:
name: svc2
spec:
selector:
app: httpd
ports:
- protocol: TCP
port: 80
targetPort: 80
查看验证:
初步验证:集群内以IP访问
报错:请求超时
解决:查看容器,运行状态是running,在节点本地访问,成功!证明防火墙,阻止了访问,关闭防火墙、selinux
3、 部署Ingress
注意:这里使用的镜像,是国外的镜像,需要提前下载获得;将镜像导入节点服务器
1)终端下载:wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/baremetal/deploy.yaml
修改配置:
vim deploy.yaml
验证:ingress,会自动创建名称空间,运行于某个节点
2)创建yaml将Deployment资源对象关联
Ingress-controller的Deployment资源对象关联在一起了,也就是说,访问mandatora-svc就能否访问Ingress-controller的Depoyment资源的Pod的了。
vim mandatory-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
3)创建对应的Ingress规则(以搭建http代理为例)
vim ingress.yaml
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
name: bdqn-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: ingress.bdqn.com
http:
paths:
- path: /nginx
backend:
serviceName: svc1
servicePort: 80
- path: /httpd
backend:
serviceName: svc2
servicePort: 80
查看对应规则的详细信息:
4、 验证:使用http协议访问域名成功
以Windows系统修改host文件为例:
以上是关于k8s重点知识Ingress技法精讲的主要内容,如果未能解决你的问题,请参考以下文章
精品k8s(kubernetes)的网络策略详networkpolicy实例精讲