服务类型

- 发布服务:

ClusterIP服务可以解决集群内应用互访的问题,但外部的应用无法访问集群内的资源,某些应用需要访问集群内的资源,我们就需要对外发布服务。

- 服务类型:

ClusterIP是默认类型,可以实现Pod的自动感知与负载均衡,是最核心的服务类型,但ClusterIP不能对外发布服务,如果想对外发布服务可以使用NodePort或Ingress。

- NodePort与Ingress:

NodePort:使用基于端口映射(默认值:30000-32767)的方式对外发布服务,可以发布任意服务(四层)。

Ingress:使用Ingress控制器(一般由Nginx或HAProxy构成),用来发布http、http服务(七层)。

NodePort服务

1. 原理架构

 2. 对外发布服务

[root@master ~]# vim mysvc1.yaml

---

kind: Service

apiVersion: v1

metadata:

  name: mysvc1

spec:

  type: NodePort            # 指定服务类型

  selector:

    app: web

  ports:

  - protocol: TCP

     port: 80

     nodePort: 30080         # 映射端口号,可选配置,不指定时使用随机端口

     targetPort: myhttp

[root@master ~]# kubectl apply -f mysvc1.yaml

service/mysvc configured

[root@master ~]# kubectl get service

NAME           TYPE          CLUSTER-IP   EXTERNAL-IP   PORT(S)

kubernetes    ClusterIP    10.245.0.1        <none>              443/TCP

mysvc           ClusterIP     10.245.1.80     <none>               80/TCP

mysvc1         NodePort    10.245.1.88      <none>              80:30080/TCP

# NodePort会在所有节点映射端口,可以访问任意节点

[root@master ~]# curl http://node-0001:30080

Welcome to The Apache.

[root@master ~]# curl http://node-0002:30080

Welcome to The Apache.

......

Ingress服务

1. Ingress原理架构

- Ingress公开从集群外部到集群内服务的HTTP和HTTPS路由。流量路由由Ingress资源上定义的规则控制。

- Ingress控制器通常由负载均衡器来实现(Nginx、HAProxy)

 2. Ingress安装

- Ingress服务由(规则+控制器)组成

- 规则负责制定策略,控制器负责执行

- 如果没有控制器,单独设置规则无效

- 控制器镜像以及资源文件地址:https://github.com/kubernetes/ingress-nginx

# 导入Ingress镜像到私有仓库

[root@master ingress]# docker load -i ingress.tar.xz

[root@master ingress]# docker images|while read i t _;do

  [[ "${t}" == "TAG" ]] && continue

  [[ "${i}" =~ ^"harbor:443/".+ ]] && continue

  docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}

  docker push harbor:443/plugins/${i##*/}:${t}

  docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}

done

# 修改配置文件

[root@master ingress]# sed -ri 's,^(\s*image: )(.*/)?(.+)@.*,\1harbor:443/plugins/\3,' deploy.yaml

458:   image: harbor:443/plugins/controller:v1.5.1

565:   image: harbor:443/plugins/kube-webhook-certgen:v20220916-gd32f8c343

614:   image: harbor:443/plugins/kube-webhook-certgen:v20220916-gd32f8c343

[root@master ingress]# kubectl apply -f deploy.yaml

# 通过标签指定在那台机器上发布应用

[root@master ingress]# kubectl label nodes node-0001 ingress-ready="true"

node/node-0001 labeled

[root@master ingress]# kubectl -n ingress-nginx get pods

NAME                                                                READY   STATUS        RESTARTS

ingress-nginx-admission-create--1-lm52c         0/1           Completed     0

ingress-nginx-admission-patch--1-sj2lz             0/1           Completed    0

ingress-nginx-controller-5664857866-tql24       1/1           Running        0

3. 验证后端服务 

- 必须保证ClusterIP访问正常

[root@master ~]# kubectl get pods,services

NAME         READY   STATUS     RESTARTS   AGE

pod/web1    1/1          Running     0                    35m

NAME                         TYPE         CLUSTER-IP   EXTERNAL-IP   PORT(S)

service/kubernetes     ClusterIP    10.245.0.1       <none>               443/TCP

service/mysvc             ClusterIP    10.245.1.80     <none>               80/TCP

service/mysvc1           NodePort   10.245.1.88      <none>               80:30080/TCP

[root@master ~]# curl http://10.245.1.80

Welcome to The Apache.

4. 配置Ingress规则、发布服务

# 资源对象模板

[root@master ~]# kubectl create ingress mying --class=nginx --rule=nsd.tqx.cn/*=mysvc:80 --dry-run=client -o yaml

[root@master ~]# vim mying.yaml

---

kind: Ingress                                        # 资源对象类型

apiVersion: networking.k8s.io/v1         # 资源对象版本

metadata:                                            # 元数据

  name: mying                                      # 资源对象名称

spec:                                                    # 资源对象定义

  ingressClassName: nginx                  # 使用的类名称

  rules:                                                  # Ingress规则定义

  - host: nsd.tqx.cn                               # 域名定义,没有可以不写

    http:                                                 # 协议

       paths:                                           # 访问的路径定义

       - path: /                                         # 访问的url路径

         pathType: Prefix                         # 路径的类型:Prefix、Exact

         backend:                                     # 后端服务

           service:                                     # 服务声明

             name: mysvc                          # 服务名称

             port:                                        # 端口号声明

               number: 80                           # 访问服务的端口号

[root@master ~]# kubectl apply -f mying.yaml

ingress.networking.k8s.io/mying created

[root@master ~]# kubectl get ingress

NAME   CLASS   HOSTS         ADDRESS       PORTS

mying   nginx   nsd.tqx.cn   192.168.1.51   80

[root@master ~]# curl -H "Host: nsd.tqx.cn" http://192.168.1.51

Welcome to The Apache.

- 使用Ingress发布服务流程:

1. 安装Ingress插件

2. 配置一个Pod和一个ClusterIP服务

3. 定义Ingress规则,发布服务

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐