k8s的对外服务---ingress

这篇具有很好参考价值的文章主要介绍了k8s的对外服务---ingress。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

service的作用体现在两个方面:

  1. 集群内部:不断追踪pod的变化。他会更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制。

  2. 集群外部:类似负载均衡器,把流量IP+端口,不涉及转发url(http、https)。把请求转发到pod当中。

service有四种类型:

ClusterIP:创建service的默认类型

NodePort:容器端口 > service端口 > nodeport。 设定了nodeport后,每个节点都会有一个端口被打开。 端口范围:30000-32767。 访问:节点ip+30000-32767实现负载均衡

loadbalancer:云平台上的一种service服务。云平台提供负载均衡的IP地址

extrenal:域名映射。

什么是ingress?

ingress是一个API对象,通过yaml文件进行配置。

ingress的作用:是定义请求如何转发到service的规则。相当于一个配置模板

ingress通过http和https暴露集群内部的service。

ingress给service提供外部的URL域名,负载均衡以及ssl/tls(加密的https)的能力。实现一个基于域名的负载均衡。

ingress-controller

ingress-controller的作用就是具体的实现反向代理和负载均衡的程序。对ingress定义的规则进行解析。根据ingress的配置规则进行请求转发。

ingress-controlle是以pod的方式运行在集群中

ingress-controller不是k8s自带的组件功能。他是一个统称,只要这个组件可以实现反向代理和负载均衡可以对ingress进行解析的、可以根据规则请求转发的都是ingress-controller

nginx-ingress-controller、traefik都是开源的ingress-controller

ingress资源的定义项

1、 定义外部流量的路由规则

2、 定义了服务的暴露方式、主机名、访问路径和其他的选项。

3、 实现负载均衡。这是由ingress-controller实现的。

ingress暴露服务的方式

1、 deployment+LoadBalancer模式:这种模式是将ingress部署在公有云。例如:华为云、阿里云、腾讯云等

在ingress的配置文件内会有一个type。type会以键值对形式设置 type: LoadBalancer

公有云平台会为 LoadBalancer 的service创建一个负载均衡器。绑定一个公网地址。通过域名指向公网地址。就可以实现集群对外暴露。

2、 DaemonSet+hostnetwork+nodeSelector模式:

其中DaemonSet会在每个节点创建一个pod。

hostnetwork表示pod和节点主机共享网络命名空间。容器内可以直接使用节点主机的IP+端口。pod中的容器可以直接访问主机上的网络资源。

nodeSelector根据标签来选择部署的节点。nginx-ingress-controller部署的节点。

缺点:直接利用节点主机的网络和端口。一个node之内部署一个ingress-controller pod。

DaemonSet+hostnetwork+nodeSelector模式性能最好,比较适合大并发的生产环境。

ingress的数据流向图:

k8s的对外服务---ingress,kubernetes,linux,容器

  1. 客户端发起请求域名将先到DNS

  2. DNS开始解析域名。映射到ingress-controller所在的节点

  3. ingress-controller以pod形式运行在节点上。hostnetwork可以和节点主机共享网络

  4. ingress的配置来定义URL的地址

  5. 根据ingress的标签匹配将请求转发到service

  6. service寻找endpoints发现匹配能够转发的pod

  7. 最终还是由ingress-controller将(http/https)请求转发到不同的pod上。实现负载均衡

service和endpoints在这里起发现和监控的总用

实际的负载均衡由ingress-controller实现

DaemonSet+hostnetwork+nodeSelector模式如何实现?

实验部署:

master01  20.0.0.32
node01  20.0.0.34
node02  20.0.0.35

master01--
修改ingress的yaml文件
vim mandatory.yaml 
191 #kind: Deployment
192 kind: DaemonSet
200 #  replicas: 1
215       hostNetwork: true
220         test1: "true"


每台节点主机都添加nginx-ingress-controller镜像
tar -xf ingree.contro-0.30.0.tar.gz
docker load -i ingree.contro-0.30.0.tar

master01--
kubectal get pod -n ingress-nginx

kubectl label nodes node02 ingress=true

kubectl apply -f mandatory.yaml

master01---
vim nginx.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi

---
#定义pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app
  labels:
    app: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          volumeMounts:
          - name: nfs-pvc
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc
        persistentVolumeClaim:
          claimName: nfs-pvc

---
#定义service

apiVersion: v1
kind: Service
metadata:
  name: nginx-app-svc
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
    app: nginx1

---
#定义ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-app-ingress
spec:
  rules:
  - host: www.test1.com
    http:
      paths:
      - path: /
#匹配工作目录的根目录
        pathType: Prefix
#根据前缀进行匹配 只要是/开头的都可以匹配到例如/ www.test1.com/www1/www2/www3
        backend:
#指定后台服务器
          service:
            name: nginx-app-svc
            port:
              number: 80
vim /etc/hosts
20.0.0.32 master01
20.0.0.34 node01
20.0.0.35 node02 www.test1.com
20.0.0.36 hub.test.com k8s5 
#做域名和地址映射

k8s5---
进入挂载卷之后
echo 123 > index.html

master01---
curl www.test1.com
#测试网页是否可以访问
实验完成!

创建地址映射

k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器

 回到k8s主机查看共享目录是否生成

k8s的对外服务---ingress,kubernetes,linux,容器

测试访问是否成功

k8s的对外服务---ingress,kubernetes,linux,容器

8181端口,nginx-controller默认配置的一个bachend。反向代理的端口。

所有请求当中。只要是不符合ingress配置的请求就会转发到8181端口

deployment+NodePort模式

deployment+NodePort的数据流向图:

k8s的对外服务---ingress,kubernetes,linux,容器

实验部署:

master01---
vim mandatory.yaml 
191 kind: Deployment
215       #hostNetwork: true
200   replicas: 1
219         kubernetes.io/os: linux
220         #test1: "true"

kubectl apply -f mandatory.yaml 

wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
#获取service.yaml文件

vim service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
#执行这个yaml文件,会生成一个service。在ingress-nginx这个命名空间生成一个service。
#所有的controller的请求都会从这个定义的service的nodeport的端口。
#把请求转发到自定义的service的pod

kubectl apply -f service-nodeport.yaml

vim nodeport.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc2
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app2
  labels:
    app: nginx2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx2
  template:
    metadata:
      labels:
        app: nginx2
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          volumeMounts:
          - name: nfs-pvc2
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc2
        persistentVolumeClaim:
          claimName: nfs-pvc2
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app-svc1
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
    app: nginx2
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-app-ingress
spec:
  rules:
  - host: www.test2.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-app-svc1
            port:
              number: 80

kubectl apply -f nodeport.yaml

k8s5---
查看挂载目录
echo 123 > index.html

master01---
vim /etc/hosts
20.0.0.32 master01
20.0.0.34 node01
20.0.0.35 node02 www.test1.com www.test2.com
20.0.0.36 hub.test.com k8s5 www.test1.com

curl www.test2.com:31456
实验完成!

 k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器

nodeport不再是deployment的service创建的

而是由ingress创建的

  1. url请求先到ingress

  1. ingress根据标签匹配ingress-nodeport

  1. 通过标签寻找指定的service

  1. 最终由service找到deployment

核心的控制组件时nginx-ingress-controller

host----ingress的配置找到pod----controller----把请求发到pod

nodeport-----controller-----ingress----service----pod

nodeport暴露端口的方式是最简单的。nodeport多了一层net(地址转换)

并发量大的对性能会有一定影响。内部都会用nodeport

通过虚拟主机的方式实现http代理

通过ingress的方式实现:一个ingress可以访问不同的主机

实验举例:

vim pod1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment1
  labels:
    test: nginx1
spec:
  replicas: 1
  selector:
    matchLabels:
      test: nginx1
  template:
    metadata:
      labels:
        test: nginx1
    spec:
      containers:
        - name: nginx1
          image: nginx:1.22

---
apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    test: nginx1

vim pod2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment1
  labels:
    test2: nginx2
spec:
  replicas: 1
  selector:
    matchLabels:
      test2: nginx2
  template:
    metadata:
      labels:
        test2: nginx2
    spec:
      containers:
        - name: nginx2
          image: nginx:1.22

---
apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    test2: nginx2
    
vim pod-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
spec:
  rules:
    - host: www.test1.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: svc-1
              port:
                number: 80

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress2
spec:
  rules:
    - host: www.test2.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: svc-2
              port:
                number: 80
kubectl apply -f pod.yaml
kubectl apply -f pod2.yaml
kubectl apply -f pod-ingress.yaml

vim /etc/hosts
20.0.0.32 master01
20.0.0.34 node01 www.test1.com www.test2.com
20.0.0.35 node02 www.test1.com www.test2.com
20.0.0.36 hub.test.com k8s5 www.test1.com

curl www.test1.com:31456
curl www.test2.com:31456
访问成功实验完成!

k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器

daemonset+hostnetwork+nodeselector实现访问多个主机

实验举例:

vim daemoset-hostnetwork-nodeselector1.yaml


apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc1
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app1
  labels:
    app: nginx1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          volumeMounts:
          - name: nfs-pvc1
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc1
        persistentVolumeClaim:
          claimName: nfs-pvc1
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app-svc1
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
    app: nginx1
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-app-ingress1
spec:
  rules:
  - host: www.test1.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-app-svc1
            port:
              number: 80

kubectl apply -f daemoset-hostnetwork-nodeselector1.yaml


vim daemoset-hostnetwork-nodeselector2.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc2
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-app2
  labels:
    app: nginx2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx2
  template:
    metadata:
      labels:
        app: nginx2
    spec:
      containers:
        - name: nginx
          image: nginx:1.22
          volumeMounts:
          - name: nfs-pvc2
            mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc2
        persistentVolumeClaim:
          claimName: nfs-pvc2
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-app-svc2
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  selector:
    app: nginx2
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-app-ingress2
spec:
  rules:
  - host: www.test2.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-app-svc2
            port:
              number: 80

kubectl apply -f daemoset-hostnetwork-nodeselector2.yaml

vim mandatory.yaml
192 kind: DaemonSet
200   #replicas: 1
215       hostNetwork: true
219         #kubernetes.io/os: linux
220         test1: "true"

kubectl apply -f mandatory.yaml

curl www.test1.com
curl www.test2.com
实验完成!!


k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器 k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器

 

通过虚拟主机的方式实现http代理

通过ingress的方式实现:一个ingress可以访问不同的主机

实验举例:

vim pod1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment1
  labels:
    test: nginx1
spec:
  replicas: 1
  selector:
    matchLabels:
      test: nginx1
  template:
    metadata:
      labels:
        test: nginx1
    spec:
      containers:
        - name: nginx1
          image: nginx:1.22

---
apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    test: nginx1

vim pod2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment1
  labels:
    test2: nginx2
spec:
  replicas: 1
  selector:
    matchLabels:
      test2: nginx2
  template:
    metadata:
      labels:
        test2: nginx2
    spec:
      containers:
        - name: nginx2
          image: nginx:1.22

---
apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    test2: nginx2
    
vim pod-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress1
spec:
  rules:
    - host: www.test1.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: svc-1
              port:
                number: 80

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress2
spec:
  rules:
    - host: www.test2.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: svc-2
              port:
                number: 80
kubectl apply -f pod.yaml
kubectl apply -f pod2.yaml
kubectl apply -f pod-ingress.yaml

vim /etc/hosts
20.0.0.32 master01
20.0.0.34 node01 www.test1.com www.test2.com
20.0.0.35 node02 www.test1.com www.test2.com
20.0.0.36 hub.test.com k8s5 www.test1.com

curl www.test1.com:31456
curl www.test2.com:31456
访问成功实验完成!

ingress实现https代理访问

https拥有证书和密钥。

需要创建证书和密钥

secrets保存密钥信息。部署pod时把secrets挂载到pod

实验举例:

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
#req:生成证书文件命令
#x509:生成x.509自签名的证书
#-sha256:表示使用shaa-256的散列算法
#-nodes:表示生成的密钥不加密
#-days 365:证书有效期是365天
#-newkey rsa:2048:表示使用RSA的密钥队,长度是2048位
#-keyout tls.key:生成密钥文件
#-out tls.crt:生成证书文件
#-subj "/CN=nginxsvc/O=nginxsvc":表示添加一个主题
#CN:common name 名称
#O:表示organization组织

kubectl create secret tls tls-secret --key tls.key --cert tls.crt
#创建secret保存密钥和证书


vim ingress-https.yaml
#定义pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-https
  labels:
    app: https
spec:
  replicas: 3
  selector:
    matchLabels:
      app: https
  template:
    metadata:
      labels:
        app: https
    spec:
      containers:
        - name: nginx
          image: nginx:1.22

---
#定义service
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app: https

---
#定义ingress和加密key
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress-https
spec:
  tls:
    - hosts:
      - www.123ccc.com
      secretName: tls-secret
#加密的配置保存在ingress当中
#请求---ingress-controller---ingress---转发到service
#目的是为了先验证通过,再实现转发到service对应的pod
#在代理进行时就要先验证密钥队,然后再把请求转发到service对应的pod
  rules:
    - host: www.123ccc.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
#定义使用那个service的名称
            service:
              name: nginx-svc
#定义使用那个pod的名称
              port:
                number: 80

kubectl apply -f ingress-https.yaml

kubectl get svc -n ingress-nginx -o wide

curl -k https://www.123ccc.com:端口号

https方式同样可以实现负载均衡轮询

内部:DNS解析、地址映射

外部:收费

nginx的登录账户认证

实验举例:

htpasswd -c auth zyg
New password: 123456
Re-type new password: 123456

kubectl create secret generic basic-auth --from-file=auth

vim basic-auth.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-auth
  annotations:
#开启认证模块的配置
    nginx.ingress.kubernetes.io/auth-type: basic
#设置认证类型为basic。是k8s自带的认证加密模块
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
#把认证的加密模块导入到ingress当中
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required-zyg'
#设置认证窗口的提示信息。
spec:
  rules:
  - host: www.zyg.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port:
              number: 80
#使用http创建basic-auth
#开启认证加密的文件
#创建ingress开启认证模式
#将auth配置文件导入ingress当中
在虚拟机访问测试

k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器

nginx的重写重定向

实验举例:

vim nginx-rewite.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-rewrite
  annotation:
    nginx.ingress.kubernetes.io/rewrite-target: https://www.123ccc.com:30416
#访问页面会跳转到指定页面
spec:
  rules:
  - host: www.zyg1.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port:
              number: 80
#只要访问www.zyg.com:端口号就可以跳转到www.123ccc.com:端口号
kubectl apply -f nginx-rewite.yaml

traefik ingress controller

traefik是一个为了让部署微服务更加快捷而诞生的http的反向代理,负载均衡。是七层代理工作在应用层和nginx-ingress-controller一样

traefik可以实时的和k8s的api进行交互可以感知后端servic以及pod的变化。可以自动更新配置和重载。

traefik它可以自动感知后端的变化

traefik的部署方式

  1. daemonset方式

  2. deployment方式

daemonset方式的特点

daemonset方式一般用于对外集群

因为对外的业务经常变更使用daemonset可以自动发现服务配置所以用于对外

设置对外服务的标签:traefik-type: external

  1. 每个节点都会部署一个traefik

  2. 具有节点感知功能。可以自动发现、更新容器的配置。不需要手动重载。可以直接生效

缺点:资源占用较多。资源利用率不是很好。无法扩缩容。

大型的集群中daemonset可能会运行多个traefik的实例。尤其是在节点上不需要大量容器运行的情况下。

deployment方式的特点

deployment方式一般用于对内集群

因为集群内部相对稳定,更新和变化也比较少,适合deployment

设置对内服务标签:traefik-type: internal

  1. 集中办公控制,可以使用少量的实例来运行处理整个集群的流量

  2. 容易升级和维护

缺点:deployment的负载均衡不会均分到每个节点。

他无法感知容器内部配置的变化,需要手动更新

nginx-ingress和traefik-ingress的区别

相同点:

  1. 工作原理一样。都是七层代理

  2. 都可以动态更新配置

  3. 都可以自动发现服务

traefik-ingress的自动更新重载更快,更方便

nginx-ingress相对较慢

traefik-ingress的并发能力只有nginx-ingress的6成 60%

deployment方式

实验举例:

先启动rbac权限再启动deployment最后启动ui


vim traefik-ingress-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-traefik
  labels:
    nginx: traefik
spec:
  replicas: 3
  selector:
    matchLabels:
      nginx: traefik
  template:
    metadata:
      labels:
        nginx: traefik
    spec:
      containers:
        - name: nginx
          image: nginx:1.22

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-traefik-svc1
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    nginx: traefik

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-traefik-test1
spec:
  rules:
    - host: www.yyw.com
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: nginx-traefik-svc1
              port:
                number: 80

到浏览器访问测试:20.0.0.32:31095

k8s的对外服务---ingress,kubernetes,linux,容器

测试自动发现机制

修改yaml文件中的副本数测试

k8s的对外服务---ingress,kubernetes,linux,容器

k8s的对外服务---ingress,kubernetes,linux,容器

总结

ingress的类型:

  1. nginx-ingress-controller

  2. traefik-ingress-controller

这两个都是开源的控制器

nginx-ingress-controller控制器三种模式:

  1. deployment+loadbalancer:公有云提供负载均衡的公网地址

  2. daemonset+hostnetwork+nodeselector:和节点服务共享网络,一个节点一个controller pod。使用宿主机的端口性能最好,适合大并发

  3. deployment+nodeport:最常见也是最常用,也是最简单的方法。但是性能不太好,多了一层nat地址转发。

适用于高并发、大集群使用

traefik-ingress-controller控制器模式:

daemonset:对外,开源自动更新容器配置。使用hostnetwork模式 使用节点网络

deployment:对内 无法自动更新配置。使用nodeport模式。

适用于小集群

https:

  1. 生成证书和密钥

  2. 创建secret保存证书和密钥

加密认证:

  1. htpasswd -c auth:认证文件只能是auth

  2. 创建ingress时指定认证的类型、导入密钥文件、最后加上密钥信息

  3. 定义ingress的规则

  annotations:
#开启认证模块的配置
    nginx.ingress.kubernetes.io/auth-type: basic
#设置认证类型为basic。是k8s自带的认证加密模块
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
#把认证的加密模块导入到ingress当中
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required-zyg'
#设置认证窗口的提示信息。

重定向:

在指定的ingres文件当中声明的url都会跳转到这个地址文章来源地址https://www.toymoban.com/news/detail-808401.html

    nginx.ingress.kubernetes.io/rewrite-target: https://www.123ccc.com:30416
#在指定的ingres文件当中声明的url都会跳转到这个地址

到了这里,关于k8s的对外服务---ingress的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • k8s 对外服务之 Ingress

    service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制;对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问。 在Kubernetes中,Pod的IP地址和service的ClusterIP仅可以在集群网络内部使用,

    2024年02月16日
    浏览(42)
  • k8s之对外服务ingress

    ①集群内部: 不断跟踪pod的变化,不断更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制(endpoint存储最终对外提供服务的IP地址和端口) ②集群外部: 类似负载均衡器,不涉及转发url(不涉及http和https),把流量(IP地址+端口)转发到pod中 (1)nodeport:

    2024年01月18日
    浏览(46)
  • k8s的对外服务--ingress

    service作用体现在两个方面 1、集群内部 不断跟踪pod的变化,更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制 2、集群外部 类似负载均衡器,把流量ip+端口,不涉及转发url(http,https),把请求转发到pod nodePort:容器端口----service端口----nodePort,设定了no

    2024年01月20日
    浏览(47)
  • k8s---ingress对外服务(traefik)

    目录 ingress的证书访问 traefik traefik的部署方式: deamonset deployment nginx-ingress与traefix-ingress相比较 nginx-ingress-controller ui访问 deployment部署 ingress实现https代理访问: 需要证书和密钥 创建证书 密钥 secrets 保存密钥信息,部署pod时把secrets挂载到pod 创建密钥和证书 nginx的登录账户认证

    2024年01月19日
    浏览(40)
  • k8s---ingress对外服务(ingress-controller)

    k8s的对外服务,ingress service作用现在两个方面: 1、集群内部:不断跟踪的变化,更新endpoint中的pod对象,基于pod的ip地址不断变化的一种服务发现机制。 2、集群外部:类似于负载均衡器,把流量(ip+端口),不涉及转发url(http https),把请求转发到pod当中。 service: NodePo

    2024年01月19日
    浏览(46)
  • k8s svc通过externalIPs并结合Keepalived对外暴露服务

    Kubemetes 的 Service需要对集群外暴露,可以通过NodePort、Ingress和LoadBalancer,其中 NodePort:需要预先知道k8s集群节点的IP地址,在使用时需指定node的ip(这样配置存在单点故障); Ingress:实现的是HTTP(S)负载均衡器,只能代理七层; LoadBalancer:需要通过云服务商提供的负载均衡器

    2024年02月05日
    浏览(62)
  • k8s 对外服务之 ingress|ingress的对外暴露方式|ingress http,https代理|ingress nginx的认证,nginx重写

    service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制;对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问。 在Kubernetes中,Pod的IP地址和service的ClusterIP仅可以在集群网络内部使用,

    2024年02月10日
    浏览(46)
  • 【Kubernetes】Kubernetes对外服务之Ingress

      service的作用体现在两个方面,对集群内部,它不断跟踪pod的变化,更新endpoint中对应pod的对象,提供了ip不断变化的pod的服务发现机制;对集群外部,他类似负载均衡器,可以在集群内外部对pod进行访问。   在Kubernetes中,Pod的IP地址和service的ClusterIP仅可以在集群网络内

    2024年02月12日
    浏览(43)
  • 多服务器对外提供一个浮动ip

    浅调研了下浮动ip方案。主要是用来做高可用/灾备切换,同一时间只有一个服务器提供服务。 无论是什么方案,都要解决这三个问题: 如何配置浮动ip 如何实现故障检测 如何切换浮动ip https://blog.csdn.net/helloworld_9/article/details/133799465 主从上网卡配置浮动ip;利用crontab自动执行

    2024年02月20日
    浏览(85)
  • docker 建一个nginx容器,对外提供静态文件服务

    拉取nginx镜像 启动容器 访问时:http://localhost:80/a.jpg 端口号后加文件名字 !!!想要实现文件浏览,必须要在nginx.conf里的http{}里和default.conf里的server{}里添加autoindex on         docker nginx 把一个nginx.conf分成两个,         (nginx.cong)和(default.conf)         访问时:

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包