优秀的编程知识分享平台

网站首页 > 技术文章 正文

Kubernetes系列(四)Ingress(kube ingress)

nanyue 2024-10-26 11:26:12 技术文章 3 ℃

Kubernetes系列(四)Ingress

本文主要介绍 Ingress 的入门使用。

Ingress 概述

Kubernetes 对外暴露服务(Service)主要有两种方式:NodePortLoadBalance,此外 externalIps 也可以使各类 service 对外提供服务,但是当集群服务很多的时候,NodePort方式最大的缺点是会占用很多集群机器的端口;LB方式最大的缺点则是每个Service一个LB又有点浪费和麻烦,并且需要K8s之外的支持;而 Ingress 则只需要一个 NodePort或者一个LB就可以满足所有 Service 对外服务的需求。工作机制大致如下图:

Ingress 安装

Minikube 中自带了 Ingress 插件

  • ? 安装 Ingress
PS C:\Users\yueyong> minikube addons enable ingress
    ? Using image registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.1
    ? Using image registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1
    ? Using image registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1
  Verifying ingress addon...
  启动 'ingress' 插件
  • ? 检查 Ingress 服务
PS C:\Users\yueyong> kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.104.16.77   <none>        80:31598/TCP,443:30962/TCP   4m39s
ingress-nginx-controller-admission   ClusterIP   10.98.43.189   <none>        443/TCP                      4m39s
PS C:\Users\yueyong> kubectl get pod -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-rsdhz        0/1     Completed   0          4m49s
ingress-nginx-admission-patch-r2xt2         0/1     Completed   1          4m49s
ingress-nginx-controller-647bbc75dd-x2wld   1/1     Running     0          4m49s
  • ? 查看 minikube 插件清单信息
PS C:\Users\yueyong> minikube addons list
|-----------------------------|----------|--------------|--------------------------------|
|         ADDON NAME          | PROFILE  |    STATUS    |           MAINTAINER           |
|-----------------------------|----------|--------------|--------------------------------|
| ambassador                  | minikube | disabled     | 3rd party (Ambassador)         |
| auto-pause                  | minikube | disabled     | Google                         |
| csi-hostpath-driver         | minikube | disabled     | Kubernetes                     |
| dashboard                   | minikube | disabled     | Kubernetes                     |
| default-storageclass        | minikube | enabled ?   | Kubernetes                     |
| efk                         | minikube | disabled     | 3rd party (Elastic)            |
| freshpod                    | minikube | disabled     | Google                         |
| gcp-auth                    | minikube | disabled     | Google                         |
| gvisor                      | minikube | disabled     | Google                         |
| headlamp                    | minikube | disabled     | kinvolk.io                     |
| helm-tiller                 | minikube | disabled     | 3rd party (Helm)               |
| inaccel                     | minikube | disabled     | InAccel <info@inaccel.com>     |
| ingress                     | minikube | enabled ?   | 3rd party (unknown)            |
| ingress-dns                 | minikube | disabled     | Google                         |
| istio                       | minikube | disabled     | 3rd party (Istio)              |
| istio-provisioner           | minikube | disabled     | 3rd party (Istio)              |
| kong                        | minikube | disabled     | 3rd party (Kong HQ)            |
| kubevirt                    | minikube | disabled     | 3rd party (KubeVirt)           |
| logviewer                   | minikube | disabled     | 3rd party (unknown)            |
| metallb                     | minikube | disabled     | 3rd party (MetalLB)            |
| metrics-server              | minikube | disabled     | Kubernetes                     |
| nvidia-driver-installer     | minikube | disabled     | Google                         |
| nvidia-gpu-device-plugin    | minikube | disabled     | 3rd party (Nvidia)             |
| olm                         | minikube | disabled     | 3rd party (Operator Framework) |
| pod-security-policy         | minikube | disabled     | 3rd party (unknown)            |
| portainer                   | minikube | disabled     | Portainer.io                   |
| registry                    | minikube | disabled     | Google                         |
| registry-aliases            | minikube | disabled     | 3rd party (unknown)            |
| registry-creds              | minikube | disabled     | 3rd party (UPMC Enterprises)   |
| storage-provisioner         | minikube | enabled ?   | Google                         |
| storage-provisioner-gluster | minikube | disabled     | 3rd party (unknown)            |
| volumesnapshots             | minikube | disabled     | Kubernetes                     |
|-----------------------------|----------|--------------|--------------------------------|

部署 ingress 资源

参考上一篇,将 deployment 部署的 service 通过 ingress 暴露。

  • ? 创建 ingress.yaml
# 创建名为 ingress-test 的命名空间
# 版本号
apiVersion: v1    
# 表明创建的种类为命名空间
kind: Namespace      
# 定义资源的元数据信息,比如资源的名称、namespace、标签等信息
metadata: 
  #定义命名空间的名称           
  name: ingress-test            
  
---
# 创建 service (一组pod 对外访问的包装)
# 版本号
apiVersion: v1     
# 表明创建资源的种类为service
kind: Service         
metadata: 
  # 定义service的名称,在同一namespace中必须是唯一的
  name: nginx-svc
  # 定义资源属于哪一个命名空间  
  namespace: ingress-test       
# 定义service所需要的参数属性
spec:                  
  ports:  
  - port: 80          
    protocol: TCP
    # 需要转发到后端的端口,nginx默认端口为80
    targetPort: 80     
  selector:
    # 如何确定需要代理哪一个服务,通过标签,设置后会自动匹配同一命名空间下标签为nignx的pod代理
    app: nginx  
  # service的类型,指定service的访问方式,默认ClusterIP 
  type: ClusterIP        
  #ClusterIP:虚拟的服务ip地址,用于k8s集群内部的pod访问,在Node上kube-porxy通过设置的iptables规则进行转发
  #NodePort:使用宿主机端口,能够访问各Node的外部客户端通过Node的IP和端口就能访问服务器
  #LoadBalancer:使用外部负载均衡器完成到服务器的负载分发,
  
---
# 版本号
apiVersion: apps/v1 
# 类型    
kind: Deployment       
metadata: 
  # 名字
  name: nginx 
  # 属于的命名空间  
  namespace: ingress-test        
  labels: 
    # 给自己打个标签
    app: nginx         
spec: 
  # 副本数量,为2,稍后会创建两个pod
  replicas: 2           
  selector: 
    matchLabels: 
      # 这里设置将要匹配的标签
      app: nginx        
  template: 
    metadata: 
      labels: 
        # 设置创建pod后将要给它打上的标签
        app: nginx      
    spec:
      containers:
        # 资源名,创建时会自动加后缀,防止名称重复
        - name: nginx    
          # 创建资源的镜像,这里选择的是之前上传到harbor仓库的镜像
          image: harbor.k8s.info.com/yueyong/centos-nginx:1.22.0 
          # 拉取策略,这里的意思是如果本地没有就从远程仓库拉取    
          imagePullPolicy: IfNotPresent   
          ports: 
            - containerPort: 80     #容器对外开放的端口
---
# 版本号
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-svc-ingress
  namespace: ingress-test     
spec:
  rules:
  # 定义一个虚拟的 host,到时候通过它来访问服务
  - host: centos-nginx.com
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              # service name
              name: nginx-svc
              port:
                # service port 
                number: 80
  • ? 执行 ingress.yaml
PS D:\workspace\docker\demo3> kubectl apply -f .\ingress.yaml
namespace/ingress-test unchanged
service/nginx-svc unchanged
deployment.apps/nginx configured
ingress.networking.k8s.io/nginx-svc-ingress unchanged
PS D:\workspace\docker\demo3>
  • ? 检查资源
PS D:\workspace\docker\demo3> kubectl get -f .\ingress.yaml
NAME                     STATUS   AGE
namespace/ingress-test   Active   2m50s


NAME                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/nginx-svc   ClusterIP   10.102.98.154   <none>        80/TCP    2m50s


NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   2/2     2            2           2m50s


NAME                                          CLASS   HOSTS              ADDRESS        PORTS   AGE
ingress.networking.k8s.io/nginx-svc-ingress   nginx   centos-nginx.com   172.20.1.120   80      2m50s
  • ? 访问 配置 hosts : 172.20.1.120 centos-nginx.com (参考上一步获取的 ingress 信息) 获取 ingress nodeport 类型service 对外访问的端口信息:
PS D:\workspace\docker\demo3> kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.104.16.77   <none>        80:31598/TCP,443:30962/TCP   39m
ingress-nginx-controller-admission   ClusterIP   10.98.43.189   <none>        443/TCP                      39m
PS D:\workspace\docker\demo3>

可以看到,NodePort 类型的 service,80 端口转发到了 31598 ,443 端口转发到了 30962,本例未使用https,所以通过 http://centos-nginx.com:31598 访问即可:

上一篇

欢迎关注我的公众号“云原生拓展”,原创技术文章第一时间推送。

最近发表
标签列表