traefik的80和443端口占用进一步分析
上一篇文章地址: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再负载均衡到有这个标签的主机,这样就进一步实现安全和高可用了。