Рубрики
Uncategorized

Ненавязчивое местное развитие с Куберанетами, K3S, Traefik2

Бег местных кластеров Kubernetes с K3S, Traefik2 и Letsencrypt

Автор оригинала: Vyacheslav.

Это следующее в мою местную среду разработки Docker, описанную здесь https://github.com/voronenko/traefik2-compose-template. В дополнение к классическим докеренным проектам у меня также есть количество проектов Kubernetes. Kubernetes — это как ресурсная и потребляющая платформа. Поскольку мне не всегда нужен внешний кластер, решение, которое я использую для местного развития для Kubernetes, является https://k3s.io/.

Эта платформа позиционирует себя как легкий кубернаны, но правда в том, что это одна из самых маленьких сертифицированных распределения Kubernetes, построенных для вычислений IOT & EDGE, способных также развернуть в шкале Prod в VMS.

Я использую K3S двумя способами: У меня есть K3S локально на моей рабочей ноутбуке, хотя иногда мне нужно развернуть локально более тяжелые рабочие нагрузки, и для этой цели у меня есть два маленьких звери — два внешних ящики Intel, работающие esxi.

По умолчанию K3S устанавливается с Trafik1 в качестве входа, и если вы удовлетворены этой настройкой, вы обычно можете прекратить чтение статьи.

В моем сценарии я участвую в нескольких проектах, в частности классический докер и докер рой, и поэтому у меня часто есть ситуация, когда Traefik развернут в автономном режиме.

Поэтому остальная часть этой статьи погружает в настройку внешнего TRAEFIK2 в качестве входа для кластера K3S.

Установка семейного кластера Kubernetes K3S.

Вы можете начать с Classic Curl -sfl https://get.k3s.io | Ш - Или вы можете использовать утилиту легкого веса K3SUP, написанную https://github.com/alexellis/k3sup.

Что было бы по-другому для нашей настройки, заключается в том, что мы специально устанавливаем K3S без Traefik Component с помощью переключателя - Нет-развертывание Traefik

export CLUSTER_MASTER=192.168.3.100
export CLUSTER_DEPLOY_USER=slavko
k3sup install --ip $CLUSTER_MASTER --user $CLUSTER_DEPLOY_USER --k3s-extra-args '--no-deploy traefik'

В результате выполнения вы получите данные подключения, необходимые для использования Kubectl. После установки K3S вы можете быстро проверить, можно ли вы увидеть узлы

# Test your cluster with - export path to k3s cluster kubeconfig:
export KUBECONFIG=/home/slavko/kubeconfig
kubectl get node -o wide

Сбочная нота — нет конкретной магии с ароматом K3S Kubernetes. Вы даже можете начать его самостоятельно с помощью Docker-Compose

server:
  image: rancher/k3s:v0.8.0
  command: server --disable-agent --no-deploy traefik
  environment:
    - K3S_CLUSTER_SECRET=somethingtotallyrandom
    - K3S_KUBECONFIG_OUTPUT=/output/kubeconfig.yaml
    - K3S_KUBECONFIG_MODE=666
  volumes:
    # k3s will generate a kubeconfig.yaml in this directory. This volume is mounted
    # on your host, so you can then 'export KUBECONFIG=/somewhere/on/your/host/out/kubeconfig.yaml',
    # in order for your kubectl commands to work.
    - /somewhere/on/your/host/out:/output
    # This directory is where you put all the (yaml) configuration files of
    # the Kubernetes resources.
    - /somewhere/on/your/host/in:/var/lib/rancher/k3s/server/manifests
  ports:
    - 6443:6443

node:
  image: rancher/k3s:v0.8.0
  privileged: true
  links:
    - server
  environment:
    - K3S_URL=https://server:6443
    - K3S_CLUSTER_SECRET=somethingtotallyrandom
  volumes:
    # this is where you would place a alternative traefik image (saved as a .tar file with
    # 'docker save'), if you want to use it, instead of the traefik:v2.0 image.
    - /sowewhere/on/your/host/custom-image:/var/lib/rancher/k3s/agent/images

Настройка TRAEFIK2 для работы с Kubernetes.

Когда вы вспомните, к тому времени у меня обычно есть Traefik2, уже присутствовав в моей системе, и обслуживаю некоторые потребности в соответствии с https://github.com/voronenko/traefik2-compose-template. Теперь пришло время настроить Backend Traefik2 Kubernetes.

Traefik2 делает это использование CRD — CAST — Custom Conception Conception (https://kubernetes.io/docs/conepts/extend-kubernetes/ap-extension/custom-resources/). Последние примеры определений всегда можно найти по ссылке https://docs.traefik.io/reference/dynamic-configuration/kubernetes-crd/, но имеются для сценария, когда Traefik2 также выполняется как часть рабочей нагрузки Kubernetes Отказ

Для сценария внешнего TRAEFIK2 нам нужно только подмножество определений, описанных ниже.

Мы представляем набор пользовательских определений ресурсов, позволяющих нам описать, как наша служба Kubernetes будет выставлена снаружи, Traefik-Crd.yaml :

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingressroutes.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: IngressRoute
    plural: ingressroutes
    singular: ingressroute
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: ingressroutetcps.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: IngressRouteTCP
    plural: ingressroutetcps
    singular: ingressroutetcp
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: middlewares.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: Middleware
    plural: middlewares
    singular: middleware
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: tlsoptions.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: TLSOption
    plural: tlsoptions
    singular: tlsoption
  scope: Namespaced

---
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: traefikservices.traefik.containo.us

spec:
  group: traefik.containo.us
  version: v1alpha1
  names:
    kind: TraefikService
    plural: traefikservices
    singular: traefikservice
  scope: Namespaced

Нам также нужна роль кластера Traefik-Ingress-контроллер Предоставление в основном доступ к услугам, конечным точкам и секретам и на заказ Traefik.containo.us Группа, Traefik-Clusterrole.yaml.

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
  - apiGroups:
      - extensions
    resources:
      - ingresses/status
    verbs:
      - update
  - apiGroups:
      - traefik.containo.us
    resources:
      - middlewares
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - ingressroutes
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - ingressroutetcps
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - tlsoptions
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - traefik.containo.us
    resources:
      - traefikservices
    verbs:
      - get
      - list
      - watch

И, наконец, нам нужна учетная запись System Service Traefik-Ingress-контроллер связано с ранее созданным Traefik-Ingress-контроллер роль кластера

---
kind: ServiceAccount
apiVersion: v1
metadata:
  namespace: kube-system
  name: traefik-ingress-controller

---
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

Как только мы применяем ресурсы выше

apply:
  kubectl apply -f traefik-crd.yaml
  kubectl apply -f traefik-clusterrole.yaml
  kubectl apply -f traefik-service-account.yaml

Мы готовы начать тюнинг Traefik2

Указывая Traefik2 до кластера K3S

При развертывании в Кубернаны, как рекомендуется Traefik Docs, Traefik будет прочитать переменные среды Kubernetes_Service_Host и Kubernetes_Service_Port или KubeConfig, чтобы построить конечную точку.

Токен доступа будет выглядеть в/var/run/secrets/kubernetes.io/secrets/kubernetes.io/serviceAccount/totken и сертификат SSL CA в/var/run/secrets/kubernetes.io/serviceакccount/ca.crt. Оба предоставляются автоматически при развертывании внутри Kubernetes.

Когда переменные среды не найдены, TRAEFIK попытается подключиться к серверу API Kubernetes с клиентом внешнего кластера. В этом случае конечная точка обязательна. В частности, он может быть установлен на URL, используемый Kubectl Proxy для подключения к кластеру Kubernetes, используя предоставленную аутентификацию и авторизацию связанного kubeconfig.

TRAEFIK2 может быть статически сконфигурирован с использованием любых типов поддерживаемых конфигураций — TOML, YAML или коммутаторов командной линии.

[providers.kubernetesCRD]
  endpoint = "http://localhost:8080"
  token = "mytoken"
providers:
  kubernetesCRD:
    endpoint = "http://localhost:8080"
    token = "mytoken"
    # ...
--providers.kubernetescrd.endpoint=http://localhost:8080
--providers.kubernetescrd.token=mytoken

На первый пробег, если у вас есть Traefik снаружи, скорее всего, вы не будете иметь токены доступа для Traefik-Ingress-контроллер указать mytoken. Открыть один:

# Check all possible clusters, as your .KUBECONFIG may have multiple contexts:
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'

# Output kind of
# Alias tip: k config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
# Cluster name	Server
# default	https://127.0.0.1:6443

# You are interested in: "default", if you did not name it differently

# Select name of cluster you want to interact with from above output:
export CLUSTER_NAME="default"

# Point to the API server referring the cluster name
export APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")
# usually https://127.0.0.1:6443

# Gets the token value
export TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='traefik-ingress-controller')].data.token}" --namespace kube-system|base64 --decode)

# Explore the API with TOKEN
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

Если хорошо, вы должны получить успешный ответ, вид

{
  "kind": "APIVersions",
  "versions": [
    "v1"
  ],
  "serverAddressByClientCIDRs": [
    {
      "clientCIDR": "0.0.0.0/0",
      "serverAddress": "192.168.3.100:6443"
    }
  ]

и некоторые факты, как токен

eyJhbGciOiJSUzI1NiIsImtpZCI6IjBUeTQyNm5nakVWbW5PaTRRbDhucGlPeWhlTHhxTXZjUDJsRmNacURjVnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJ0cmFlZmlrLWluZ3Jlc3MtY29udHJvbGxlci10b2tlbi12emM3diIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJ0cmFlZmlrLWluZ3Jlc3MtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImQ5NTc3ZTkxLTdlNjQtNGMwNi1iZDgyLWNkZTk0OWM4MTI1MSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTp0cmFlZmlrLWluZ3Jlc3MtY29udHJvbGxlciJ9.Mk8EBS4soO8uX-uSnV3o4qZKR6Iw6bgeSmPhHbJ2fjuqFgLnLh4ggxa-N9AqmCsEWiYjSi5oKAu986UEC-_kGQh3xaCYsUwlkM8147fsnwCbomSeGIct14JztVL9F8JwoDH6T0BOEjn-J9uY8-fUKYL_Y7uTrilhFapuILPsj_bFfgIeOOapRD0XshKBQV9Qzg8URxyQyfzl68ilm1Q13h3jLj8CFE2RlgEUFk8TqYH4T4fhfpvV-gNdmKJGODsJDI1hOuWUtBaH_ce9w6woC9K88O3FLKVi7fbvlDFrFoJ2iVZbrRALPjoFN92VA7a6R3pXUbKebTI3aUJiXyfXRQ

Внешний адрес API Server https://192.168.3.100:6443 в соответствии с последним ответом

Опять же, ничего магического в предоставленном знаке: это токен JWT, и вы можете использовать https://jwt.io/#debugger-io, чтобы осмотреть его содержание

{
  "alg": "RS256",
  "kid": "0Ty426ngjEVmnOi4Ql8npiOyheLxqMvcP2lFcZqDcVs"
}
{
  "iss": "kubernetes/serviceaccount",
  "kubernetes.io/serviceaccount/namespace": "kube-system",
  "kubernetes.io/serviceaccount/secret.name": "traefik-ingress-controller-token-vzc7v",
  "kubernetes.io/serviceaccount/service-account.name": "traefik-ingress-controller",
  "kubernetes.io/serviceaccount/service-account.uid": "d9577e91-7e64-4c06-bd82-cde949c81251",
  "sub": "system:serviceaccount:kube-system:traefik-ingress-controller"
}

Как правильная конфигурация вполне важен, убедитесь, что оба призывы к Apiserver возвращают разумный ответ.

export APISERVER=YOURAPISERVER
export TOKEN=YOURTOKEN

curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure

curl -X GET $APISERVER/api/v1/endpoints --header "Authorization: Bearer $TOKEN" --insecure

Создание дополнительного доступа токен

Контроллерный цикл обеспечивает секрет с токеном API для каждой учетной записи службы, которые можно обнаружить, как и ранее. Также вы можете создавать дополнительные токены API для сервисной учетной записи, создать секрет типа ServiceAccountToken с аннотацией, ссылаясь на учетную запись службы, а контроллер обновит его с генерируемым токеном:

---
apiVersion: v1
kind: Secret
namespace: kube-system
metadata:
  name: traefik-manual-token
  annotations:
    kubernetes.io/service-account.name: traefik-ingress-controller
type: kubernetes.io/service-account-token

# Any tokens for non-existent service accounts will be cleaned up by the token controller.

# kubectl describe secrets/traefik-manual-token

создать

kubectl create -f ./traefik-service-account-secret.yaml
kubectl describe secret traefik-manual-token

удалить/недействителен

kubectl delete secret traefik-manual-token

Изменения на внешний TRAEFIK V2 составляют определения

Какие изменения нам нужно добавить в конфигурацию Traefik2, у нас есть на https://github.com/voronenko/traefik2-compose-template?

а) новая папка Kubernetes_data Где мы храним ca.crt файл, используемый для проверки вызовов в органу Kubernetes. Это сертификат которые можно найти под кластерами-> кластерами-> сертификатами-авторитетами-данными вашего файла Kubeconfig.

Этот том будет сопоставлен под /var/run/secrets/kubernetes.io/serviceaccount Для официального изображения Traefik2

    volumes:
    ...
      - ./kubernetes_data:/var/run/secrets/kubernetes.io/serviceaccount

и b) Отрегулируйте бэкэкс Traefik2 KubernetesCrd, предоставляя 3 параметра: конечная точка, путь к сертификату и токену. Обратите внимание, что, как ваш внешний Traefik в качестве контейнера Docker, вам нужно указать правильную доступную адрес конечной точки, и убедитесь, что вы делаете это в + — безопасный способ.

      - "--providers.kubernetescrd=true"
      - "--providers.kubernetescrd.endpoint=https://192.168.3.100:6443"
      - "--providers.kubernetescrd.certauthfilepath=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
      - "--providers.kubernetescrd.token=YOURTOKENWITHOUTANYQUOTES

Если вы сделали все правильно, вы должны увидеть сейчас что-то многообещающее на вашем Traefik UI

alt.

Если вы не видите один или у вас есть проблемы с выполнением проверки проверки Traefik UP.

Теперь пришло время выставлять некоторые услуги Kubernetes через Traefik2, чтобы гарантировать, что Traefik2 на самом деле работает как вход. Давайте возьмем нашу классику WHOAMI Сервис, WHOAMI-SERVICE.YAML

apiVersion: v1
kind: Service
metadata:
  name: whoami

spec:
  ports:
    - protocol: TCP
      name: web
      port: 80
  selector:
    app: whoami

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

spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: containous/whoami
          ports:
            - name: web
              containerPort: 80

и разоблачить его на http или https путь, Whoami-Ingress-Tranue.yaml под whoami.k.voronenko.net FQDN.

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroute-notls
  namespace: default
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`whoami.k.voronenko.net`)
      kind: Rule
      services:
        - name: whoami
          port: 80

---
apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroute-tls
  namespace: default
spec:
  entryPoints:
    - websecure
  routes:
    - match: Host(`whoami.k.voronenko.net`)
      kind: Rule
      services:
        - name: whoami
          port: 80
  tls:
    certResolver: default

и применить это:

  kubectl apply -f whoami-service.yaml
  kubectl apply -f whoami-ingress-route.yaml

После того, как применимо, вы должны увидеть SMTH Operation на приборной панели Traefik, а именно KubernetesCrd Backend

alt.

Как вы видите, Traefik2 обнаружил нашу новую рабочую нагрузку, работающую на наших кластере K3S Kubernetes, и, кроме того, хорошо совместно существует с классическими рабочими нагрузками Docker, у нас есть в том же ящике, например, Portainer.

Давайте проверим, правила ли Traefik2 Trafik в нашу рабочую нагрузку Kubernetes: как вы видите, вы можете успешно добраться до рабочей нагрузки WHOAMI на конечных точках HTTP, так и для HTTPS, и в браузере HTTP и HTTPS принимают ваш сертификат как доверенное герметичность.

alt.
alt.

Yooohoo, мы достигли нашей цели. У нас есть Traefik2 настроен либо на ваш локальный ноутбук, либо, возможно, какой-то выделенный машиной в вашем Homelab. Traefik2 выставляет ваш рабочий процесс Docker или Kubernetes на конечных точках HTTP или HTTPS. Traefik2 с дополнительным летанием несет ответственность за HTTPS.

Исправление проблем

Как вы понимаете, могут быть несколько вопросов. Рассмотрим некоторые из инструментов для анализа https://github.com/voronenko/dotfiles/blob/master/makefile#l185

В частности, я рекомендую:

a) VMware Othant — Мощная панель инструментов Kubernets Cubernetes, которая начинает использовать ваш kubeconfig

b) Rakess — https://github.com/corneliusweig/rakkess Автономный инструмент, а также плагин Kubectl, чтобы показать матрицу доступа для ресурсов сервера K8S

Осмотрите учетные данные для системного счета

rakkess --sa kube-system:traefik-ingress-controller

в) просто kubectl

Обратная задача: проверьте, какие роли связаны с учетной записью службы

kubectl get clusterrolebindings -o json | jq -r '
  .items[] |
  select(
    .subjects // [] | .[] |
    [.kind,.namespace,.name] == ["ServiceAccount","kube-system","traefik-ingress-controller"]
  ) |
  .metadata.name'

d) Traefik Docs — например, kubernetescrd Backend имеет способ больше конфигурации коммутаторов.

    --providers.kubernetescrd  (Default: "false")
        Enable Kubernetes backend with default settings.
    --providers.kubernetescrd.certauthfilepath  (Default: "")
        Kubernetes certificate authority file path (not needed for in-cluster client).
    --providers.kubernetescrd.disablepasshostheaders  (Default: "false")
        Kubernetes disable PassHost Headers.
    --providers.kubernetescrd.endpoint  (Default: "")
        Kubernetes server endpoint (required for external cluster client).
    --providers.kubernetescrd.ingressclass  (Default: "")
        Value of kubernetes.io/ingress.class annotation to watch for.
    --providers.kubernetescrd.labelselector  (Default: "")
        Kubernetes label selector to use.
    --providers.kubernetescrd.namespaces  (Default: "")
        Kubernetes namespaces.
    --providers.kubernetescrd.throttleduration  (Default: "0")
        Ingress refresh throttle duration
    --providers.kubernetescrd.token  (Default: "")
        Kubernetes bearer token (not needed for in-cluster client).
    --providers.kubernetesingress  (Default: "false")
        Enable Kubernetes backend with default settings.
    --providers.kubernetesingress.certauthfilepath  (Default: "")
        Kubernetes certificate authority file path (not needed for in-cluster client).
    --providers.kubernetesingress.disablepasshostheaders  (Default: "false")
        Kubernetes disable PassHost Headers.
    --providers.kubernetesingress.endpoint  (Default: "")
        Kubernetes server endpoint (required for external cluster client).
    --providers.kubernetesingress.ingressclass  (Default: "")
        Value of kubernetes.io/ingress.class annotation to watch for.
    --providers.kubernetesingress.ingressendpoint.hostname  (Default: "")
        Hostname used for Kubernetes Ingress endpoints.
    --providers.kubernetesingress.ingressendpoint.ip  (Default: "")
        IP used for Kubernetes Ingress endpoints.
    --providers.kubernetesingress.ingressendpoint.publishedservice  (Default: "")
        Published Kubernetes Service to copy status from.
    --providers.kubernetesingress.labelselector  (Default: "")
        Kubernetes Ingress label selector to use.
    --providers.kubernetesingress.namespaces  (Default: "")
        Kubernetes namespaces.
    --providers.kubernetesingress.throttleduration  (Default: "0")
        Ingress refresh throttle duration
    --providers.kubernetesingress.token  (Default: "")
        Kubernetes bearer token (not needed for in-cluster client).

e) Убедитесь, что Traefik имеет достаточно прав на доступ к конечным точкам Apiserver.

Если вы заинтересованы, какая информация запрашивается Trafik: вы можете увидеть доступ к конечным точкам и порядку Queriiing, поместив неверный адрес APISERVER в конфигурации. Имея эти знания, и ваш токен Traefik Kubernetes вы можете проверить, что эти конечные точки доступны с использованием учетных данных Traefik

traefik_1    | E0421 12:30:12.624877       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1.Endpoints: Get https://192.168.3.101:6443/api/v1/endpoints?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625341       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1.Service: Get https://192.168.3.101:6443/api/v1/services?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625395       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1beta1.Ingress: Get https://192.168.3.101:6443/apis/extensions/v1beta1/ingresses?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625449       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.Middleware: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/middlewares?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625492       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.IngressRoute: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/ingressroutes?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625531       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.TraefikService: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/traefikservices?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625572       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.TLSOption: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/tlsoptions?limit=500&resourceVersion=0:
traefik_1    | E0421 12:30:12.625610       1 reflector.go:125] pkg/mod/k8s.io/client-go@v0.0.0-20190718183610-8e956561bbf5/tools/cache/reflector.go:98: Failed to list *v1alpha1.IngressRouteTCP: Get https://192.168.3.101:6443/apis/traefik.containo.us/v1alpha1/ingressroutetcps?limit=500&resourceVersion=0:

е) k3s logs сам

Сценарий установки будет автоматически обнаруживать, использует ли ваша ОС SystemD или OpenRC и начать службу. При работе с OpenRC журналы будут созданы на/var/log/k3s.log. При работе с SystemD Logs будет создан в/var/log/syslog и просматривается с использованием designCtl -u k3s.

Там вы можете получить некоторые намеки, как

кві 21 15:42:44 u18d k3s[612]: E0421 15:42:44.936960     612 authentication.go:104] Unable to authenticate the request due to an error: invalid bearer token

который предоставил бы вам Подсказка на Traefik Startups выпускается с K8S

Удачи в вашем путешествии!

Связанный код можно найти на https://github.com/voronenko/k3s-mini

Оригинал: «https://www.codementor.io/@slavko/unobtrusive-local-development-with-kubernetes-k3s-traefik2-15uq596oja»