Kubernetes进阶之ingress-nginx
admin
2023-03-11 14:01:12
0
Kubernetes进阶之ingress-nginx

目录:
一 从外部访问应用最佳方式
二 配置管理
三 数据卷与数据持久卷
四 再谈有状态应用部署
五 K8S 安全机制

说在前面的话,选择nodeport的方式去暴露端口,那你需要得去判断暴露的端口有没有被占用,再创建新的应用会判断端口有没有被分配出去
nodeport本身是基于默认的iptables的代理模式做的网络转发,也就是SANT,DANT,基于四层的,做七层是做不了的,性能差一点,因为它需要防火墙的转发和过滤。

一、从外部访问应用最佳方式

  1. Pod与Ingress的关系
    • 通过Service相关联
    • 通过Ingress Controller实现Pod的负载均衡
    • 支持TCP/UDP 4层和HTTP 7层
      Kubernetes进阶之ingress-nginx
  2. Ingress Controller
    controller类似装的k8s组件,时常的要去api去交互,时常去获取api的相关的信息,刷新自己的规则,类似与其他控制器
    ingress,k8s设计了一个比较全局性的负载均衡器,准确的来说Ingress它是k8s中的一个规则,实现这个规则就是使用的这个控制器,一般称为ingress控制器
    ingress控制器主要做的工作就是,它访问到这个控制器,它帮你转发的具体pod,也就是集群池,关联的哪些应用,哪些pod的IP,会帮你关联出来,暴露的端口80,443
    Kubernetes进阶之ingress-nginx
    1.部署Ingress Controlle
    部署文档:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
  3. 创建Ingress规则,为你的应用暴露一个端口,暴露一个域名,让用户去访问这个ingress controller控制器就可以了
    3.控制器选择类型
    https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
    注意事项:
    • 镜像地址修改成国内的: zhaocheng172/nginx-ingress-controller:0.20.0
    • 使用宿主机网络:hostNetwork: true
    [root@k8s-master demo]# wget  https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
    [root@k8s-master demo]# kubectl apply -f mandatory.yaml
    [root@k8s-master demo]# kubectl get pod -n ingress-nginx
    NAME                                        READY   STATUS    RESTARTS   AGE
    nginx-ingress-controller-5654f58c87-r5vcq   1/1     Running   0          46s

    分配给node2上面了,我们可以用netstat去查看我们监听的端口80/443

    [root@k8s-master demo]# kubectl get pod -n ingress-nginx -o wide
    NAME                                        READY   STATUS    RESTARTS   AGE     IP              NODE        NOMINATED NODE   READINESS GATES
    nginx-ingress-controller-5654f58c87-r5vcq   1/1     Running   0          3m51s   192.168.30.23   k8s-node2              
    [root@k8s-master demo]# vim ingress.yaml 
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: example-ingress
    spec:
    rules:
    - host: www.dagouzi.com
    http:
      paths:
      - backend:
          serviceName: deployment-service  
          servicePort: 80
    [root@k8s-master demo]# kubectl create -f ingress.yaml 
    [root@k8s-master demo]# kubectl get ingress -o wide
    NAME              HOSTS             ADDRESS   PORTS   AGE
    example-ingress   www.dagouzi.com             80      49m

    测试访问,这里我是写到了我的hosts文件中,要是做域名解析的话也是解析我们ingress的IP
    Kubernetes进阶之ingress-nginx
    这种类型呢,只能给我们ingress-nginx分配到一个节点上,如果我们的ingress-nginx挂了就肯定访问不到我们的应用服务了
    要是解决这个问题,我们就可以将副本进行扩容,使用DaemonSet的形式可以使我们的节点都能起一个pod,把副本删除,因为这里不需要副本
    ,需要把之前的资源删除才能修改

    [root@k8s-master demo]# kubectl delete -f mandatory.yaml 
    [root@k8s-master demo]# kubectl get pod -n ingress-nginx -o wide
    NAME                             READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
    nginx-ingress-controller-4s5ck   1/1     Running   0          38s   192.168.30.22   k8s-node1              
    nginx-ingress-controller-85rlq   1/1     Running   0          38s   192.168.30.23   k8s-node2              

    查看我们的监听端口,node1/node2,上面都有,不过这样的实例,比较适合小型的集群
    一般我们还可以在这样DaemonSet控制器前面再跑两个基于4层的负载均衡器
    User-->lb(vm-nginx/lvs/haproxy)--->node1/node2的IP,再使用算法,进行轮询,---->pod

    [root@k8s-node1 ~]# netstat -anpt |grep 80
    tcp        0      0 0.0.0.0:18080           0.0.0.0:*               LISTEN      63219/nginx: master 
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      63219/nginx: master 
    tcp        0      0 127.0.0.1:33680         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33700         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33696         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33690         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:18080         127.0.0.1:33580         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33670         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33660         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33676         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33666         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33686         127.0.0.1:18080         TIME_WAIT   -                   
    tcp        0      0 127.0.0.1:33656         127.0.0.1:18080         TIME_WAIT   -                   
    tcp6       0      0 :::18080                :::*                    LISTEN      63219/nginx: master 
    tcp6       0      0 :::80                   :::*                    LISTEN      63219/nginx: master 
    [root@k8s-node1 ~]# netstat -anpt |grep 443
    tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      63219/nginx: master 
    tcp        0      0 192.168.30.22:34798     192.168.30.21:6443      ESTABLISHED 1992/kube-proxy     
    tcp        0      0 192.168.30.22:44344     10.1.0.1:443            ESTABLISHED 6556/flanneld       
    tcp        0      0 192.168.30.22:44872     192.168.30.21:6443      ESTABLISHED 1718/kubelet        
    tcp        0      0 192.168.30.22:58774     10.1.0.1:443            ESTABLISHED 63193/nginx-ingress 
    tcp6       0      0 :::443                  :::*                    LISTEN      63219/nginx: master

基于https形式进行访问

[root@k8s-master cert]# cat cfssl.sh
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-certinfo
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-certinfo
[root@k8s-master cert]# sh cfssl.sh
[root@k8s-master cert]# ls
certs.sh  cfssl.sh
[root@k8s-master cert]# chmod +x certs.sh 
[root@k8s-master cert]# sh certs.sh 

为我们的域名生成证书,一个key,一个pem

[root@k8s-master cert]# ls
blog.ctnrs.com.csr       blog.ctnrs.com-key.pem  ca-config.json  ca-csr.json  ca.pem    cfssl.sh
blog.ctnrs.com-csr.json  blog.ctnrs.com.pem      ca.csr          ca-key.pem   certs.sh

把我们的key放入到我们的k8s中,使用ingress的时候使用这个key

[root@k8s-master cert]# kubectl create secret tls blog-ctnrs-com --cert=blog.ctnrs.com.pem --key=blog.ctnrs.com-key.pem
[root@k8s-master cert]# kubectl get secret
NAME                  TYPE                                  DATA   AGE
blog-ctnrs-com        kubernetes.io/tls                     2      3m1s
default-token-m6b7h   kubernetes.io/service-account-token   3      9d

[root@k8s-master demo]# vim ingress-https.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: tls-example-ingress
spec:
  tls:
  - hosts:
    - blog.ctnrs.com
    secretName: blog-ctnrs-com
  rules:
    - host: blog.ctnrs.com
      http:
        paths:
        - path: /
          backend:
            serviceName: deployment-service
            servicePort: 80
[root@k8s-master demo]# kubectl create -f ingress-https.yaml 
ingress.extensions/tls-example-ingress created
[root@k8s-master demo]# kubectl get ingress
NAME                  HOSTS             ADDRESS   PORTS     AGE
example-ingress       www.dagouzi.com             80        3h36m
tls-example-ingress   blog.ctnrs.com              80, 443   5s

Kubernetes进阶之ingress-nginx
这里提示不安全,因为我们是用自签的证书进行认证的,如果我们把买的证书替换了就可以正常去访问了
Kubernetes进阶之ingress-nginx
小结:
暴露外部访问的两种方式
User --> lb(外部的负载均衡+keepalived) -->ingress controller (node1/node2)---->pod
User --》 node(vip ingress controller+keepalived主备)-->pod
Ingress(http/https) --> service --->pod

相关内容

热门资讯

女子一吃东西就“大小眼” 确诊... 女子一吃东西就“大小眼”  【女子一吃东西就“大小眼”】河南郑州一位女子患上了一种罕见的怪病。只要一...
“英版特朗普”攻城略地,英国要... 【文/观察者网 柳白】英国政坛正在经历一场强烈震荡。刚刚结束的英国地方议会选举中,首相斯塔默领导的工...
记者观察|透过这场吹风会,看懂... 一项刚从实验室诞生的新技术,如何“能落地、长得好”? 过去很多年里,我们是“先研发技术,再给它找地方...
大破防!美贸易代表炮轰美国法官... 文 观察者网 齐倩美国法院裁定新一轮全球关税非法,特朗普政府随即表示上诉。当地时间5月8日,美国贸易...
地暖管铺的稀,家里不热怎么办- 导读:地暖管铺设是有一定的标准的,如果没有达到预期效果可以找厂家协调解决,实在不行,可以采用墙角线明...
楼梯墙砖怎么贴才好看 楼梯墙砖可以分两部分来贴,第1部分要贴深颜色的,也就是楼梯与墙之间交接的地方,这些地方容易积攒灰尘,...
挂钩买什么样式的好用 吸盘挂钩... 在家居生活中,挂钩几乎是每家每户都有的小配饰。本文介绍了挂钩的几种好用样式,包括粘胶式无痕挂钩、易取...
电暖器什么样的环保? 最佳回答 现在市场上的电暖器还是比较多的。全国一线品牌有格力电暖器、美的电暖器、艾美特电暖器、先锋电...
农村可以安装什么样的热水器 农村地区的生活条件相对城市会落后一些,对于供暖、供热、供水等方面的设备要求也会有所不同。在热水器这一...
中国短剧剧组在泰国被查,8人被... 2026年5月8日,泰国清迈旅游警察逮捕了一个正在清迈非法拍摄中国短剧的8人剧组。这个剧组以当地知名...