AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-69930

halfer's questions

Martin Hope
halfer
Asked: 2023-06-16 03:27:59 +0800 CST

如何调试 NodePort 拒绝 K8S 连接的原因?

  • 5
赏金将在 7 天后到期。此问题的答案有资格获得+150声望赏金。 halfer想提请更多人注意这个问题:
经过大量记录在案的努力后,我仍然停留在这个微不足道的问题上。我想知道 MicroK8S 是否不如标准 K8S 受欢迎,因此可能更难获得帮助?或者我应该在 DevOps 网站上发帖?

介绍

我最近得到了一个简单的网络应用程序,它可以在带有 MicroK8S 的三节点 Ubuntu 服务器上运行。我决定尝试重建我的集群并使用 YAML 清单重新安装所有内容,以确保该过程可复制。但是,现在无法从集群外部访问该应用程序。我正在寻找调试技术来深入了解为什么 NodePort 显然没有在所有节点上创建 TCP 侦听器。

这是我的节点:

姓名 知识产权 颜色 角色
排列 192.168.50.251 黄色的 领导者
尼卡 192.168.50.74 蓝色的 工人
山崎 192.168.50.135 绿色的 工人

集群再次选择在第三个节点 Yamazaki 上运行工作负载。我希望任何访问 Arran 或 Nikka 的网络流量都会在内部重新路由到 Yamazaki 以得到服务,就像以前发生的那样。

我做了什么

从以前工作的集群/应用程序,这是我重置所有内容的方法:

  1. microk8s leave在所有follower节点上做

  2. 对每个跟随者节点的领导者执行microk8s kubectl delete node <nodename>(他们离开时不会自动删除)

  3. microk8s reset在所有节点上执行

  4. 启用插件(dns、ingress)。我不知道是否有必要

  5. microk8s add-node为每个跟随者在领导者上创建加入命令

  6. microk8s join <ip>/<token>对每个关注者运行一个新的加入命令

  7. 在任何节点上运行microk8s status以确保集群处于 HA 模式

  8. 使用microk8s images import workload.tar

  9. 通过启动应用程序microk8s kubectl apply -f k8s-manifests/production/pod.yaml -f k8s-manifests/production/nodeport.yaml

    这是吊舱:

     apiVersion: v1
     kind: Pod
     metadata:
       name: k8s-workload
       annotations:
         kubectl.kubernetes.io/last-applied-configuration: |
           {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"k8s-workload","namespace":"default"},"spec":{"containers":[{"image":"k8s-workload","imagePullPolicy":"Never","name":"k8s-workload","ports":[{"containerPort":9090,"protocol":"TCP"}]}]}}
     spec:
       containers:
       - image: k8s-workload
         imagePullPolicy: Never
         name: k8s-workload
         ports:
         - containerPort: 9090
           protocol: TCP
    

    这是节点端口:

     apiVersion: v1
     kind: Service
     metadata:
       name: np-service
     spec:
       type: NodePort
       ports:
         - port: 9090
           targetPort: 9090
           nodePort: 30090
       selector:
         run: k8s-workload
       # This should not be needed, but it didn't help
       # this time anyway
       externalIPs: [192.168.50.251]
    
  10. 检查应用程序是否正在通过内部容器调用运行,microk8s kubectl exec -ti k8s-workload -- curl http://localhost:9090这很好

  11. 检查应用程序是否通过任何节点上的端口转发器运行,microk8s kubectl port-forward pod/k8s-workload 9090 --address='0.0.0.0'这很好

  12. 节点不在外部侦听(curl http://localhost:30090连接被拒绝,与来自 LAN 上非集群计算机的任何节点 IP 地址相同)

系统状态

这是运行的内容microk8s kubectl get all -o wide:

NAME               READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
pod/k8s-workload   1/1     Running   0          20h   10.1.134.193   yamazaki   <none>           <none>

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE     SELECTOR
service/kubernetes   ClusterIP   10.152.183.1     <none>           443/TCP          35d     <none>
service/np-service   NodePort    10.152.183.175   192.168.50.251   9090:30090/TCP   3d21h   run=k8s-workload

我不知道service/kubernetes是什么,我认为它只是标准 K8S 基础设施的一部分。

观察

我认为这篇文章是在说我的网络应用程序需要成为一项服务,但我只有一个 pod。我认为当它以前工作时,我只有一个 pod,但集群变得有点混乱,所以应用程序的服务版本可能与 pod 版本同时运行。

这篇文章还建议我应该使用入口系统。但是,考虑到 NodePort 是我目前的学习重点,我还不想放弃它。入口可以稍后出现。

我想我可以确定没有防火墙问题,因为即使在集群节点上的控制台会话中,任何与端口 30090 的连接都会被拒绝。

我想运行类似 的命令microk8s kubectl logs service np-service来查看 NodePort 在做什么,但 logs 子命令仅适用于 pod。

接下来我可以尝试什么?

kubernetes
  • 2 个回答
  • 63 Views
Martin Hope
halfer
Asked: 2023-06-11 06:01:41 +0800 CST

如何跨集群在 MicroK8S 中设置端口转发(最好没有清单)?

  • 6

我正在使用 MicroK8S 学习 K8S。我有一个三节点集群,每个节点有 16G 内存。集群已自动进入 HA 模式。该集群位于我的家庭 LAN 上。

这是我的节点:

姓名 知识产权 颜色 角色
排列 192.168.50.251 黄色的 领导者
尼卡 192.168.50.74 蓝色的 工人
山崎 192.168.50.135 绿色的 工人

设置

我有一个在集群中的 pod 上运行的 Web 应用程序。它在端口 9090 上响应。这是我让它运行的方式。

我在开发笔记本电脑上有一个图像,我将其转换为压缩包:

docker save k8s-workload > k8s-workload.docker.tar

然后我将该 tarball 发送给集群的领导者:

scp k8s-workload.docker.tar 192.168.50.251:/home/myuser/

然后,我将该图像旁加载到集群上的所有节点中:

root@arran:/home/myuser# microk8s images import < k8s-workload.docker.tar
Pushing OCI images to 192.168.50.251:25000
Pushing OCI images to 192.168.50.135:25000
Pushing OCI images to 192.168.50.74:25000

然后我在每个节点上验证 MIME 类型和图像的校验和,因为我在这方面遇到了一些问题:

root@arran:/home/myuser# microk8s ctr images list | grep workload
docker.io/library/k8s-workload:latest   application/vnd.docker.distribution.manifest.v2+json    sha256:725b...582b 103.5 MiB linux/amd64

最后我运行工作负载,确保 K8S 不会尝试拉取镜像(这是不必要的,但默认策略是无论如何都会尝试):

root@arran:/home/myuser# microk8s kubectl run k8s-workload --image=k8s-workload --image-pull-policy='Never' --port=9090
pod/k8s-workload created

然后我从领导节点确认这是成功的:

root@arran:/home/myuser# microk8s kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
k8s-workload   1/1     Running   0          83m   10.1.134.216   yamazaki   <none>           <none>

运行应用程序

为了从我的开发笔记本电脑访问 Web 应用程序,我只在一个节点上公开该应用程序。pod 在 Yamazaki 节点上运行,因此最初我从该节点运行它:

root@yamazaki:/home/myuser# microk8s kubectl port-forward pod/k8s-workload 9090 --address='0.0.0.0'
Forwarding from 0.0.0.0:9090 -> 9090

这很好用。

问题

我想通过向集群中的任何节点发出请求来访问该应用程序,而不仅仅是这个节点。目前该应用程序仅在一个节点上运行,即使我向另一个节点发出 Web 请求,我也希望它能正常工作。

我知道 K8S 有内部网络来做我想做的事。例如,如果我port-forward在 Arran 上运行命令(并在 Yamazaki 上杀死相同的命令),那么应用程序仍然可以运行,即使 pod 仅在 Yamazaki 上运行。但我仍然只能从一个 IP(运行端口转发器的 Arran)访问该应用程序。

当然,我可以通过在每个节点上的 SSH 会话上运行端口转发器来做我想做的事。但我想运行一些在所有 SSH 会话被终止后仍然存在的东西。

理想情况下,我想使用控制台命令来执行此操作,但我想知道我是否需要为此使用 YAML 清单。从我目前的研究来看,我认为我需要一个 ClusterIP。


更新/研究 1

我正在阅读有关裸机负载平衡的 K8S 手册页。该页面的一部分建议用户应用一个 646 行的配置文件,这对于学习场景来说会适得其反。

这个示例似乎更明智,但不清楚 LB 是如何被指示在所有主机上运行的。

更新/研究 2

我还找到了专门针对 MicroK8S 的资源,它推荐了一个入口插件。不幸的是,这需要将我的工作负载设置为服务,而现在我只有一个 Pod,所以认为这已经结束了。

kubernetes
  • 1 个回答
  • 42 Views
Martin Hope
halfer
Asked: 2023-06-08 03:59:01 +0800 CST

当 MicroK8S 开始部署时,如何解决“无法在 snapshotter overlayfs 上解压图像:意外的媒体类型 text/html”?

  • 6

我继续沿着令人沮丧的学习 Kubernetes(特别是 MicroK8S)的道路走走停停。

因此,我在开发笔记本电脑上本地构建图像:

docker build -t k8s-workload .

这是一个简单的 PHP 网络应用程序,可报告一些请求元数据。它构建成功:

Sending build context to Docker daemon  13.82kB
Step 1/5 : FROM php:8.2-cli-alpine
 ---> c5f1f9770838
Step 2/5 : WORKDIR /root
 ---> Using cache
 ---> 492c997c963b
Step 3/5 : RUN apk update && apk upgrade
 ---> Using cache
 ---> f91505d5fe68
Step 4/5 : COPY src /root
 ---> 02bcc72dfc97
Step 5/5 : CMD ["sh", "/root/bin/start-server.sh"]
 ---> Running in 6bc3b72365e4
Removing intermediate container 6bc3b72365e4
 ---> 0c8a405b06af
Successfully built 0c8a405b06af
Successfully tagged k8s-workload:latest

我从中创建了一个 tarball,以便可以将其发送到我的三节点集群:

docker save k8s-workload > k8s-workload.docker.tar

然后我将它发送给集群中的领导者(尽管我假设它可以发送给他们中的任何一个):

scp k8s-workload.docker.tar 192.168.50.251:/home/myuser/

到目前为止,这一切看起来都很好。现在我想将图像旁加载到集群中的所有节点中:

root@arran:/home/myuser# microk8s images import < k8s-workload.docker.tar
Pushing OCI images to 192.168.50.251:25000
Pushing OCI images to 192.168.50.135:25000
Pushing OCI images to 192.168.50.74:25000

看起来很成功,我尝试创建一个工作负载:

root@arran:/home/myuser# microk8s kubectl create deployment k8s-workload --image=k8s-workload

最后让我们获取此 pod 的状态:

root@arran:/home/myuser# microk8s kubectl get pods
NAME                            READY   STATUS             RESTARTS   AGE
k8s-workload-6cdfbb6b59-zvgrl   0/1     ImagePullBackOff   0          35m

好吧,这看起来不太好。还有ErrImagePull的错误,不过现在好像已经换掉了。

如何调试图像无法启动的原因?

我发现了一种在节点上列出图像的方法。我在领导节点上找到了我新建的镜像:

root@arran:/home/myuser# microk8s ctr images list | grep workload
docker.io/library/k8s-workload:latest   application/vnd.docker.distribution.manifest.v2+json    sha256:725b...582b 103.5 MiB linux/amd64

所以图像是可用的。我可以得到一些关于这个问题的日志,但它没有透露任何我不知道的东西:

root@arran:/home/myuser# microk8s kubectl logs k8s-workload-1cdfaa6c49-zvgrl
Error from server (BadRequest): container "k8s-workload" in pod "k8s-workload-1cdfaa6c49-zvgrl" is waiting to start: trying and failing to pull image

接下来我可以尝试什么?据我所知,实际上没有节点需要拉取图像,因为它们在每个节点上都可用。

更新 1

我犹豫是否要在一个问题上添加太多问题,但总的来说我认为它们是值得添加的,因为它们都是获得一个结果的障碍:在 K8S 上成功部署一个微不足道的工作负载。

在描述单个部署中的单个 pod 时,我注意到它向我显示了这个错误:

kubelet 没有配置 ClusterDNS IP,无法使用“ClusterFirst”策略创建 Pod。回退到“默认”策略。

哎呀!开箱即用的另一件事。我已经使用此答案以 MicroK8S 方式修复了此问题。它并没有解决问题,但至少我在敲头上的路障,一个一个。

更新 2

我想检查侧载图像是否有效,所以我在 leader 上做了这个:

root@arran:/home/myuser# docker load < k8s-workload.docker.tar

解包很好:

bb01bd7e32b5: Loading layer [==================================================>]  7.618MB/7.618MB
e759f13eb8bc: Loading layer [==================================================>]  6.015MB/6.015MB
1a72c946ba2b: Loading layer [==================================================>]  12.29kB/12.29kB
9bbacedbd5e4: Loading layer [==================================================>]  6.144kB/6.144kB
53b5e1394bc2: Loading layer [==================================================>]  12.08MB/12.08MB
aff825926dad: Loading layer [==================================================>]  4.096kB/4.096kB
c76bce6229c6: Loading layer [==================================================>]   71.7MB/71.7MB
0503c7346508: Loading layer [==================================================>]   12.8kB/12.8kB
8c2f9e7d94bb: Loading layer [==================================================>]  65.54kB/65.54kB
7e0ad9ed4982: Loading layer [==================================================>]  10.97MB/10.97MB
b99f234d8751: Loading layer [==================================================>]  5.632kB/5.632kB
Loaded image: k8s-workload:latest

然后我在自定义端口上的领导者上运行它(即这是在 Docker 中,而不是 K8S 中):

root@arran:/home/myuser# docker run -p 9000:80 -it k8s-workload

这通过 cURL 响应,正如我期望从 LAN 上的另一台机器响应的那样。

更新 3

我突然想到“命名空间”图像名称可能不同 - 我应该指定而docker.io/library/k8s-workload:latest不是k8s-workload?我都试过了,我发现我得到了相同的结果。

所以这是最新的错误:

Events:
  Type     Reason     Age                    From               Message
  ----     ------     ----                   ----               -------
  Normal   Scheduled  4m46s                  default-scheduler  Successfully assigned default/k8s-workload-68c899df98-qhmhr to yamazaki
  Normal   Pulling    3m17s (x4 over 4m45s)  kubelet            Pulling image "k8s-workload"
  Warning  Failed     3m15s (x4 over 4m43s)  kubelet            Failed to pull image "k8s-workload": rpc error: code = NotFound desc = failed to pull and unpack image "docker.io/library/k8s-workload:latest": failed to unpack image on snapshotter overlayfs: unexpected media type text/html for sha256:e823...45c8: not found
  Warning  Failed     3m15s (x4 over 4m43s)  kubelet            Error: ErrImagePull
  Warning  Failed     2m52s (x6 over 4m43s)  kubelet            Error: ImagePullBackOff
  Normal   BackOff    2m37s (x7 over 4m43s)  kubelet            Back-off pulling image "k8s-workload"

好的,所以我现在有更多的细节。“无法解压图像”错误实际上是什么意思?

更新 4

下面的一个有用的答案表明我可能需要设置一个拉取策略来让 K8S 期望图像在每个节点上可用,并且它不应该尝试拉取它们(它不存在于远程的任何地方)。

然而,在接受提供的建议时,虽然我得到了不同的错误代码 ( CreateContainerError),但根本原因是相同的:

Events:
  Type     Reason     Age               From               Message
  ----     ------     ----              ----               -------
  Normal   Scheduled  64s               default-scheduler  Successfully assigned default/k8s-workload to yamazaki
  Normal   Pulled     6s (x7 over 62s)  kubelet            Container image "k8s-workload" already present on machine
  Warning  Failed     6s (x7 over 62s)  kubelet            Error: failed to create containerd container: error unpacking image: unexpected media type text/html for sha256:1f2c...753e1: not found

更新 5

我暂时将此报告为一个错误,但我仍然欢迎在这里得到答案。

更新 6

基于顽强的坚持水平对灵魂有神奇的好处,我尝试使用子ctr命令删除图像。这是在跟随者节点上:

root@yamazaki:/home/myuser# microk8s ctr images rm docker.io/library/k8s-workload:latest
docker.io/library/k8s-workload:latest

然后使用我重新导入的相同子命令:

root@yamazaki:/home/myuser# microk8s ctr images import k8s-workload.docker.tar 
unpacking docker.io/library/k8s-workload:latest (sha256:725b...582b)...done

由于这是在节点级别而不是群集级别运行的,因此我对三个节点中的每一个节点都执行了此操作。

然后我使用了run命令,因为这允许设置拉取策略,而且我不想将解包问题与上面的拉取问题混为一谈。这又回到了集群领导者身上:

root@arran:/home/myuser# microk8s kubectl run k8s-workload --image=k8s-workload --image-pull-policy='Never' --port=80
pod/k8s-workload created

然后我描述生成的 pod,并得到一个熟悉的错误:

Events:
  Type     Reason     Age               From               Message
  ----     ------     ----              ----               -------
  Normal   Scheduled  36s               default-scheduler  Successfully assigned default/k8s-workload to yamazaki
  Normal   Pulled     6s (x5 over 35s)  kubelet            Container image "k8s-workload" already present on machine
  Warning  Failed     6s (x5 over 35s)  kubelet            Error: failed to create containerd container: error unpacking image: unexpected media type text/html for sha256:5f76...a3aa: not found

矛盾的是,这是令人安心的——将图像单独发送到每个节点是一件很麻烦的事情,因此我希望集群级图像导入能够工作。我怀疑一旦我弄清了解压问题的根源,它就会出现。

更新 7

对了,我发现了一些东西。正如人们所期望的那样,所有节点上的图像 tarball 都具有相同的校验和。但是当它被导入时,一个节点针对图像报告了错误的类型。为了便于比较,对这些进行了轻微的重新格式化:

节点“Arran”:

docker.io/library/k8s-workload:latest  
application/vnd.docker.distribution.manifest.v2+json  
sha256:725b...582b 103.5 MiB  
linux/amd64  
io.cri-containerd.image=managed

节点“山崎”:

docker.io/library/k8s-workload:latest  
text/html  
sha256:5f76...a3aa 218.4 KiB  
-  
io.cri-containerd.image=managed

节点“Nikka”:

docker.io/library/k8s-workload:latest  
application/vnd.docker.distribution.manifest.v2+json  
sha256:725b...582b 103.5 MiB  
linux/amd64  
io.cri-containerd.image=managed

看起来工作负载一直被选为在 Yamazaki 上运行,这就是图像损坏的节点。现在重新导入图像并使其与其他图像相匹配......

docker
  • 2 个回答
  • 106 Views
Martin Hope
halfer
Asked: 2023-05-10 08:43:28 +0800 CST

如何调试 MicroK8S 中的入口控制器为何指向错误的服务?

  • 6

出于学习目的,我在家里搭建了一个小型三节点 Kubernetes 集群。每个 16GB 节点都运行 Ubuntu Server 和 MicroK8S。我设置了一个领导者 (arran) 和两个追随者 (nikka 和 yamazaki)。

root@arran:/home/me# microk8s kubectl get nodes -o wide
NAME       STATUS   ROLES    AGE     VERSION   INTERNAL-IP      EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
arran      Ready    <none>   5d3h    v1.26.4   192.168.50.251   <none>        Ubuntu 22.04.2 LTS   5.15.0-71-generic   containerd://1.6.15
nikka      Ready    <none>   4d14h   v1.26.4   192.168.50.74    <none>        Ubuntu 22.04.2 LTS   5.15.0-71-generic   containerd://1.6.15
yamazaki   Ready    <none>   3d16h   v1.26.4   192.168.50.135   <none>        Ubuntu 22.04.2 LTS   5.15.0-71-generic   containerd://1.6.15

这是集群的状态,有ingress和dashboard手动启用。你可以看到它已经切换到 HA 模式:

root@arran:/home/me# microk8s status
microk8s is running
high-availability: yes
  datastore master nodes: 192.168.50.251:19001 192.168.50.74:19001 192.168.50.135:19001
  datastore standby nodes: none
addons:
  enabled:
    dashboard            # (core) The Kubernetes dashboard
    ha-cluster           # (core) Configure high availability on the current node
    helm                 # (core) Helm - the package manager for Kubernetes
    helm3                # (core) Helm 3 - the package manager for Kubernetes
    hostpath-storage     # (core) Storage class; allocates storage from host directory
    ingress              # (core) Ingress controller for external access
    metrics-server       # (core) K8s Metrics Server for API access to service metrics
    registry             # (core) Private image registry exposed on localhost:32000
    storage              # (core) Alias to hostpath-storage add-on, deprecated
  disabled:
    cert-manager         # (core) Cloud native certificate management
    community            # (core) The community addons repository
    dns                  # (core) CoreDNS
    gpu                  # (core) Automatic enablement of Nvidia CUDA
    host-access          # (core) Allow Pods connecting to Host services smoothly
    kube-ovn             # (core) An advanced network fabric for Kubernetes
    mayastor             # (core) OpenEBS MayaStor
    metallb              # (core) Loadbalancer for your Kubernetes cluster
    minio                # (core) MinIO object storage
    observability        # (core) A lightweight observability stack for logs, traces and metrics
    prometheus           # (core) Prometheus operator for monitoring and logging
    rbac                 # (core) Role-Based Access Control for authorisation

这是我正在运行的 pod,来自我的清单(见下文):

root@arran:/home/me# microk8s kubectl get pods -o wide
NAME                               READY   STATUS    RESTARTS      AGE    IP             NODE       NOMINATED NODE   READINESS GATES
hello-world-app                    1/1     Running   1 (14h ago)   47h    10.1.134.199   yamazaki   <none>           <none>
my-pod                             1/1     Running   2 (14h ago)   5d1h   10.1.150.208   arran      <none>           <none>

目前提供的服务如下:

root@arran:/home/me# microk8s kubectl get services -o wide
NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)         AGE     SELECTOR
kubernetes            ClusterIP   10.152.183.1     <none>        443/TCP         5d3h    <none>
nginx-service         NodePort    10.152.183.120   <none>        80:30000/TCP    2d12h   app.kubernetes.io/name=hello-world-app
hello-world-service   NodePort    10.152.183.205   <none>        80:30032/TCP    47h     app.kubernetes.io/name=hello-world-app
dashboard-service     NodePort    10.152.183.237   <none>        443:32589/TCP   47h     app.kubernetes.io/name=kubernetes

我怀疑问题出在清单中,这是我从 K8S 和 MicroK8s 手册中以一种复制粘贴的方式构建的:

apiVersion: v1
kind: Pod
metadata:
  name: hello-world-app
  labels:
    app.kubernetes.io/name: hello-world-app
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - name: http
          containerPort: 80
          protocol: TCP

---

apiVersion: v1
kind: Service
metadata:
  name: hello-world-service
spec:
  selector:
    app.kubernetes.io/name: hello-world-app
  ports:
  - port: 80
    targetPort: 80
  type: NodePort

---

# Not sure this will work - do we need a NodePort to the dashboard?
apiVersion: v1
kind: Service
metadata:
  name: dashboard-service
spec:
  selector:
    app.kubernetes.io/name: kubernetes
  ports:
  - port: 443
    targetPort: 443
  type: NodePort

---

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: http-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-service
            port:
              number: 80

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dashboard-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes
            port:
              number: 443

现在,我有一个“hello world”应用程序,我给它一个节点端口,然后使用入口插件公开它。这已在http://192.168.50.251/(端口 80)上可用。但是,我尝试通过添加端口和入口路由(端口 443)对 Kubernetes 仪表板执行相同的操作,但https://192.168.50.251/指向“hello world”,而不是我想要的仪表板。

单文件清单文件已完全应用microk8s kubectl apply -f manifest.yml.

接下来我可以尝试什么?

kubernetes
  • 1 个回答
  • 55 Views
Martin Hope
halfer
Asked: 2020-06-14 08:26:10 +0800 CST

Minikube(或 Kubernetes)是否需要 CPU 虚拟化指令来编排 Docker 容器?

  • 0

我正在寻找学习 Kubernetes,特别是从这个资源中。我只想运行 Docker 容器,而不是全脂虚拟机。它说我需要其中任何一个作为工作的基础:

  • 码头工人桌面
  • 种类
  • Minikube

因为我在 Linux 上,所以我很喜欢 Minikube,而且它很容易安装。我正在使用这些说明。第二个文档链接说:

要检查 Linux 是否支持虚拟化,请运行以下命令并验证输出是否为非空:

grep -E --color 'vmx|svm' /proc/cpuinfo

这不会为我产生任何输出,因为我的标准开发环境在 VirtualBox 容器中运行。我不打算改变这一点——Docker、Docker Compose 和 Docker Swarm 在这里运行得很好。

后来说:

安装管理程序

如果您尚未安装虚拟机管理程序,请立即安装其中之一:

  • KVM,也使用 QEMU

  • 虚拟盒子

这使得虚拟机管理程序 CPU 支持似乎是必要的,但我不明白为什么会这样。

但是它确实继续说:

Minikube 还支持--driver=none在主机上而不是在 VM 中运行 Kubernetes 组件的选项。使用此驱动程序需要 Docker 和 Linux 环境,但不需要管理程序。

这似乎是一个附录,与虚拟化指令是一项要求的建议相比,它的重要性要低得多。文档作者是否只是“涵盖了所有基础”,还是尽管没有所需的 CPU,但我会在以后继续前进时遇到障碍?

docker kubernetes minikube operations-orchestration cpu-architecture
  • 1 个回答
  • 161 Views
Martin Hope
halfer
Asked: 2020-04-11 09:08:30 +0800 CST

是否还有理由将 Consul 与现代(“集成”)Docker Swarm 一起使用?

  • 2

我过去做过一点 Docker Swarm,它非常简单——在一个节点上创建一个 Swarm Manager,在另外两个节点上创建 Swarm Workers,坚持使用一个 Manager。我想了解更多关于 Swarm 的信息,因此我正在关注 Pluralsight 上 Nigel Poulton 的视频系列“Docker Swarm:本地 Docker 集群”。

然而,这些视频比我两年前的 Swarm 体验要复杂得多,可能是因为它们运行在旧(“独立”)版本的 Swarm 上。我想问一个澄清的问题,看看我现在学习的材料是否过于过时而不值得。(我将在下面描述视频课程的内容,因此无需熟悉即可回答问题)。

这个视频系列,现在已经四岁了,展示了如何:

  • 安装一个高可用的Discovery Service(支持Consul、Etcd和ZooKeeper,作者选择Consul)。它使用progrium/consul映像,截至今天已经五年没有更新了
  • 在 Consul 服务器上设置三个 Swarm Manager 节点
  • 设置三个 Swarm Worker 节点,同时安装 Consul 客户端

作者承认这一切都相当复杂,并暗示,在拍摄视频时,核心 Docker 将来可能会简化这些东西。他说(构建您的 Swarm 集群 -> 安装 HA 发现服务 -> 5:39):

我什至会放出一个狂野的平底船,在某些时候,Sw​​arm 甚至可能不需要我们做任何这种发现后端手工制作。只是因为这有点痛苦,如果我知道 Docker 的人的一件事,那就是他们全心全意地为我们提供这种流畅、轻松的 Docker 体验,而这部分并不是此时此刻。

如果我没看错的话,这个功能似乎就是实际发生的事情。从手册:

您正在查看旧版独立 Swarm 的文档。这些主题描述了独立的 Docker Swarm。在 Docker 1.12 及更高版本中,Swarm 模式与 Docker Engine 集成。大多数用户应该使用集成的 Swarm 模式。

诚然,我之前使用 Swarm 的经验只使用了一个 Manager,但据我了解,只需使用docker swarm join-token.

那么对于我的问题:Docker Swarm 的这一特性演变让我想知道 Consul 是否为管理 Swarm 本身提供了任何价值。我可以做吗?我是不是该?它是否提供了比集成 raft 共识系统更多的功能?这种学习材料现在有害吗?

(旁白:我看过这个作者的几个视频,它们很棒——如果这个已经过时了,那是他无法控制的。如果材料需要重新拍摄,那就是课程/平台需要安排的业主)。

docker docker-swarm consul
  • 2 个回答
  • 924 Views
Martin Hope
halfer
Asked: 2018-08-27 04:12:48 +0800 CST

如何将 Docker Swarm 服务连接到普通的 Docker 网络?

  • -1

我有一个小型 VPS,上面有各种服务,例如 WordPress 安装和一些 Web 应用程序。一段时间以来,我将其上的所有服务都作为 Docker 容器运行。由于我有各种指向此框的域和子域,我使用前端代理 Traefik 来捕获 Web 端口,然后在 Docker 网络中内部路由它们。

我像这样启动 Traefik:

#!/bin/bash

# Removes the restart policy from previous containers
CONTAINER_LABEL=traefik-instance
../../bin/remove-restart.sh $CONTAINER_LABEL

mkdir --parents /var/log/traefik
mkdir --parents /etc/letsencrypt-traefik

docker run \
    --label $CONTAINER_LABEL \
    --publish 80:80 \
    --publish 443:443 \
    --volume $PWD/traefik.toml:/etc/traefik/traefik.toml \
    --volume $PWD/rules:/etc/traefik/rules \
    --volume /etc/letsencrypt-traefik:/etc/letsencrypt-traefik \
    --volume /var/log/traefik:/log \
    --network dockernet \
    --detach \
    --restart always \
    traefik:1.6

这一切都很好。我最近发现了 Docker Swarm,并希望将我所有的容器转换为服务,这将为我提供复制服务、滚动更新和零停机部署。但是,我想逐步进行更改,以便 Traefik 可以路由到 Swarm 服务和普通(非 Swarm)容器。

因此,为了将 Traefik 作为服务启动,我现在正在执行以下操作。您会注意到我使用非标准端口进行测试:

#!/bin/bash

# Using "traefik2" while I am experimenting with multiple services
mkdir --parents /var/log/traefik2
mkdir --parents /etc/letsencrypt-traefik

docker service create \
    --publish 8080:80 \
    --publish 8443:443 \
    --mount type=bind,source=$PWD/traefik.toml,target=/etc/traefik/traefik.toml \
    --mount type=bind,source=$PWD/rules,target=/etc/traefik/rules \
    --mount type=bind,source=/etc/letsencrypt-traefik,target=/etc/letsencrypt-traefik \
    --mount type=bind,source=/var/log/traefik2,target=/log \
    --network traefiknet \
    traefik:1.6

当指向出现在同一网络上的 Swarm Web 服务时,这也有效。

所以,我有两个 Docker 网络(在 Docker 为自己创建的各种默认值中),如下所示:

root@box:~/docker# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
1aa479f13faa        dockernet           bridge              local
k71hpg1n0lo9        traefiknet          overlay             swarm

这导致我有一个可以看到 Docker 容器的工作 Traefik 容器,以及一个可以看到 Swarm 服务的工作 Traefik 服务。然而,他们看不到对方。

为了解决这个问题,我尝试将 Docker 网络添加到 Traefik Swarm 服务的启动中:

--network dockernet \

换句话说,我希望此服务同时连接到桥接(旧)和覆盖(新)网络。不幸的是,我得到了这个:

来自守护进程的错误响应:网络 dockernet 不能与服务一起使用。只能使用范围为 swarm 的网络,例如使用覆盖驱动程序创建的网络。

有没有办法让我的新服务连接到旧网络,或者确实有办法让我的旧容器连接到新网络?我已经尝试搜索错误,但似乎根本没有太多提及它;我想知道是否很多人还没有遇到过 Swarm 的这种边缘情况使用。

(当然,一种解决方案是让我将所有容器都转换为服务,但为了避免大爆炸式的变化,如果可能的话,我宁愿慢慢做)。

尝试可连接的网络

然后我删除了我的服务并尝试了这个:

docker network rm traefiknet
docker network create driver=overlay --attachable traefiknet

然后我重新创建了 Traefik 服务,它启动了。它显然仍在工作,因为它将流量路由到也加入了 traefiknet 覆盖的服务。

但是,我创建了一个非服务容器,并将其专门连接到traefiknet,而--network-alias我创建的容器无法被服务看到。奇怪的是,如果我进入这个非 Swarm 容器,它可以ping Swarm Traefik 容器,所以网络可以正常工作。(我尝试创建一个连接到 的 Alpine shell 服务,traefiknet并且从这里我无法 ping 非 Swarm 容器的容器名称,也无法 ping 通它的--network-alias)。

升级 Docker

我曾尝试将 Docker 从 17.03.2-ce 升级到 18.06.1-ce,因为手册中的一句话表明我的旧 Docker 版本可能是问题的原因:

容器和 swarm 服务之间的通信使用可附加的覆盖网络在独立容器和 swarm 服务之间建立通信。这在 Docker 17.06 及更高版本中受支持。

然而,这也无济于事。

networking
  • 1 个回答
  • 1244 Views
Martin Hope
halfer
Asked: 2018-07-12 04:52:05 +0800 CST

如何调试为什么启用 mod_proxy_html 会导致空白页?

  • 0

背景

我有四台 Windows 服务器,运行 Server 2012 R2,每台运行 Apache 2.4。它们被安排成两对负载平衡的 Web 服务器,第一对面向 Internet,第二对位于 LAN 内。有一个传入防火墙规则允许从第一个到第二个的端口 80 流量用于 API 请求。

我也在局域网中运行 Tableau Server 可视化软件,我目前的任务是将通过两组 Web 服务器的流量代理到 Tableau。我在外部 Web 服务器上使用这些规则:

/tableau-proxy/* : proxy to the inner web server
/*               : run a web app that carries Tableau content

在内部网络服务器上,我使用这些规则:

/tableau-proxy/* : proxy to Tableau and strip off the /tableau-proxy prefix
/*               : run an API app

对于这两组规则,我使用mod_proxy,mod_proxy_http和mod_rewrite. 代理本身正在工作;例如,图像请求可以从 Internet 一路传输,从两个 Web 服务器反弹,登陆 Tableau,然后以 PNG 数据的形式传回给用户。

内容重写问题

这个问题的最后 5% 是重写从 Tableau 返回的 HTML 链接,以便恢复代理子目录前缀。这是在 LAN 端/内部 Web 服务器上。我使用的规则是这样的:

/ -> /tableau-proxy

我正在尝试使用mod_proxy_html它,但是使用我正在使用的配置,我得到一个空白页。有趣的是,它的响应代码为 200,因此调试起来有点困难。

配置

我正在使用的配置是这样的:

LoadModule proxy_html_module modules/mod_proxy_html.so
LoadModule xml2enc_module modules/mod_xml2enc.so
Include conf/extra/proxy-html.conf

<Directory "C:\Apache24\htdocs\public\tableau-proxy">
    LogLevel alert rewrite:trace2 proxy_html:trace2

    # Proxy requests to the Tableau LB
    RewriteEngine on

    # Here is a test Tableau server
    RewriteRule (.*) http://tabtest/$1 [P]

    # Don't make the x-forwarded-for header a list of proxy hops!
    # That will break redirects in Tableau
    ProxyAddHeaders Off

    ProxyHTMLExtended Off
    xml2EncDefault utf-8
    LogLevel debug

    ProxyHTMLEnable On
    ProxyHTMLURLMap / /tableau-proxy
</Directory>

我还尝试在文档返回代理路径时保留文档的字符集:

ProxyHTMLCharsetOut *

这似乎没有什么区别,并导致:

信息:从 HTTP 标头获取字符集 utf-8

错误:无效参数:[客户端:IP] AH01427:xml2enc:不支持字符集 utf-8

(什么,它不支持 UTF-8?)

我尝试过使用不同的 HTML 文档类型,同样没有任何变化:

ProxyHTMLDoctype XHTML Legacy

我尝试将代理 HTML 模块添加为过滤器,以防万一这比ProxyHTMLEnable On, 再次无济于事:

SetOutputFilter proxy-html

我在网上看到了一些零星的报告,其他人遇到了这个问题,上面的一些额外项目代表我尝试了一些建议的解决方案,但空白页仍然存在。接下来我可以尝试什么?

apache-2.4
  • 1 个回答
  • 713 Views
Martin Hope
halfer
Asked: 2018-07-12 02:02:47 +0800 CST

如何调查间歇性 Windows Server“登录失败”问题?

  • 1

我目前正在开发一个首选 Apache Web 服务器的项目,但 Windows 是强制性的。我已经有几年没有使用 WAMP 了,但我相信这些天它运行良好且稳定。我们有四个 Web 服务器,每个服务器都是两个负载平衡的对。Apache 作为 Windows 服务运行。

一位同事发现一些信息表明在自定义帐户而不是“本地系统帐户”下运行 Apache 更安全。因此,已在每个框上创建了一个本地帐户,并将凭据输入到“服务属性”对话框的“登录”选项卡中。

有时当 Apache 配置发生变化时,我需要重新启动每个服务。为此,我在“服务”窗口中选择 Apache2.4 条目并单击重新启动按钮。但是,对于所有盒子来说,它是否会成功是一触即发的。当它失败时,我收到一条 Windows 错误消息:

Windows 无法在本地计算机上启动 Apache2.4 服务。

错误 1069:由于登录失败,服务未启动。

因此,每当发生这种情况时,我都会尽职尽责地再次添加服务密码,然后它总是会启动。我的一个猜测是对话忘记了给它的密码。它永远不会忘记用户名。

我在“本地安全策略”->“本地策略”->“用户权限分配”->“作为服务属性登录”中检查了授予该本地用户的权限,发现该用户正常在其中,但如果丢失,则Apache 重启将失败。

在研究这个时,我发现了这个相同的场景(尽管这种情况下的服务是 PostgreSQL)。但是,在我看来,使用本地系统帐户的公认答案并不是对所提出问题的答案。问题应该是:为什么用户失去了作为服务登录的权利?

windows
  • 3 个回答
  • 502 Views
Martin Hope
halfer
Asked: 2018-05-08 08:55:24 +0800 CST

如何调试为什么 Pure FTPd 无法绑定到 IP 地址?

  • 0

我正在构建一个 Dockerised 系统,该系统将在 HTTP API 中创建和拆除各种服务器类型,用于集成测试。我通过试验如何同时创建和运行多个 FTP 服务器来启动这个项目。

我想在不同的 IP 地址上运行 FTP 服务器,以便测试可以创建和拆除服务器而不会相互干扰。将来,这应该允许测试在必要时并行化。

在我的 Docker 容器中,我根据这个 Docker Compose 配置设置了各种网络:

version: '2'
services:

  missive-box-of-tricks:
    image: missive-box-of-tricks
    networks:
      network-01:
        aliases:
        - network-01
      network-02:
        aliases:
        - network-02
      network-03:
        aliases:
        - network-03
      network-04:
        aliases:
        - network-04
      network-05:
        aliases:
        - network-05
      (trimmed - there's 10 of these)

networks:
  network-01:
    driver: bridge
  network-02:
    driver: bridge
  network-03:
    driver: bridge
  network-04:
    driver: bridge
  network-05:
    driver: bridge
  (trimmed - there's 10 of these)

这会在容器内产生一组网络(再次修剪):

~ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:14:00:02  
          inet addr:172.20.0.2  Bcast:172.20.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

eth1      Link encap:Ethernet  HWaddr 02:42:AC:16:00:02  
          inet addr:172.22.0.2  Bcast:172.22.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

eth2      Link encap:Ethernet  HWaddr 02:42:AC:15:00:02  
          inet addr:172.21.0.2  Bcast:172.21.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

eth3      Link encap:Ethernet  HWaddr 02:42:AC:17:00:02  
          inet addr:172.23.0.2  Bcast:172.23.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

eth4      Link encap:Ethernet  HWaddr 02:42:AC:18:00:02  
          inet addr:172.24.0.2  Bcast:172.24.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:27 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3249 (3.1 KiB)  TX bytes:0 (0.0 B)

网络别名是可解析的,因此我希望 FTP 服务器能够监听network-01等。我使用此命令从容器内部启动服务器:

PUBLIC_HOST=network-01

# -P -Force the specified IP address in reply to a PASV/EPSV/SPSV command
# -S -Connections are accepted on the specified IP and port
# -l -This is the authentication type, in the form "protocol:path"
# -E -Only allow authenticated users (if you wanted anonymous only you would substitute -e).
# -j -If the user doesn't have a home directory create it at first login.
# -R -Disallow the usage of the chmod command.
# -B -Instruct the standalone server to start in the background
# -g -Custom pidfile location (defaults to /var/run/pure-ftpd.pid)
# -d Verbose logging

/usr/sbin/pure-ftpd \
    -S $PUBLIC_HOST \
    -p $MIN_PASV_PORT:$MAX_PASV_PORT \
    -g $PID_FILE \
    -l $USER_DB \
    -d \
    -E \
    -j \
    -R

我已经重置了PID和用户数据库文件,以避免冲突,但实际上即使是单个服务器也不会启动。我收到此错误:

无法启动独立服务器:地址不可用

如果我添加 PASV 声明,我会得到相同的结果:

-P $PUBLIC_HOST \

如果我明确输入 IP 地址,而不是使用环境变量,我也会得到相同的结果。

那么,为什么这个 IP 地址不可用呢?有没有另一种方法可以在 Docker 环境中创建一系列 IP 地址,然后绑定一个 PureFTP 实例来监听一个?

docker
  • 1 个回答
  • 651 Views
Martin Hope
halfer
Asked: 2018-04-05 07:17:22 +0800 CST

如何使用容器自动删除功能自动重启我的 Docker 容器?

  • 6

我有一个通用 VPS,并且正在 Dockerising 上面的应用程序。上面大约有​​ 5-6 个容器,其他的很少,所以可以根据需要轻松地重建盒子。

对于每个应用程序,我都有一个启动脚本。一个 WordPress 容器如下所示:

#!/bin/bash

# Get the host IP address
export DOCKER_HOSTIP=`ifconfig docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`
echo "Connecting to database on Docker host ${DOCKER_HOSTIP}"

docker run \
    --add-host=docker:${DOCKER_HOSTIP} \
    --network dockernet \
    --network-alias jonblog \
    --detach \
    --restart always \
    --rm \
    jonblog

但是,这会返回一个错误:

冲突的选项:--restart 和--rm

有几个 Docker 票说这是明智的,但我不明白。我想我的意思很清楚:如果容器没有运行(例如在启动时),那么我想启动它。如果它死了,那么我希望容器被删除,并从基础映像创建一个新的容器。无论如何,容器应该是不可变的——我希望保留的任何状态,比如媒体文件和日志,都将被写入卷。

所以,我想我应该放弃这个--restart标志,然后使用进程管理器来停止和启动 Docker 容器。我可以在这里使用Monit吗?我希望能够做类似的事情:

CHECK PROCESS jonblog MATCHING jonblog
  START PROGRAM = "/root/docker/jonblog/host-start.sh"
  STOP PROGRAM = "docker stop jon-blog"

但是,这会检查系统进程表,而不是docker ps,因此它不会找到与指定字符串匹配的内容。我可以让它docker ps定期执行,并匹配输出中的行吗?

如果它被证明是强大的,我很乐意使用另一个工具。比如我觉得Supervisor有点重量级,但如果那更能和Docker一起工作,我愿意用它。

关于 --rm 的说明

我想要的原因--rm是在Dockerisation过程中,我停止了当前运行的容器,load一个新版本的镜像,重新运行上面的脚本。这意味着 Docker 会被通知restart每个容器的策略。我发现重启机器后,我会同时运行 15 个左右略有不同的应用程序版本,这不是本意。

我想我可以docker update --restart never在旧容器上使用来防止这种情况发生,但是当我的容器停止时,我把它留在周围,我会尽快让它自动删除。我可以使用某种 cron 作业定期清理旧的,但考虑到 Docker 可以为我做这件事,这感觉有点笨拙。

寻求一系列答案

一个非常有帮助的评论建议我应该研究 Minikube,它显然简化了 Kubernetes 的设置,即使在某种程度上熟练的个人可以在五分钟内启动并运行。

我仍然很想看到更多轻量级的解决方案被提出,所以我有一系列的答案可供选择。如前所述,我想知道像 Monit 这样的流程主管是否可以工作的答案。

从头到尾,我可以编写一个 shell 循环,docker ps每五秒写入一个文件,持续一分钟,然后每分钟在 Cron 上运行它。grep然后我可以使用MonitCHECK PROGRAM系统检查来扫描该文件。这有点骇人听闻,但如果它有问题,我可以很容易地理解它。这个建议有什么进展吗?

docker
  • 1 个回答
  • 10394 Views
Martin Hope
halfer
Asked: 2017-11-30 06:58:21 +0800 CST

如何调试 Rsyslog 错误“NO state file (/path/to/statefile) exists for /path/to/log”?

  • 2

我的设置的简要说明:我在 Docker Compose 单服务器配置中有 11 个 Docker 容器。其中一些容器产生日志,我将其写入(主要是单独的)主机卷。这会产生八个日志文件,这些文件与 Rsyslog 容器共享,同样通过 Docker 卷。最后,这个容器将日志转发到基于云的日志聚合器应用程序 Papertrail。

这一切正常:我可以近乎实时地查看 Mongo 日志、Apache 日志和各种应用程序级日志。但是,我意识到当我重新启动记录器容器时,Rsyslog 将丢失它已推送的日志的任何记录,因此将再次推送整个日志。Papertrail 可能会执行其自己的重复数据删除,但最好删除此重复。

我打算添加另一个主机上的卷,这样即使记录器容器被销毁并重新创建,该状态也是永久的。但是,在刚刚检查一个暂存实例时,状态目录/var/spool/rsyslog似乎是空的。因此,在我做这项工作之前,我想确保 Rsyslog 确实在写入状态文件。

我认为这个目录是由$WorkDirectory指令设置的吗?

这是我的配置文件的一个轻微编辑的片段:

# Load Modules
module(load="imfile")

# If we don't use this, we'll get the hostname of the Logger container
$LocalHostName missive-test

# See https://help.papertrailapp.com/kb/configuration/advanced-unix-logging-tips#rsyslog-2
$ActionResumeInterval 10
$ActionQueueSize 100000
$ActionQueueDiscardMark 97500
$ActionQueueHighWaterMark 80000
$ActionQueueType LinkedList
$ActionQueueFileName papertrailqueue
$ActionQueueCheckpointInterval 100
$ActionQueueMaxDiskSpace 2g
$ActionResumeRetryCount -1
$ActionQueueSaveOnShutdown on
$ActionQueueTimeoutEnqueue 2
$ActionQueueDiscardSeverity 0

# My own addition
$WorkDirectory /var/spool/rsyslog

# See https://help.papertrailapp.com/kb/configuration/encrypting-remote-syslog-with-tls-ssl/#download-root-certificates
$DefaultNetstreamDriverCAFile /etc/papertrail-bundle.pem # trust these CAs
$ActionSendStreamDriver gtls # use gtls netstream driver
$ActionSendStreamDriverMode 1 # require TLS
$ActionSendStreamDriverAuthMode x509/name # authenticate by hostname
$ActionSendStreamDriverPermittedPeer *.papertrailapp.com

# Slightly edited to obfuscate exact URL
*.* @@logs0.papertrailapp.com:00000

# Use http://www.rsyslog.com/rsyslog-configuration-builder/ to generate new
# log file watchers.

input(type="imfile"
     File="/var/log/missive/controller/socket-listener.log"
     Tag="socket"
     Facility="local0")

最后一个input指令是一个示例,其中有八个,都非常相似。

我可能对状态数据的位置有误吗?我最近重新启动了几次,每次 Papertrail 确实获得了 25K 的新记录。所以,要么是我看不到的写状态,要么根本不写。我错过了一个指令吗?

我已经在 Rsyslog 8.26.0 和 8.31.0 上尝试过这个,两个版本都一样。

更新 1

从 Rsyslog 本身查看一些日志可能会有所帮助。但是,我已经签入/var/log,并且没有香肠(除了我正在推送的日志的主机卷)。这需要显式打开吗?

发布后,我找到了一个验证配置文件的命令,它看起来很好 - 看起来没有什么会阻止状态文件的工作。

/var # rsyslogd -N1
rsyslogd: version 8.26.0, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.

更新 2

我现在已将-dn(调试和前台)开关添加到 Rsyslog,并且现在正在生成(非常详细的)日志文件。在 300K 其他行中,我发现了这个:

2227.959643591:main thread    : action 0 queue: starting queue
2227.959648334:main thread    : action 0 queue: is disk-assisted, disk will be used on demand
2227.959656291:main thread    : action 0 queue: params: type 1, enq-only 0, disk assisted 1, spoolDir '/var/spool/rsyslog', maxFileSz 1048576, maxQSize 100000, lqsize 0, pqsize 0, child 0, full delay 40000, light delay 70000, deq batch si
ze 16, high wtrmrk 80000, low wtrmrk 70000, discardmrk 97500, max wrkr 1, min msgs f. wrkr 100000
2227.959661911:main thread    : action 0 queue:Reg: finalizing construction of worker thread pool (numworkerThreads 1)
2227.959666678:main thread    : action 0 queue:Reg/w0: finalizing construction of worker instance data (for 1 actions)
2227.959671472:main thread    : action 0 queue:DAwpool: finalizing construction of worker thread pool (numworkerThreads 1)
2227.959675830:main thread    : action 0 queue:DAwpool/w0: finalizing construction of worker instance data (for 1 actions)
2227.959682905:main thread    : action 0 queue[DA]: starting queue
2227.959687826:main thread    : action 0 queue[DA]: .qi file name is '/var/spool/rsyslog/papertrailqueue.qi', len 37
2227.959691356:main thread    : action 0 queue[DA]: I am a child
2227.959702371:main thread    : action 0 queue[DA]: clean startup, no .qi file found
2227.959706512:main thread    : action 0 queue[DA]: state -2040 reading .qi file - can not read persisted info (if any)
2227.959711817:main thread    : file stream N/A params: flush interval 0, async write 0
2227.959719817:main thread    : file stream N/A params: flush interval 0, async write 0
2227.959724086:main thread    : file stream N/A params: flush interval 0, async write 0
2227.959734668:main thread    : action 0 queue[DA]: params: type 2, enq-only 0, disk assisted 0, spoolDir '/var/spool/rsyslog', maxFileSz 1048576, maxQSize 0, lqsize 0, pqsize 0, child 1, full delay -1, light delay -1, deq batch size 8, h
igh wtrmrk 0, low wtrmrk 1, discardmrk 0, max wrkr 1, min msgs f. wrkr 0
2227.959739181:main thread    : action 0 queue[DA]:Reg: finalizing construction of worker thread pool (numworkerThreads 1)
2227.959743488:main thread    : action 0 queue[DA]:Reg/w0: finalizing construction of worker instance data (for 1 actions)
2227.959747045:main thread    : action 0 queue[DA]: queue finished initialization
2227.959753324:main thread    : action 0 queue: DA queue initialized, disk queue 0x5630e6079ea0
2227.959756804:main thread    : action 0 queue: queue finished initialization
2227.959762404:main thread    : Action builtin:omfwd[0x5630e605cd60]: queue 0x5630e605d1e0 started
2227.959766212:main thread    : Activating Ruleset Queue[0] for Ruleset RSYSLOG_DefaultRuleset
2227.959769728:main thread    : activateMainQueue: mainq cnf obj ptr is 0
2227.959773846:main thread    : main Q: starting queue
2227.959781585:main thread    : main Q: is NOT disk-assisted
2227.959789199:main thread    : main Q: params: type 0, enq-only 0, disk assisted 0, spoolDir '/var/spool/rsyslog', maxFileSz 1048576, maxQSize 100000, lqsize 0, pqsize 0, child 0, full delay 97000, light delay 70000, deq batch size 256, 
high wtrmrk 80000, low wtrmrk 20000, discardmrk 98000, max wrkr 2, min msgs f. wrkr 40000
2227.959793605:main thread    : main Q:Reg: finalizing construction of worker thread pool (numworkerThreads 2)
2227.959797797:main thread    : main Q:Reg/w0: finalizing construction of worker instance data (for 1 actions)
2227.959807534:main thread    : main Q:Reg/w1: finalizing construction of worker instance data (for 1 actions)
2227.959813976:main thread    : main Q: queue finished initialization
2227.959819101:main thread    : Main processing queue is initialized and running
2227.959823416:main thread    : running module imfile with config 0x5630e605bda0, term mode: cooperative/SIGTTIN
2227.959847971:main thread    : configuration 0x5630e6047ae0 activated
2227.959891721:main thread    : rsyslog/glbl: using '127.0.0.1' as localhost IP
2227.959897527:main thread    : signaling new internal message via SIGTTOU
2227.959907993:main thread    : rsyslogd: writing pidfile '/var/run/rsyslogd.pid.tmp'.
2227.960012480:main thread    : rsyslogd: initialization completed, transitioning to regular run mode

这提到/var/spool/rsyslog了几次,所以看起来该配置确实设置正确。但是,我仍然没有真正找到任何可以解释为什么在推送到 Papertrail 后没有留下状态文件的东西。

我将继续查看日志,看看是否还有其他内容跳出。同时,欢迎对此发表评论。

更新 3

啊哈,我找到了这些行:

/ # grep -C 1 "NO state file" /var/log/rsyslog.log
2227.960253654:imfile.c       : imfile: trying to open state for '/var/log/missive/controller/socket-listener.log', state file 'imfile-state:-var-log-missive-controller-socket-listener.log'
2227.960264463:imfile.c       : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-controller-socket-listener.log) exists for '/var/log/missive/controller/socket-listener.log'
2227.960268423:imfile.c       : imfile: clean startup withOUT state file for '/var/log/missive/controller/socket-listener.log'
--
2227.971282226:imfile.c       : imfile: trying to open state for '/var/log/missive/transmitter/queue.log', state file 'imfile-state:-var-log-missive-transmitter-queue.log'
2227.971298328:imfile.c       : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-transmitter-queue.log) exists for '/var/log/missive/transmitter/queue.log'
2227.971302589:imfile.c       : imfile: clean startup withOUT state file for '/var/log/missive/transmitter/queue.log'
--
2228.510460963:imfile.c       : imfile: trying to open state for '/var/log/missive/transmitter/worker-manager.log', state file 'imfile-state:-var-log-missive-transmitter-worker-manager.log'
2228.510480060:imfile.c       : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-transmitter-worker-manager.log) exists for '/var/log/missive/transmitter/worker-manager.log'
2228.510484619:imfile.c       : imfile: clean startup withOUT state file for '/var/log/missive/transmitter/worker-manager.log'
--
2228.774990028:imfile.c       : imfile: trying to open state for '/var/log/missive/storage/storage-server.log', state file 'imfile-state:-var-log-missive-storage-storage-server.log'
2228.775007074:imfile.c       : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-storage-storage-server.log) exists for '/var/log/missive/storage/storage-server.log'
2228.775011149:imfile.c       : imfile: clean startup withOUT state file for '/var/log/missive/storage/storage-server.log'
--
2228.797432870:imfile.c       : imfile: trying to open state for '/var/log/missive/outtray/outtray-server.log', state file 'imfile-state:-var-log-missive-outtray-outtray-server.log'
2228.797447810:imfile.c       : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-outtray-outtray-server.log) exists for '/var/log/missive/outtray/outtray-server.log'
2228.797452333:imfile.c       : imfile: clean startup withOUT state file for '/var/log/missive/outtray/outtray-server.log'
--
2228.798755146:imfile.c       : imfile: trying to open state for '/var/log/missive/interface/access.log', state file 'imfile-state:-var-log-missive-interface-access.log'
2228.798767248:imfile.c       : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-interface-access.log) exists for '/var/log/missive/interface/access.log'
2228.798771170:imfile.c       : imfile: clean startup withOUT state file for '/var/log/missive/interface/access.log'
--
2228.802581105:imfile.c       : imfile: trying to open state for '/var/log/missive/interface/error.log', state file 'imfile-state:-var-log-missive-interface-error.log'
2228.802592195:imfile.c       : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-interface-error.log) exists for '/var/log/missive/interface/error.log'
2228.802595916:imfile.c       : imfile: clean startup withOUT state file for '/var/log/missive/interface/error.log'
--
2228.818228008:imfile.c       : imfile: trying to open state for '/var/log/missive/mongo/mongodb.log', state file 'imfile-state:-var-log-missive-mongo-mongodb.log'
2228.818241043:imfile.c       : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-mongo-mongodb.log) exists for '/var/log/missive/mongo/mongodb.log'
2228.818244939:imfile.c       : imfile: clean startup withOUT state file for '/var/log/missive/mongo/mongodb.log'
--
2228.826921335:imfile.c       : imfile: trying to open state for '/var/log/missive/traffic/traefik.log', state file 'imfile-state:-var-log-missive-traffic-traefik.log'
2228.826933834:imfile.c       : imfile: NO state file (/var/spool/rsyslog/imfile-state:-var-log-missive-traffic-traefik.log) exists for '/var/log/missive/traffic/traefik.log'
2228.826937674:imfile.c       : imfile: clean startup withOUT state file for '/var/log/missive/traffic/traefik.log'

第一次运行时会出现这些,但当然会期望状态文件会被留下,以便不会再次推送日志。我将搜索这些错误字符串以防万一,我将跟踪日志以查看最后是否有任何内容阻止记录最终状态。

更新 4

我试图在我的input()定义之后添加这个,也无济于事:

$InputFilePersistStateInterval 100
$InputRunFileMonitor

这是因为手册说,第二个参数:

这将激活当前监视器。它没有参数。如果您忘记了此指令,则不会进行文件监控。

但是,我认为这是指由命令声明的旧式日志$,而不是新式input()语法。

更新 5

我突然想到,我上面的配置覆盖了默认的 Rsyslog 配置,可能正在删除一些关键的东西。因此,我修改了相关COPY命令,以便保留默认值rsyslogd.conf,并且我的配置变得额外。

因此,新指令(未注释掉)如下:

# rsyslog v5: load input modules
# If you do not load inputs, nothing happens!
# You may need to set the module load path if modules are not found.

$ModLoad immark.so # provides --MARK-- message capability
$ModLoad imuxsock.so # provides support for local system logging (e.g. via logger command)
$ModLoad imklog.so # kernel logging (formerly provided by rklogd)

# default permissions for all log files.
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022

# Include configuration files from directory
$IncludeConfig /etc/rsyslog.d/*

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                -/var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  -/var/log/cron

# Everybody gets emergency messages
*.emerg                                                 :omusrmsg:*

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          -/var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log

这仍在将我的日志推送到 Papertrail,并且仍然没有创建假脱机文件。

我很想这可能是一个权限问题,但是 Rsyslogroot在 Alpine 中运行,我相信队列作为主进程中的线程实现。因此,它们也将运行root,并且写入到/var/spool/rsyslog/*.

更新 6

我曾询问 Rsyslog 错误跟踪器的读者这是否可能是一个错误,可能是因为我使用的是 Docker。

linux
  • 1 个回答
  • 5405 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve