traefik 工作原理

参考:https://blog.csdn.net/weixin_38320674/article/details/106632320

1. 应用服务发布

1.1 自实现web服务myapp

服务是一个简单的springboot web服务,只提供一个对外的controller,具体的代码有:

@Slf4j
@Controller
public class TestController {

    @GetMapping("/test")
    @ResponseBody
    public Response<String> test() {
        return new Response<>(0, "ok", "test return");
    }

    @GetMapping("/{path}/test")
    @ResponseBody
    public Response<String> pathTest(@PathVariable String path) {
        log.info("path variable is {}", path);
        return new Response<>(0, "ok", path);
    }
}
@Data
public class Response<T> {
    private int code;
    private String msg;
    private T data;

    public Response(int code, String msg, T data){
        this.code = code;
        this.msg = msg;
        this.data = data;
    }
}

因为服务器上灭有安装Java运行环境,所以构建镜像的时候,将jdk环境一同构建成一个可运行的镜像。 构建镜像的DockerFile

FROM adoptopenjdk/openjdk8-openj9:alpine-slim
ADD ./webdemon.jar webdemon.jar
ENTRYPOINT [ \
    "java", \
    "-XX:MetaspaceSize=256m", \
    "-XX:MaxMetaspaceSize=256m", \
    "-Xms512m", \
    "-Xmx5128m", \
    "-Xmn256m", \
    "-Xss256k", \
    "-XX:SurvivorRatio=8", \
    "-XX:+UseConcMarkSweepGC", \
    "-Duser.timezone=GMT+08", \
    "-Djava.security.egd=file:/dev/./urandom", \
    "-jar", \
    "/webdemon.jar", \
    "--spring.profiles.active=prod" \
]

可运行的服务jar:镜像

 发布服务:vim appdemon-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
   name: myapp
   namespace: kube-system
spec:
   replicas: 1
   selector:
     matchLabels:
       app: myapp
   template:
     metadata:
       labels:
          app: myapp
          env: test
     spec:
       containers:
       - name: appdemon
         image: myapp:v1.0
         imagePullPolicy: IfNotPresent
         ports:
         - name: http
           containerPort: 8088

 vim appdemon-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: myapp
  namespace: kube-system
spec:
  selector:
    app: myapp
  ports:
  - name: http
    protocol: TCP
    port: 9088
    targetPort: 8088

执行kubectl apply -f 后,能看到服务应用正常启动:

2. 安装traefik

配置rabc.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
  name: traefik-ingress-controller
  namespace: kube-system

配置pod,这里将服务器的81端口映射到traefik controller的80端口,并且启动一个traefik-ui的服务,用于查看流量分发情况

apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: traefik-ingress
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress
spec:
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress
        name: traefik-ingress
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik:v1.7.2
        name: traefik-ingress
        ports:
        - name: controller
          containerPort: 80
          hostPort: 81
        - name: admin-web
          containerPort: 8080
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
        - --insecureskipverify=true
        - --kubernetes.endpoint=https://172.17.0.4:6443
        - --accesslog
        - --accesslog.filepath=/var/log/traefik_access.log
        - --traefiklog
        - --traefiklog.filepath=/var/log/traefik.log
        - --metrics.prometheus

发布服务:

kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress
  ports:
    - protocol: TCP
      port: 80
      name: controller
    - protocol: TCP
      port: 8080
      name: admin-web
  type: NodePort

 

3. 配置traefik流量转发

这里配置了3个转发路径,根路径访问的是traefik的ui界面,/test路径访问的是提供的demon服务。因为服务器直接IP访问,所以没有配置host,默认会放过所有的流量。这里流量进入会通过前端加载一个Nginx,所以controller上面的端口也是映射成81,80端口留给了Nginx。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
    rules:
      - host:
        http:
          paths:
          - path: /
            backend:
              serviceName: traefik-ingress-service
              servicePort: 8080
          - path: /test
            backend:
              serviceName: myapp
              servicePort: 9088
          - path: /new
            backend:
              serviceName: myapp
              servicePort: 9088

4. 验证

浏览器访问:ip:81/dashboard/

 

 

Logo

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

更多推荐