作者简介

Vyacheslav,拥有运维和项目管理经验的软件工程师

这篇文章将承接我此前搭建的本地Docker开发环境,具体步骤已经放在在以下网址:

https://github.com/Voronenko/traefik2-compose-template

除了经典的docker化的项目之外,我还有其他的Kubernetes项目。尽管Kubernetes已经成为容器编排的事实标准,但是不得不承认Kubernetes是一个既消耗资源又消耗金钱的平台。由于我并不经常需要外部集群,因此我使用轻量级K3s发行版来进行Kubernetes本地开发。

K3s是为IoT和边缘计算而构建的经过认证的Kubernetes发行版之一,还能够按产品规模部署到VM。

我使用K3s的方式是这样的:在我的工作笔记本上本地安装K3s,尽管有时我需要在本地部署较重的测试工作负载,为此,我准备了两个神器——两个运行ESXi的外部Intel NUCs。

默认情况下,K3s安装Traefik 1.x作为ingress,如果你对此十分满意,那么无需往下继续阅读了。

在我的场景中,我同时会牵涉到好几个项目,特别是经典的docker和docker swarm,因此我经常遇到在独立模式下部署Traefik的情况。

因此,本文其余部分将深入介绍如何将外部traefik2配置为K3s集群的ingress。

安装Kubernetes K3s系列集群

你可以按照常规方式使用命令curl -sfL https://get.k3s.io | sh -安装K3s,或者你可以使用轻量实用程序k3sup安装(https://github.com/alexellis/k3sup)。具体步骤在之前的文章介绍过。

与我们的设置不同的是,我们使用命令--no-deploy traefik专门安装了不带traefik组件的K3s。

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

注:这里没有固定的安装模式,你甚至可以使用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

配置Traefik 2,与Kubernetes一起使用

在文章开头提到的链接中,我已经在我的系统中安装了Traefik 2,并根据该链接内容,服务于一些需求。现在是时候配置Traefik 2 Kubernetes后端了。

Traefik 2使用CRD(自定义资源定义)来完成这一点。定义的最新示例可以在以下链接中找到,但这些示例仅适用于Traefik 2也作为Kubernetes工作负载的一部分执行的情况:

https://docs.traefik.io/reference/dynamic-configuration/kubernetes-crd/

对于外部Traefik 2,我们仅需要以下描述的定义子集。

我们引入一系列自定义资源定义,以允许我们来描述我们的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-controller,以提供对服务、端点和secret的只读访问权限以及自定义的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

最后,我们需要系统服务账号traefik-ingress-controller与之前创建的集群角色traefik-ingress-controller相关联。

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

我们已经准备好开始调整Traefik 2

将Traefik 2指向K3s集群

根据Traefik文档的建议,当Traefik部署到Kubernetes中时,它将读取环境变量KUBERNETES_SERVICE_HOST和KUBERNETES_SERVICE_PORT或KUBECONFIG来构造端点。

/var/run/secrets/kubernetes.io/serviceaccount/token中查找访问token,而SSL CA证书将在/var/run/secrets/kubernetes.io/serviceaccount/ca.crt.中查找。当部署到Kubernetes内部时,两者都会自动提供挂载。

当无法找到环境变量时,Traefik会尝试使用external-cluster客户端连接到Kubernetes API server。这一情况下,需要设置endpoint。具体来说,可以将其设置为kubectl代理使用的URL,以使用相关的kubeconfig授予的身份验证和授权连接到Kubernetes集群。

Traefik 2可以使用任何受支持的配置类型来静态配置-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-controller访问token来指定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

如果成功了,你应该收到以下响应:

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

以及一些事实,如token:

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

根据上次响应的API server的外部地址:https://192.168.3.100:6443

同样,提供的token中没有任何特殊之处:这是JWT的token,你可以使用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

创建其他访问token

控制器循环确保每个服务账户都有一个带有API token的secret,可以像我们之前那样被发现。

此外,你还可以为一个服务账户创建额外的token,创建一个ServiceAccountToken类型的secret,并为服务账户添加一个注释,控制器会用生成的token来更新它。

---
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 2的更改构成定义

我们需要在文章开头给出的链接中获得的traefik2配置进行哪些更改?

https://github.com/Voronenko/traefik2-compose-template

a) 我们在新文件夹kubernetes_data中存储ca.crt文件,该文件用于验证对Kubernetes授权的调用。这是可以在kubeconfig文件的clusters-> cluster-> certificate-authority-data下找到的证书。

该volume将映射在/var/run/secrets/kubernetes.io/serviceaccount下以获取官方Traefik 2镜像

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

b) 调整Traefik 2 kubernetescrd后端以提供3个参数:endpoint、证书路径和token。请注意,作为外部Traefik作为docker容器,你需要指定正确的endpoint地址,并确保以安全的方式进行。

  - "--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上看到了一些希望。如果你没有看到traefik,或者在运行Traefik时有问题,你可以查看之后的故障排除部分。

现在是时候通过Trafik 2暴露一些Kubernetes服务了,以确保Traefik 2能够作为ingress工作。让我们来看经典案例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.k.voronenko.net全限定域名下的whoami-ingress-route.yaml

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

应用后,你应该会在Traefik dashboard上看到一些希望,即KubernetesCRD后端。

正如你所看到的,Traefik已经检测到我们的K3s Kubernetes集群上运行的新工作负载,而且它与我们在同一个盒子上的经典Docker工作负载(如portainer)很好地共存。

让我们检查一下Traefik 2是否将Traefik路由到了我们的Kubernetes工作负载:如你所见,你可以在http和https endpoint上成功地接触到whoami工作负载,浏览器接受你的证书为可信任的“绿标签”。

我们的目标达到了!我们在本地笔记本上配置了Traefik 2。Traefik 2将你的docker或Kubernetes工作流暴露在http或https endpoint上。带可选的 letsencrypt 的 Traefik 2 将负责 https。

故障排查

正如你所知,在配置过程可能存在多个问题,你可以考虑使用一些分析工具,如:

https://github.com/Voronenko/dotfiles/blob/master/Makefile#L185

我特别建议:

a) VMWare octant:这是一个基于Web的功能强大的Kubernetes dashboard,你可以在上面使用你的kubeconfig

b) Rakess:这是一个独立工具也是一个kubectl插件,用于显示Kubernetes服务器资源的访问矩阵(https://github.com/corneliusweig/rakkess)

检查系统账户的凭据

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

c) kubectl

检查哪些角色与服务账户相关联

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

d) Traefik 文档:例如kubernetescrd后端提供了更多配置开关的方式。

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

如果你希望Traefik为你查询信息:通过在配置中放置一些错误的apiserver地址,可以查看访问的endpoint和查询顺序。有了这些知识和你的Traefik Kubernetes token,你就可以使用Traefik凭证检查这些endpoint是否可以访问。

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:

f) 记录K3s本身

安装脚本将自动检测你的操作系统是使用systemd还是openrc并启动服务。使用openrc运行时,将在/var/log/k3s.log中创建日志。使用systemd运行时,将在/var/log/syslog中创建日志,并使用journalctl -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

这将为你提供有关K8s Traefik起初使用时出现问题的线索,Enjoy your journey!

相关代码你可以在以下链接中找到:

https://github.com/Voronenko/k3s-mini

使用Kubernetes、K3s和Traefik2进行本地开发的更多相关文章

  1. Docker 也是本地开发的一神器:部署单机版 Pulsar 和集群架构 Redis

    原文链接:Docker 也是本地开发的一神器:部署单机版 Pulsar 和集群架构 Redis 一.前言: 现在互联网的技术架构中,不断出现各种各样的中间件,例如 MQ.Redis.Zookeeper ...

  2. 轻量级 Kubernetes K3s - Github热点

    轻量级 Kubernetes k3s star: 15.5k K3s是完全符合生产要求的Kubernetes发行版, 安装简单,可用于生产,整个二进制文件小于100M,作为单一文件打包部署,优势在于, ...

  3. Node.js配合node-http-proxy解决本地开发ajax跨域问题

    情景: 前后端分离,本地前端开发调用接口会有跨域问题,一般有以下3种解决方法: 1. 后端接口打包到本地运行(缺点:每次后端更新都要去测试服下一个更新包,还要在本地搭建java运行环境,麻烦) 2. ...

  4. npm全局安装和本地安装和本地开发安装(npm install --g/--save/--save-dev)

    详细说明参考:http://www.cnblogs.com/PeunZhang/p/5629329.html 我个人理解: 1.全局安装(npm install -g)是为了用命令行,比如在windo ...

  5. Android JNI 本地开发接口

    前言 我们为什么要用JNI --> 高效.扩展 高效:Native code效率高,数学运算,实时渲染的游戏上,音视频处理 (极品飞车,opengl,ffmpeg,文件压缩,图片处理-) 扩展: ...

  6. 在把webpack作为本地开发依赖安装的时候报错

    在把webpack作为本地开发依赖安装的时候报错 Refusing to install webpack as a dependency of itself 原因是package.json里的name ...

  7. SharePoint 2013 本地开发解决方案以及远程调试

    转自:http://www.cnblogs.com/jianyus/p/3523387.html 在SharePoint开发中,我们需要在部署有SharePoint环境的服务器中开发,这是一件让人很苦 ...

  8. 【OpenStack】OpenStack系列1之OpenStack本地开发环境搭建&&向社区贡献代码

    加入OpenStack社区 https://launchpad.net/,注册用户(597092663@qq.com/Admin@123) 修改个人信息,配置SSH keys.OpenPGP keys ...

  9. 西秦的ACE-Python教程 一、Python本地开发环境部署

    西秦的ACE-Python教程 一.Python本地开发环境部署       西秦 级别: 论坛版主 发帖 1357 云币 2782 加关注 写私信   只看楼主 更多操作楼主  发表于: 10-10 ...

随机推荐

  1. 关于hexo中plugins博客配置对无法生成index.html文件的影响

    用hexo搭建的博客网站在访问时出现403错误,经调查后发现是public文件夹下的index.html文件丢失. 在csdn上搜了一下发现大家都是查看是否有一下hexo的插件未安装,将未安装插件安装 ...

  2. 8.0 以上版本 mySQL数据库导致的命令行可连接,NaviCat不可连接的问题

    错误代码: client does not support authentication 原因: 没有开启Mysql的远程连接配置 解决办法: 1 使用命令行进入数据库 C:\Users\wushao ...

  3. 使用turtle库绘制图形

    1.使用turtle库绘制红色五角星图形 import turtle n = eval(input("请输入五角星的长度")) turtle.begin_fill() #开始填充颜 ...

  4. Java实现 蓝桥杯VIP 算法训练 阿尔法乘积

    蓝桥杯–阿尔法乘积 问题描述 计算一个整数的阿尔法乘积.对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身:否则的话,x的阿尔法乘积就等于它的各位非0的 ...

  5. Java实现 蓝桥杯VIP 算法提高 复数求和

    算法提高 复数求和 时间限制:1.0s 内存限制:512.0MB 从键盘读入n个复数(实部和虚部都为整数)用链表存储,遍历链表求出n个复数的和并输出. 样例输入: 3 3 4 5 2 1 3 样例输出 ...

  6. Java实现 LeetCode 32 最长有效括号

    32. 最长有效括号 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 & ...

  7. Java实现 蓝桥杯 算法提高 和谐宿舍2

    试题 算法提高 和谐宿舍2 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 我的某室友学过素描,墙上有n张他的作品.这些作品都是宽度为1,高度不定的矩形,从左到右排成一排,且底边在同 ...

  8. java实现 蓝桥杯 算法提高 盾神与条状项链

    问题描述 有一天,盾神捡到了好多好多五颜六色的珠子!他心想这些珠子这么漂亮,可以做成一条项链然后送给他心仪的女生~于是他用其中一些珠子做成了长度为n的项链.当他准备把项链首尾相接的时候,土方进来了. ...

  9. java实现第七届蓝桥杯反幻方

    反幻方 题目描述 我国古籍很早就记载着 2 9 4 7 5 3 6 1 8 这是一个三阶幻方.每行每列以及对角线上的数字相加都相等. 下面考虑一个相反的问题. 可不可以用 1~9 的数字填入九宫格. ...

  10. java实现第四届蓝桥杯剪格子

    剪格子 题目描述 如图p1.jpg所示,3 x 3 的格子中填写了一些整数. 我们沿着图中的红色线剪开,得到两个部分,每个部分的数字和都是60. 本题的要求就是请你编程判定:对给定的m x n 的格子 ...