k8s重点知识Ingress技法精讲

Posted Friends of the wind

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8s重点知识Ingress技法精讲相关的知识,希望对你有一定的参考价值。

理论

Ingress 解决什么问题

  1. 动态配置服务

如果按照传统方式, 当新增加一个服务时, 我们可能需要在流量入口加一个反向代理指向我们新的k8s服务. 而如果用了Ingress, 只需要配置好这个服务, 当服务启动时, 会自动注册到Ingress的中, 不需要额外的操作。

  1. 减少暴露不必要端口

配置过k8s的都清楚, 第一步是要关闭防火墙的, 主要原因是k8s的很多服务会以NodePort方式映射出去, 这样就相当于给宿主机打了很多孔, 既不安全也不优雅. 而Ingress可以避免这个问题, 除了Ingress自身服务可能需要映射出去, 其他服务都不要用NodePort方式
  
Ingress 工作原理

  1. ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化,
  2. 然后读取它,按照自定义的规则,规则就是写明了哪个域名对应哪个service,生成一段nginx配置
  3. 再写到nginx-ingress-control的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中
  4. 然后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实例精讲

k8s配置ingress

k8s session ingress 亲和性的配置

k8s ingress及ingress controller

k8s 对外服务之ingress

K8S Nginx Ingress 介绍