kubernets Traefik 의 HTTP 와 HTTPS

8044 단어
k8s 의 ingress + traefik 원리 상세 설명
ingress 는 본질 적 으로 nginx 나 traefik 대리 입 니 다.그 는 사용자 가 요청 한 도 메 인 이름 의 요청 을 백 엔 드 서비스 로 전송 했다.
LB 를 하 는 것 은 사실상 쿠 베 르 네 스 의 서비스 다.
배치 원리
daemonset 방식 으로 traffic 또는 nginx 를 배치 하여 80 포트 와 443 포트 에 감청 하도록 합 니 다. 기본 값 은 무 작위 포트 입 니 다. hostport 를 통 해 포트 를 지정 할 수 있 습 니 다.
K8S 에 서 는 반드시 Create Role Based Access 계란 통 증,
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
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

daemonset 예
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress-lb
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress-lb
        name: traefik-ingress-lb
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik
        name: traefik-ingress-lb
        args:
        - --web
        - --kubernetes
---
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
    - protocol: TCP
      port: 80
      name: web
    - protocol: TCP
      port: 8080
      name: admin
  type: NodePort

DaemonSet 만 들 기Kubectl create -f ds.yaml
kubectl --namespace=kube-system get pods

NAME                                         READY     STATUS    RESTARTS   AGE
kube-addon-manager-minikubevm                1/1       Running   0          4h
kubernetes-dashboard-s8krj                   1/1       Running   0          4h
traefik-ingress-controller-678226159-eqseo   1/1       Running   0          7m

UI 구축
apiVersion: v1
kind: Service
metadata:
  name: traefik-web-ui
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress-lb
  ports:
  - port: 80
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: traefik-ui.minikube
    http:
      paths:
      - backend:
          serviceName: traefik-web-ui
          servicePort: 80

퍼 가기 규칙
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
 name: stilton
 labels:
   app: cheese
   cheese: stilton
spec:
 replicas: 2
 selector:
   matchLabels:
     app: cheese
     task: stilton
 template:
   metadata:
     labels:
       app: cheese
       task: stilton
       version: v0.0.1
   spec:
     containers:
     - name: cheese
       image: errm/cheese:stilton
       ports:
       - containerPort: 80
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
 name: cheddar
 labels:
   app: cheese
   cheese: cheddar
spec:
 replicas: 2
 selector:
   matchLabels:
     app: cheese
     task: cheddar
 template:
   metadata:
     labels:
       app: cheese
       task: cheddar
       version: v0.0.1
   spec:
     containers:
     - name: cheese
       image: errm/cheese:cheddar
       ports:
       - containerPort: 80
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
 name: wensleydale
 labels:
   app: cheese
   cheese: wensleydale
spec:
 replicas: 2
 selector:
   matchLabels:
     app: cheese
     task: wensleydale
 template:
   metadata:
     labels:
       app: cheese
       task: wensleydale
       version: v0.0.1
   spec:
     containers:
     - name: cheese
       image: errm/cheese:wensleydale
       ports:
       - containerPort: 80

https 기반
위의 Role Based Access (RBAC) 를 사용 합 니 다.
우선 몇 가지 개념 을 정리 해 야 한다.
  • Secret, 키 파일 저장, 우 리 는 이번에 pem, key 등 파일 을 이런 방식 으로 pod 에 전송 합 니 다
    #        ak-cert secret  
    kubectl create secret generic mjb-cert --from-file=/server.pem --from-file=server.key
    
  • ConfigMap, 프로필, 프로필 을 만 듭 니 다. secret 와 마찬가지 로 volumes 방식 으로 용기 에 마 운 트 합 니 다
    cat traefik.toml 
    defaultEntryPoints = ["http","https"]
    [entryPoints]
      [entryPoints.http]
      address = ":80"
        [entryPoints.http.redirect]
          entryPoint = "https"
      [entryPoints.https]
      address = ":443"
        [entryPoints.https.tls]
          [[entryPoints.https.tls.certificates]]
          CertFile = "/mjb/server.pem"
          KeyFile = "/mjb/server.key"
    
  • 마 운 트 방법
    
    #  volumes
    volumes:
          - name: mjb
            secret:
              secretName: ak-cert
          - name: config
            configMap:
              name: traefik-conf
          containers:
          - image: traefik
            name: traefik-ingress-lb
            ##   
            volumeMounts:
            - mountPath: "/mjb"
              name: "mjb"
            - mountPath: "/config"
              name: "config"
    
  • daemonset 배치
    [root@master https]# cat dae.yaml
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: traefik-ingress-controller
      namespace: kube-system
    ---
    kind: DaemonSet
    apiVersion: extensions/v1beta1
    metadata:
      name: traefik-ingress-controller
      namespace: kube-system
      labels:
        k8s-app: traefik-ingress-lb
    spec:
      template:
        metadata:
          labels:
            k8s-app: traefik-ingress-lb
            name: traefik-ingress-lb
        spec:
          serviceAccountName: traefik-ingress-controller
          terminationGracePeriodSeconds: 60
          volumes:
          - name: mjb
            secret:
              secretName: mjb-cert
          - name: config
            configMap:
              name: traefik-conf
          containers:
          - image: traefik
            name: traefik-ingress-lb
            volumeMounts:
            - mountPath: "/mjb"
              name: "mjb"
            - mountPath: "/config"
              name: "config"
            ports:
            - name: web
              containerPort: 80
              hostPort: 80
            - name: https
              containerPort: 443
              hostPort: 443
            - name: admin
              containerPort: 8580
            args:
            - --web
            - --kubernetes
            - --web.address=:8580
            - --configfile=/config/traefik.toml
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: traefik
      namespace: kube-system
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
      - protocol: TCP
        port: 80
        name: http
      - protocol: TCP
        port: 443
        name: https
      - protocol: TCP
        port: 8580
        name: admin
      type: NodePort
    
  • https 기반 UI
    apiVersion: v1
    kind: Service
    metadata:
      name: traefik-web-ui
      namespace: kube-system
    spec:
      selector:
        k8s-app: traefik-ingress-lb
      ports:
      - port: 80
        targetPort: 8580
    ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: traefik-web-ui
      namespace: kube-system
      annotations:
        kubernetes.io/ingress.class: traefik
    spec:
      tls:
        - secretName: traefik-cert
      rules:
      - host: ui.domain.com
        http:
          paths:
          - backend:
              serviceName: traefik-web-ui
              servicePort: 80
    
    를 배치 하여 테스트 ui. domain. com 에 방문 하고, 위의 인증 서 는 스스로 준비 해 야 하 며, 생 성 할 수 없 으 면
  • openssl req -newkey rsa:2048 -nodes -keyout domain.com.key  -x509 -days 365 -out domain.com.crt
    

    좋은 웹페이지 즐겨찾기