k8s服务发现与暴露

k8s服务发现与暴露

集群内服务发现coreDns

coreDns作用:将service名字和cluster ip自动关联

root@master1:~/k8s# kubectl get all -n kube-system
NAME                                          READY   STATUS    RESTARTS        AGE
pod/coredns-7bdc4cb885-5x56g                  1/1     Running   2 (7h25m ago)   4d1h
pod/coredns-7bdc4cb885-wpzvj                  1/1     Running   2 (7h25m ago)   4d1h
pod/etcd-master1.lzl.org                      1/1     Running   4 (7h25m ago)   4d1h
pod/kube-apiserver-master1.lzl.org            1/1     Running   4 (7h25m ago)   4d1h
pod/kube-controller-manager-master1.lzl.org   1/1     Running   6 (7h25m ago)   4d1h
pod/kube-proxy-d7lbn                          1/1     Running   4 (7h25m ago)   4d1h
pod/kube-proxy-n5wz8                          1/1     Running   2 (7h25m ago)   4d
pod/kube-proxy-p2mbv                          1/1     Running   0               6h30m
pod/kube-scheduler-master1.lzl.org            1/1     Running   6 (7h25m ago)   4d1h

NAME               TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   4d1h

NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/kube-proxy   3         3         3       3            3           kubernetes.io/os=linux   4d1h

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns   2/2     2            2           4d1h

NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-7bdc4cb885   2         2         2       4d1h

dig命令验证coredns能够解析正常解析域名:

image-20230525161139755

image-20230525162020695

注意:解析的是FQDN(是Fully Qualified Domain Name的缩写,意为“完全限定域名)服务名和cluster ip对应关系

上述域名的来源通过进入一个pod中查看dns配置即可得到答案:

image-20230525162822443

集群外服务暴露ingress

ingress只能调度并暴露7层应用,特指http和https

ingress就是一组基于域名和URL路径,把用户的请求转发到指定service资源的规则,内部形同nginx+go脚本。

ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。 Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。

Ingress 不会公开任意端口或协议。 将 HTTP 和 HTTPS 以外的服务公开到 Internet 时,通常使用 Service.Type=NodePortService.Type=LoadBalancer 类型的 Service

为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。

ingress控制器是能够为ingress资源监听某套接字,然后根据ingress规则匹配机制路由调度流量的一个组件。

与作为 kube-controller-manager 可执行文件的一部分运行的其他类型的控制器不同, Ingress 控制器不是随集群自动启动的。

实践前

先明确ngressRoute 和 Ingress 的关系

Traefik 中 IngressRoute 和 Ingress 的关系如下:

IngressRoute 是 Traefik 自身的资源类型,用来定义路由规则。

而 Ingress 是 Kubernetes 原生的资源类型,用来定义进入集群的 HTTP 路由。

两者相比:

  • IngressRoute 更简单易用,专注于核心路由功能。

  • Ingress 除了路由外,还提供了其他功能,如基于名称的虚拟主机等。

Traefik 支持以下几种方式定义路由:

  • IngressRoute:使用 Traefik 自身的 IngressRoute 资源定义路由。这是最简单直接的方式。

  • Ingress:监听 Kubernetes 的 Ingress 资源,并根据 Ingress 来配置路由。

  • Annotations:监听 Service 资源的 annotations,根据 annotations 来配置路由。

  • CRD:监听自定义资源定义(CRD),根据 CRD 来配置路由。

其中使用 IngressRoute 定义路由最简单。

Traefik 会监听 IngressRoute 资源,并根据它来动态配置路由。

所以:

  • IngressRoute 是 Traefik 的资源,专注于提供路由功能。

  • Ingress 是 Kubernetes 原生资源,除了路由外还有其他功能。

两者可以用于定义 Traefik 的路由,具体使用哪个看各自需求。

有了 IngressRoute 资源后,可以完全不用 Ingress 资源,只用 IngressRoute 即可。

希望能够解答您的问题,如有疑问请继续提问。

ingressRoute实践

traefik做负载均衡器

以traefik为ingress控制器

kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v2.10/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml

kubectl apply -f  https://raw.githubusercontent.com/traefik/traefik/v2.10/docs/content/reference/dynamic-configuration/kubernetes-crd-rbac.yml
  

daemon方式安装traefik pod

# traefik.yaml
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
---
kind: DaemonSet
apiVersion: apps/v1
metadata:
  name: traefik
  labels:
    app: traefik
spec:
  selector:
    matchLabels:
      app: traefik
  template:
    metadata:
      labels:
        app: traefik
    spec:
      serviceAccountName: traefik-ingress-controller
      hostNetwork: true
      containers:
        - name: traefik
          image: traefik:v2.10
          ports:
            - name: web
              containerPort: 80
            - name: admin
              containerPort: 8080
          args:
            - --log.level=INFO
            - --accesslog
            - --api=true
            - --api.dashboard=true
            - --api.insecure	#启用 api.insecure 模式时,Traefik 会在端口 8080 上公开仪表板。
            - --metrics.prometheus=true
            - --metrics.prometheus.addentrypointslabels
            - --metrics.prometheus.addserviceslabels
            - --entrypoints.web.address=:80
            - --entryPoints.websecure.address=:443
            - --providers.kubernetescrd			#ingressRoute是traefik自定义资源,需要开启crd
            - --providers.kubernetesingress=true # 允许开启ingress代理
---
apiVersion: v1
kind: Service
metadata:
  name: traefik
spec:
  ports:
    - name: web
      port: 80
      targetPort: web
    - name: websecure
      port: 443
    - name: admin
      port: 8080
      targetPort: admin
  selector:
    app: traefik

创建ingressRoute路由规则:访问http://traefik.lzlor.org的url路径重定向到8080应用即traefik dashboard。

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
spec:
  entryPoints:
  - web
  routes:
  - match: Host(`traefik.lzlor.org`)
    kind: Rule
    services:
    - name: traefik
      port: 8080

ingress路由规则:访问http://traefik.lzlor.org/apps路由到whoami应用

kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
  labels:
    app: whoami

spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: traefik/whoami
          ports:
            - name: web
              containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami

spec:
  ports:
    - name: web
      port: 80
      targetPort: web
  selector:
    app: whoami
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dashbord-ingress

spec:
  rules:
    - host: traefik.lzlor.org
      http:
        paths:
          - path: /app
            pathType: Exact
            backend:
              service:
                name: whoami
                port:
                  number: 80

效果如下:在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值