ingress实现外部访问k8s

Ingress

Kubernetes 暴露服务的方式目前只有三种:LoadBlancer Service、NodePort Service、Ingress。
Ingress 可以提供负载均衡、SSL 和基于名称的虚拟托管。

Ingress 是什么?

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
在这里插入图片描述

可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机等能力。 Ingress 控制器通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。
Ingress 不会公开任意端口或协议。将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。

使用Ingress的好处:

端口管理。减少不必要端口暴露,便于管理。
所有的请求,通过Ingress对应的IP:PORT进入,过滤/转发/负载均衡到相应的service/pod。
NodePort会在每个node上暴露对应的port,不便管理。

环境准备

你必须安装 Ingress 控制器 才能使用 Ingress。
你需要先安装 Ingress 控制器,例如 ingress-nginx。 你可以从许多 Ingress 控制器 中进行选择。

1.创建deployment

[root@master k8s]# vim nginx.yaml 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent

---
kind: Service
apiVersion: v1
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
[root@master k8s]# vim httpd.yaml 

metadata:
  name: httpd
spec:
  replicas: 3
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        imagePullPolicy: IfNotPresent

---
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
spec:
  selector:
    app: httpd
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: default-http-backend #创建一个默认的service,当访问ingress地址找不到时访问默认地址,否则ingress会报错!!!
  namespace: kube-system
spec:
  selector:
    app: httpd
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

2.部署Ingress

2.1 下载Ingress文件

[root@master yaml]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/baremetal/deploy.yaml

2.2 修改yaml文件

[root@master yaml]# vim deploy.yaml
......
spec:
      hostNetwork:  true   #本地网络访问
      dnsPolicy: ClusterFirst
      containers:
        - name: controller
          image: registry.aliyuncs.com/google_containers/nginx-ingress-controller:0.30.0
          imagePullPolicy: IfNotPresent
......
# kubectl  apply  -f  deploy.yaml

2.3 查看

namespace为ingress-nginx

[root@master k8s]# kubectl get pod -o wide -n ingress-nginx 
NAME                                        READY   STATUS      RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
ingress-nginx-admission-create-cmkfl        0/1     Completed   0          33m   10.244.2.9   node3   <none>           <none>
ingress-nginx-admission-patch-rndpw         0/1     Completed   0          33m   10.244.1.8   node1   <none>           <none>
ingress-nginx-controller-5f7f7f888f-29lnm   1/1     Running     0          32m   10.244.1.9   node1   <none>           <none>

3.基于httpd的访问

3.1 创建对应的Ingress规则

[root@master k8s]# vim ingress-httpd.yaml 

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: www.sjxt.com
    http:
      paths:
      - path: /nginx
        backend:
          serviceName: nginx-svc
          servicePort: 80
      - path: /httpd
        backend:
          serviceName: httpd-svc
          servicePort: 80

3.2 查看对应规则的详细信息

[root@master k8s]# kubectl  describe  ingresses web-ingress
Name:             web-ingress
Namespace:        default
Address:          192.168.80.192
Default backend:  default-http-backend:80 (<none>) #此处有坑,对应前面httpd.yaml里要增加default-http-backend服务
Rules:
  Host          Path  Backends
  ----          ----  --------
  www.sjxt.com
                /nginx   nginx-svc:80 (10.244.1.3:80,10.244.2.3:80,10.244.3.5:80)
                /httpd   httpd-svc:80 (10.244.1.4:80,10.244.2.4:80,10.244.3.6:80)
Annotations:    nginx.ingress.kubernetes.io/rewrite-target: /
Events:
  Type    Reason  Age   From                      Message
  ----    ------  ----  ----                      -------#此处有坑,前面报没有default-http-backend服务时不会创建这两个events,httpd.yaml增加增加default-http-backend后需要将ingress-httpd.yaml delete再apply
  Normal  CREATE  36m   nginx-ingress-controller  Ingress default/web-ingress 
  Normal  UPDATE  35m   nginx-ingress-controller  Ingress default/web-ingress

3.4 访问

[root@master k8s]# kubectl get ingress
NAME          CLASS    HOSTS          ADDRESS          PORTS   AGE
web-ingress   <none>   www.sjxt.com   192.168.80.192   80      61m

www.sjxt.com为ingress中rules配置的hosts
ingress也是pod,k8s_POD_ingress-nginx-controller在192.168.80.192节点,可以通过污点限制在固定的node

PS:有DNS的话可以设置解析,没有的话必须在host文件下添加域名解析才可访问

windows:C:\Windows\System32\drivers\etc\

linux:/etc/hosts

[root@client ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.80.192 wwww.ingress.com 
[root@master k8s]# kubectl get svc -n ingress-nginx #30605端口为访问域名+的端口
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.105.104.184   <none>        80:30605/TCP,443:31251/TCP   61m
ingress-nginx-controller-admission   ClusterIP   10.96.69.199     <none>        443/TCP                      61m

参考:
https://blog.csdn.net/weixin_45191791/article/details/109956817
https://www.orchome.com/1452

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes Ingress-Nginx是一个用于管理Kubernetes集群中的Ingress资源的工具。它支持使用Ingress Annotations来实现不同场景下的灰度发布和测试。其中,Nginx Annotations支持基于Cookie的切分流量来实现灰度发布。具体实现方式是通过判断用户请求中的Cookie是否存在灰度标识Cookie来确定是否为灰度用户,从而决定是否返回灰度版本的服务。 在配置中,可以使用以下Annotations来实现灰度发布: - `nginx.ingress.kubernetes.io/canary`:可选值为true/false,表示是否开启灰度功能。 - `nginx.ingress.kubernetes.io/canary-by-cookie`:灰度发布Cookie的键。当键的值等于"always"时,灰度触发生效;其他值则不会走灰度环境。 例如,如果请求的Cookie中包含名为"vip_user"的键,并且值为"always",则会生效灰度配置,访问灰度版本的服务。 要实际执行灰度发布配置,可以使用以下命令: ``` kubectl apply -f ingress-gray.yaml ``` 如果想查看服务并获取Ingress外部端口,可以使用以下命令: ``` kubectl -n ingress-nginx get service ``` 这将显示Ingress-Nginx控制器的服务信息,包括集群IP、外部IP和端口等。 #### 引用[.reference_title] - *1* [【云原生 | Kubernetes 实战】20、K8s Ingress 实现业务灰度发布](https://blog.csdn.net/weixin_46560589/article/details/128505651)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [【Kubernetes】第十篇 - 灰度发布的介绍与实现](https://blog.csdn.net/ABAP_Brave/article/details/129220116)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值