Ingress七层路由机制实现域名的方式访问k8s

 更新时间:2022年03月18日 12:28:07   作者:、重明  
这篇文章主要为大家介绍了Ingress七层路由机制实现域名的方式访问k8s内部应用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步

Ingress概念:

通俗来讲:Ingress和之前说的Service、Deployment一样,也是一个k8s的资源类型;Ingress用于实现域名的方式访问k8s的内部应用,Service可能更适于服务间访问。

这东西我们使用的k8s官方维护的本版,另外nginx官方也有一个版本,怎么用看个人。

Ingress支持多种方案:包括 Nginx、Haproxy、Traefik、istio等;在实际中Ingress上面可能还有一层公司的硬件层代理。

大概的流程图如下:

在这里插入图片描述

创建一个Ingress:

这个ingress使用Hlem方式创建,以后会写一篇helm的使用,现在不用管原理。

所需资源准备:

Ingress-nginx使用的两个容器镜像下载地址:

镜像地址:registry.cn-hangzhou.aliyuncs.com

镜像:yyangs/ingress-nginx-controller;yyangs/ingress-nginx-kube-webhook-certgen

chart包:ingress-nginx-4.0.17

首先我们先创建一个Helm(因为要使用helm创建)

[root@k8s-master01 ~]# wget https://get.helm.sh/helm-v3.8.0-linux-amd64.tar.gz
[root@k8s-master01 ~]# tar xf helm-v3.8.0-linux-amd64.tar.gz
[root@k8s-master01 ~]# mv linux-amd64/helm /usr/local/bin/helm

创建一个仓库 ,方便安装ingress:ingress的APP VERSION版本最好要大于0.35,查看其下可用的包

[root@k8s-master01 ~]# helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
"ingress-nginx" has been added to your repositories
[root@k8s-master01 ~]# helm repo list
NAME         	URL                                       
ingress-nginx	https://kubernetes.github.io/ingress-nginx
[root@k8s-master01 ~]# helm search repo ingress-nginx
NAME                       	CHART VERSION	APP VERSION	DESCRIPTION                                       
ingress-nginx/ingress-nginx	4.0.17       	1.1.1      	Ingress controller for Kubernetes using NGINX a...

下载ingress包,将包解压到一个创建的目录中方便修改配置

[root@k8s-master01 ~]# helm pull ingress-nginx/ingress-nginx
ingress-nginx-4.0.17.tgz
[root@k8s-master01 ~]# mkdir /temp
[root@k8s-master01 ~]# mv ingress-nginx-4.0.17.tgz /temp/
[root@k8s-master01 ~]# cd /temp/
[root@k8s-master01 temp]# tar xf ingress-nginx-4.0.17.tgz 
# 进到ingress-nginx目录
[root@k8s-master01 temp]# cd ingress-nginx/

修改values.yaml,基本每一行都代表一个位置

# 源位置
controller:
  name: controller
  image:
    registry: registry.cn-hangzhou.aliyuncs.com
    image: yyangs/ingress-nginx-controller
    ## digest: sha256:0bc88eb15f9e7f84e8e56c14fa5735aaa488b840983f87bd79b1054190e660de
# dns策略
  dnsPolicy: ClusterFirstWithHostNet
# 使用宿主机端口号,性能好
  hostNetwork: true
# 资源类型选择DaemonSet,会在指定节点上部署
  kind: DaemonSet
# 在有标签的node上部署
  nodeSelector:
    kubernetes.io/os: linux
    ingress: "true"
# 类型,本地环境使用
    type: ClusterIP
# 最后位置的另一处源位置
    patch:
      enabled: true
      image:
        registry: registry.cn-hangzhou.aliyuncs.com
        image: yyangs/ingress-nginx-kube-webhook-certgen
        ## digest: sha256:64d8c73dca984af206adf9d6d7e46aa550362b1d7a01f3a0a91b20cc67868660

对上面的修改做一些说明:

镜像源:他默认源是国外的,我们访问不到。所以我替换成了我的阿里源,如果做这个实验的小伙伴可以用我的源;最后一处的源也一样;注意把校验注释

使用hostNetwork: true创建,配合资源类型选择DaemonSet性能更好

dns策略:如果使用hostNetwork,策略需要改成dnsPolicy: ClusterFirstWithHostNet

执行yaml文件创建

# 创建一个命名空间
[root@k8s-master01 ingress-nginx]# kubectl create ns ingress-nginx
namespace/ingress-nginx created
# 因为要在指定node上创建,所以给一台机器创建一个标签
[root@k8s-master01 ingress-nginx]# kubectl label nodes k8s-master03 ingress=true
node/k8s-master03 labeled
# 执行helm创建,那个名称自定义,之前出了一点问题,所以换个名字。
[root@k8s-master01 ~]# cd /temp/ingress-nginx/
您在 /var/spool/mail/root 中有新邮件
[root@k8s-master01 ingress-nginx]# helm install nginx-ingress -n ingress-nginx .
[root@k8s-master01 temp]# kubectl get pod -n ingress-nginx -o wide 
NAME                                           READY   STATUS    RESTARTS   AGE   IP             NODE           NOMINATED NODE   READINESS GATES
nginx-ingress-ingress-nginx-controller-lrs9s   1/1     Running   0          22h   192.168.10.4   k8s-master03   <none>           <none>

可以看到这个Pod已经起来了,并且部署在master03节点上,也就是有ingress=ture标签的节点上,这样对ingress进行扩容或缩容的时候就会方便很多。
比如当你想扩容的时候只需要在想扩容的节点打上对应的标签,就会自动部署一个新的Pod,就像下面这条命令。

kubectl label node k8s-master02 ingress=true

当我不想要这个Pod的时候,缩容也会比较简单,去掉标签就可以了,可以看出标签的强大之处,减号等于删除标签的意思。

kubectl label node k8s-master02 ingress-

hostNetwork方式部署的ingress,会在宿主机启动一个进程,我们去部署Pod的节点看一下,

[root@k8s-master03 ~]# ss -tpln | grep 80
LISTEN     0      16384  192.168.10.4:2380                     *:*                   users:(("etcd",pid=1703,fd=7))
LISTEN     0      16384        *:80                       *:*                   users:(("nginx",pid=106434,fd=19),("nginx",pid=106427,fd=19))
LISTEN     0      16384        *:80                       *:*                   users:(("nginx",pid=106433,fd=11),("nginx",pid=106427,fd=11))
LISTEN     0      16384     [::]:80                    [::]:*                   users:(("nginx",pid=106433,fd=12),("nginx",pid=106427,fd=12))
LISTEN     0      16384     [::]:80                    [::]:*                   users:(("nginx",pid=106434,fd=20),("nginx",pid=106427,fd=20))
[root@k8s-master03 ~]# ps aux | grep nginx
root       2622  0.0  0.1   8852  5456 ?        Ss   01:12   0:00 nginx: master process nginx -g daemon off;
101        2759  0.0  0.0   9272  2456 ?        S    01:12   0:00 nginx: worker process
101        2760  0.0  0.0   9272  2456 ?        S    01:12   0:00 nginx: worker process
root      25605  0.0  0.0 112840  2292 pts/0    S+   15:19   0:00 grep --color=auto nginx
101      106347  0.0  0.0    208     4 ?        Ss   09:08   0:00 /usr/bin/dumb-init -- /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key
101      106359  0.1  1.1 743048 44956 ?        Ssl  09:08   0:25 /nginx-ingress-controller --publish-service=ingress-nginx/nginx-ingress-ingress-nginx-controller --election-id=ingress-controller-leader --controller-class=k8s.io/ingress-nginx --ingress-class=nginx --configmap=ingress-nginx/nginx-ingress-ingress-nginx-controller --validating-webhook=:8443 --validating-webhook-certificate=/usr/local/certificates/cert --validating-webhook-key=/usr/local/certificates/key
101      106427  0.0  0.9 145100 36332 ?        S    09:08   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf
101      106433  0.0  1.0 157128 40848 ?        Sl   09:08   0:06 nginx: worker process
101      106434  0.0  1.0 157128 41000 ?        Sl   09:08   0:07 nginx: worker process
101      106435  0.0  0.7 143072 29120 ?        S    09:08   0:00 nginx: cache manager process

运行之后,接下来尝试简单的使用:

传统架构中发布服务,需要配置修改nginx的配置文件;在k8s中ingress与其他资源类型一样,通过yaml去声明一个ingress的实例。
官方网址:ingress-controller官方文档详细内容可以看这。

使用官网上一个例子先认识一下ingress

vim ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
  name: example
spec:
  ingressClassName: nginx
  rules:  # 可以配置多个rules
  - host: foo.bar.com # 域名匹配
    http:
      paths:  # 相当于nginx的location配合,同一个host可以配置多个paths
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc # 代理的哪个svc
            port: 
              number: 80

这里说一下上面这个实例的一些说明:

从rules开始向下是定义前后端连接的规则:

host:代表基于域名访问,客户端通过这个域名访问后端资源

http.paths:相当于nginx的location中匹配规则

pathType:Prefix:路径类型,路径由“/”符号分隔为一个个元素,匹配规则为逐个元素进行前缀匹配,默认ImplementationSpecific,还有一种是Exact。

backend:定义后端

service:下定义后端的地址,包括代理的svc和端口号

这里我遇到一个问题:

[root@k8s-master01 ~]# kubectl create -f ingress.yaml 
Error from server (InternalError): error when creating "ingress.yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": service "ingress-nginx-controller-admission" not found

创建的时候报错:

yaml": Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes. io"

我查看了下网上说应该是删除之前创建的资源时没删干净。

[root@k8s-master01 ~]# kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io 
NAME                                    WEBHOOKS   AGE
ingress-nginx-admission                 1          3d

然后查看下果然有个ingress-nginx-admission,删除后在创建就成功了

[root@k8s-master01 ~]# kubectl delete -A validatingwebhookconfigurations.admissionregistration.k8s.io ingress-nginx-admission 
validatingwebhookconfiguration.admissionregistration.k8s.io "ingress-nginx-admission" deleted

执行ingress.yaml文件,这次就创建成功了。

[root@k8s-master01 ~]# kubectl create -f ingress.yaml 
ingress.networking.k8s.io/exmple created
[root@k8s-master01 ~]# kubectl get ingress
NAME     CLASS    HOSTS         ADDRESS   PORTS   AGE
exmple   <none>   foo.bar.com             80      10m

ingress也是可以配置多域名的

就是增加一个host实例。

# 第一个域名
  - host: foo.bar.com 
    http:
      paths:  
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port: 
              number: 80
# 第二个域名
  - host: foo2.bar.com 
    http:
      paths:  
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: nginx-svc-2
            port: 
              number: 80

然后更新yaml文件就好了

[root@k8s-master01 ~]# kubectl replace -f ingress.yaml

以上就是Ingress七层路由机制实现域名的方式访问k8s的详细内容,更多关于Ingress七层路由机制域名访问k8s的资料请关注脚本之家其它相关文章!

相关文章

  • SSH证书登录方法详细教程

    SSH证书登录方法详细教程

    SSH是服务器登录工具,密码登录和密钥登录,都有各自的缺点。SSH还有第三种登录方法,那就是证书登录。很多情况下,它是更合理、更安全的登录方法,本文介绍证书登录的方法,需要的朋友可以参考下
    2022-12-12
  • Centos中VNC远程桌面程序的安装与使用教程

    Centos中VNC远程桌面程序的安装与使用教程

    这篇文章主要介绍了Centos中VNC远程桌面程序的安装与使用的方法,较为详细的分析了CentOS的VNC远程桌面程序安装、配置、连接、启动等命令与相关操作技巧,需要的朋友可以参考下
    2016-07-07
  • rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted

    rsync同步时出现rsync: failed to set times on “xxxx”: Operation no

    今天在同步数据的时候提示rsync: failed to set times on “xxxx”: Operation not permitted,一般来说要不是服务器时间不对或者权限没有设置好
    2016-12-12
  • DNS、DHCP的备份恢复bat(批处理自动实现)

    DNS、DHCP的备份恢复bat(批处理自动实现)

    现在的服务器上运行了很多系统服务,虽然中间没有出过什么问题,但是还是怕,要是出了问题,就是好几天的时间没有了,累4人的事情啊。所以要把什么东西都backup一下
    2016-01-01
  • zlmediakit实现 rtsp流服务器的方法

    zlmediakit实现 rtsp流服务器的方法

    这篇文章主要介绍了zlmediakit实现 rtsp流服务器,本次实现是将内存中的H264数据经过zlmediakit实现为rtsp流,我用的是CAPI的方式,将zlmediakit作为一个sdk嵌入到自己的程序中而不是作为一个独立的进进程服务,需要的朋友可以参考下
    2024-04-04
  • 分享几款linux下常见的vps控制面板

    分享几款linux下常见的vps控制面板

    VPS主机控制面板主要是用来控制和管理VPS服务器的,一般来说如果想要将VPS主机共享出来给多个人使用的话,我们就会采用类似于Cpanel、Virtualmin等主机控制面板。如果VPS主机只是一个人使用的话部落建议还是不要使用主机控制面板,以免带来不必要的安全隐患
    2017-07-07
  • http状态码汇总及问题经验总结

    http状态码汇总及问题经验总结

    网站的http状态对于网站维护人员来说是相当重要的,当网站出现问题的时候,我们首先要诊断一下网站的http状态,从而进一步确认哪里出现的问题
    2013-11-11
  • 服务器维护小常识(硬盘内容增加、数据库优化等)

    服务器维护小常识(硬盘内容增加、数据库优化等)

    为了能更好的使用和延长服务器的使用寿命,定期的对服务器进行维护是非常必要的。但是,在维护服务器的时候一定要小心的处理好维护的工作,否则出现错误的话就会影响很大
    2012-07-07
  • ISAPI Rewrite iis伪静态组件最新教程

    ISAPI Rewrite iis伪静态组件最新教程

    自从把网站从Apache迁移到IIS,就开始不断地折腾Joomla和WordPress的静态化的问题,最终还是ISAPI Rewrite解决了所有问题,如果你有类似问题,希望这篇教程能对你有所帮助。
    2010-08-08
  • Deployment副本无状态服务创建及水平扩展

    Deployment副本无状态服务创建及水平扩展

    这篇文章主要为大家介绍了Deployment副本无状态服务及水平扩展,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03

最新评论