我使用 Docker 在 node.js 上构建了一个应用程序,但我不确定如何在 Kubernetes 集群上扩展它,以便充分利用我的集群硬件。
从性能的角度来看,以下哪个更好:
集群我的节点应用程序并根据需要运行尽可能多的容器
或者
只需根据需要运行尽可能多的容器而无需集群?
当我说集群时,我的意思是这个https://nodejs.org/api/cluster.html
我的应用程序是一个由 mongoDB 支持的简单 CRUD Api。我们估计它将有 1000 个并发用户。我们的集群有 3 个节点。
我最近没有升级Docker.我曾经能够毫无错误地删除容器.我现在一直都这样:
docker rm -f 05344fa394a4
Error response from daemon: driver "overlay" failed to remove root filesystem for
05344fa394a43e5080deb1a43fdeab3a6f141038069f1a49209e29ec8f06a20c:
remove /var/lib/docker/overlay/c9eb21a91ae1a37a121855a1ef65a89593994dc036affa9ff295b59b4eca1af5/merged:
device or resource busy
Run Code Online (Sandbox Code Playgroud)
我基本上必须重新启动(systemctl restart docker不修复)才能成功删除并继续.任何人都对可能出错的东西有任何见解?
我root和Docker 17.06 一样在Centos 7.3上运行.一切都在/var/lib/docker和/var/lib/docker/overlay它的拥有者root:root是保护700 /var/lib/docker/network实际上是750]
基本上,我有一个Deployment,它创建3个可自动缩放的容器:PHP-FPM,NGINX和包含应用程序的容器,所有这些容器都设置有机密,服务和入口。该应用程序还在PHP-FPM和NGINX之间共享该项目,因此已全部完成。
由于我想使用K8s进行更多探索,因此我决定使用Redis创建一个Pod,该Pod还可以安装永久性磁盘(但这并不重要)。我还为redis创建了一个服务,如果我通过SSH进入Redis容器并运行,则一切工作都很好redis-cli。
有趣的是,该项目无法连接到Redis所在的Pod。我了解,各个Pod之间的容器共享相同的“本地”网络,可以使用进行访问localhost。
如何将我的项目连接到在其他Pod中运行,可独立扩展的Redis服务器?Redis服务出了什么问题?
我的Redis服务是这样的:
apiVersion: v1
kind: Service
metadata:
name: redis-service
spec:
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
Run Code Online (Sandbox Code Playgroud)
我的Redis Pod由部署配置文件提供支持(我不一定会对其进行扩展,但我会期待它):
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
labels:
app: redis
spec:
selector:
matchLabels:
app: redis
strategy:
type: Recreate
template:
metadata:
labels:
app: redis
spec:
volumes:
- name: redis-persistent-volume
persistentVolumeClaim:
claimName: redis-pvc
containers:
- image: redis:4.0.11
command: ['redis-server']
name: redis
imagePullPolicy: Always
resources:
limits:
cpu: 250m
memory: 512Mi
requests:
cpu: 250m
memory: 512Mi …Run Code Online (Sandbox Code Playgroud) 用例/问题
我负责维护一个有 40 个节点的 kubernetes 集群(分为 2 个区域)。我们有大约 100 个微服务和平台东西,比如在这个集群中运行的 Kafka 代理。所有微服务都定义了资源请求和限制。然而,它们中的大多数都是可突发的,并且没有保证的 RAM。在我们的集群中部署服务的开发人员定义的限制远大于请求(参见下面的示例),最终导致各个节点上的大量 pod 被驱逐。不过,我们仍然希望在我们的服务中使用可爆发资源,因为我们可以使用可爆发资源来节省资金。因此,我需要更好地监控每个节点上运行的所有 pod 的可能性,其中包含以下信息:
通过这种方式,我可以轻松识别两种有问题的服务:
案例 A:微服务只是设置了巨大的资源限制,因为开发人员只是在测试东西或者懒得去测试/监控他的服务
resources:
requests:
cpu: 100m
ram: 500Mi
limits:
cpu: 6
ram: 20Gi
Run Code Online (Sandbox Code Playgroud)
案例B:同一节点上的服务太多,资源限制设置不准确(例如500Mi,但服务一直使用1.5Gi RAM)。这种情况发生在我们身上,因为 Java 开发人员没有注意到 Java 垃圾收集器只会在使用 75% 的可用 RAM 时才开始清理。
我的问题:
我如何才能正确监控这一点,从而识别错误配置的微服务,以防止出现此类驱逐问题?在较小的规模下,我可以简单地运行kubectl describe nodes并kubectl top pods手动计算出来,但在这种规模下不再起作用。
注意:我找不到此问题的任何现有解决方案(包括使用 kube 指标和类似的 prometheus + grafana 板)。我认为这是可能的,但在 Grafana 中可视化这些东西真的很难。
我使用 docker 镜像使用这个命令在我们学校的服务器上运行一个程序。
docker run -t -i -v /target/new_directory 990210oliver/mycc.docker:v1 /bin/bash
Run Code Online (Sandbox Code Playgroud)
在我运行它之后,它在我的帐户上创建了一个名为 new_directory 的 firectory。现在我没有删除或修改文件的权限。
如何删除此目录?
我在 Redhat 上使用 Docker 版本 17.06.0-ce 和 devicemapper 存储。我正在启动一个运行长期服务的容器。容器内的主进程有时会因任何原因而死亡。我收到以下错误消息。
/bin/bash: line 1: 40 Killed python -u scripts/server.py start go
我希望容器退出并由 docker 重新启动。但是 docker 永远不会退出。如果我手动执行,则会出现以下错误:
来自守护进程的错误响应:驱动程序“devicemapper”未能删除根文件系统。
谷歌搜索后,我尝试了很多东西:
docker rm -f <container>
rm -f <pth to mount>
umount <pth to mount>
Run Code Online (Sandbox Code Playgroud)
设备中的所有结果都处于忙碌状态。现在唯一的补救办法是重新启动主机系统,这显然不是一个长期的解决方案。
有任何想法吗?
想象一下在主节点节点设置中,您在节点上部署具有pod反关联性的服务:部署的更新将导致创建另一个pod但调度程序无法调度,因为两个节点都具有反节点亲和力.
问:如何更灵活地设置反亲和力以允许更新?
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- api
topologyKey: kubernetes.io/hostname
Run Code Online (Sandbox Code Playgroud)
有错误
No nodes are available that match all of the following predicates:: MatchInterPodAffinity (2), PodToleratesNodeTaints (1).
Run Code Online (Sandbox Code Playgroud) 我有一个容器 Container-A,其中包含目录 /opt/test/data,其中包含在构建映像期间创建的文件。现在我想将 /opt/test/data(container-a 目录) 共享给 Container-B,因为它需要在其生命周期中使用这些文件。我尝试过以下选项
docker run -it -d -v shareddata:/opt/test/data --name container-a test
Run Code Online (Sandbox Code Playgroud)
然后运行容器-B
docker run -it --volumes-from container-a --name container-b test-prod:latest
Run Code Online (Sandbox Code Playgroud)
数据已共享,但它在主机上创建一个命名卷共享数据,其中包含容器 a 的 /opt/test/data 目录的重复数据。
我尝试了另一种选择,即创建名称卷数据并将其安装在容器 a 中。然后我在已安装的卷上创建了 /opt/test/data 的符号链接,如下所示
ln -s /data/data /opt/test/data
Run Code Online (Sandbox Code Playgroud)
现在已将 /data 卷安装到容器 b,但符号链接在容器 b 上不起作用,因为它显示为损坏的链接。
有没有一种方法可以将容器 a 目录共享到容器 b 而不复制数据,因为我们希望将静态且相当大的数据(大约 2.5G)保留到一个图像,然后一个实例继续运行,该实例在多个容器之间共享测试产品图像?
有没有办法指示docker swarm自动运行垃圾收集并删除所有悬空图像和容器?我运行docker stack rm STACK_NAME并重新部署堆栈,但这会保留未使用的对象.我知道我可以运行docker prune来进行清理,但有没有办法指示docker自动执行此操作?
PS我尝试根据这篇文章设置历史保留限制
我希望能够通过https://192.168.99.100上的 https 访问 nginx docker 容器。到目前为止,我已经完成了以下工作:
Dockerfile:
FROM nginx
COPY certs/nginx-selfsigned.crt /etc/ssl/certs/
COPY certs/nginx-selfsigned.key /etc/ssl/private/
COPY default-ssl.conf /etc/nginx/sites-available/default
EXPOSE 443
Run Code Online (Sandbox Code Playgroud)
我在文件夹中有相应的证书文件certs。
的default-ssl.conf:
server {
listen 80;
listen 443 ssl;
server_name localhost;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
Run Code Online (Sandbox Code Playgroud)
docker-compose.yaml
version: '3'
services:
nginx:
image: mynamespace/nginx_pma
container_name: nginx_pma
build:
context: .
ports:
- 443:443 …Run Code Online (Sandbox Code Playgroud) docker ×7
kubernetes ×4
docker-swarm ×1
dockerfile ×1
https ×1
monitoring ×1
nginx ×1
node.js ×1
redhat ×1