traefik的80和443端口占用进一步分析
阅读原文时间:2023年07月09日阅读:1

上一篇文章地址:https://www.cnblogs.com/sanduzxcvbnm/p/14990065.html

建议先看上一篇文章,才更容易理解这篇

1.traefik的deployment.yaml文件分析

apiVersion: apps/v1
kind: Deployment
metadata:
  name: traefik-v2
  namespace: kube-system
  labels:
    app: traefik-v2
spec:
  replicas: 2
  selector:
    matchLabels:
      app: traefik-v2
  template:
    metadata:
      labels:
        app: traefik-v2
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 1
      containers:
        - name: traefik-v2
          image: traefik:v2.3
          args:
            - --configfile=/config/traefik.yaml
          ports:
            - name: web
              containerPort: 80
              hostPort: 80           #hostPort方式,将端口暴露到集群节点
            - name: websecure
              containerPort: 443
              hostPort: 443          #hostPort方式,将端口暴露到集群节点
            - name: admin
              containerPort: 8090
            - name: tcpep
              containerPort: 8000
            - name: udpep
              containerPort: 9000
          resources:
            limits:
              cpu: 500m
              memory: 1024Mi
            requests:
              cpu: 300m
              memory: 1024Mi
          securityContext:
            capabilities:              ## 只开放网络权限
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
          volumeMounts:
          - mountPath: "/config"
            name: "config"
          - mountPath: /etc/traefik/logs
            name: logdir
          - mountPath: /etc/localtime
            name: timezone
            readOnly: true
      volumes:
        - name: config
          configMap:
            name: traefik-config
        - name: logdir
          hostPath:
            path: /data/traefik/logs
            type: "DirectoryOrCreate"
        - name: timezone
          hostPath:
            path: /etc/localtime
            type: File
      tolerations:
        - operator: "Exists"        ## 设置容忍所有污点,防止节点被设置污点
      hostNetwork: true             ## 开启host网络,提高网络入口的网络性能
      nodeSelector:                 ## 设置node筛选器,在特定label的节点上启动
        IngressProxy: "traefik2.3"
---
apiVersion: v1
kind: Service
metadata:
  name: traefik-v2
  namespace: kube-system
spec:
  type: LoadBalancer
  selector:
    app: traefik-v2
  ports:
    - protocol: TCP
      port: 80
      name: web
      targetPort: 80
    - protocol: TCP
      port: 443
      name: websecure
      targetPort: 443
    - protocol: TCP
      port: 8090
      name: admin
      targetPort: 8090
    - protocol: TCP
      port: 8000
      name: tcpep
      targetPort: 8000
---
apiVersion: v1
kind: Service
metadata:
  name: traefikudp-v2
  namespace: kube-system
spec:
  type: LoadBalancer
  selector:
    app: traefik-v2
  ports:
    - protocol: UDP
      port: 9000
      name: udpep
      targetPort: 9000

如上这个图片,副本数是2,使用的docker镜像是traefik:v2.3,并且要占用主机的分布的pod所在主机的端口

注意:占用的端口是2个副本数的pod调度到哪个主机上就占用哪个主机的这些端口,并不是占用k8s集群全部主机的端口(若是副本数正好是集群主机数,那就是所有主机的这些端口了)

比如,k8s集群有三个节点,master1,worker1,worker2,若是俩pod被调度到worker1和worker2主机上,则占用的是这俩主机的几个端口,具体看下面的,master1主机上则查不到如下这个

# ss -tulnp|grep 80
tcp    LISTEN     0      128    [::]:80                 [::]:*                   users:(("traefik",pid=5201,fd=9))
tcp    LISTEN     0      128    [::]:8082               [::]:*                   users:(("traefik",pid=5201,fd=11)))
tcp    LISTEN     0      128    [::]:8090               [::]:*                   users:(("traefik",pid=5201,fd=8)))
tcp    LISTEN     0      128    [::]:8000               [::]:*                   users:(("traefik",pid=5201,fd=7))

如上这个图片,表示的是pod要被调度到有这个标签的主机上。

结合以上分析,可以给某个主机添加这个标签,然后修改pod副本数为1,这样就能把pod调度到指定的主机上,然后修改本机hosts文件添加dns解析,方便测试web访问。

若是不这样操作的话,会出现如下情况:
比如,k8s集群有三个节点,master1,worker1,worker2,这三个主机都添加主机标签了。pod副本数为1,域名解析到master1
如果pod被调度到worker1或worker2,则域名解析的网址无法访问,必须得有pod调度到master1上才可以。

正式环境中可以则可以多给几个主机添加这个标签,然后pod副本数等于有这个标签的主机数,然后域名解析的话使用其中一个主机公网ip就可以了。

再进一步安全使用,解析到全站CDN,CDN再到SLB,SLB再负载均衡到有这个标签的主机,这样就进一步实现安全和高可用了。