例如,我可以跟随yaml生成具有多个容器的pod:
apiVersion: v1
kind: Pod
metadata:
name: lampapp
labels:
app: app
spec:
containers:
- name: lampdb
image: mysql_test
- name: app
image: php-app-db-url-env
env:
- name: DB_URL
value: 127.0.0.1:3306
- name: app2
image: php-app-db-url-env
env:
- name: DB_URL
value: 127.0.0.1:3306
Run Code Online (Sandbox Code Playgroud) 基本上,我有一个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) 我在部署中使用了 nfs 挂载卷。我需要给它 fsGroup 如下所示:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
Run Code Online (Sandbox Code Playgroud)
有没有办法在部署清单上做到这一点?正如我在文档中看到的,我只能在 pod yaml 中设置安全上下文。
kubernetes kubernetes-security kubernetes-deployment kubernetes-pod
在学习入门教程,第 3 部分:部署到 Kubernetes 时,我偶然发现了清单文件部署定义中的 Pod 模板。在 pod 和容器部分都没有指定端口。
这让我想到了我最初的问题:从 docker 容器到 pod 的端口发布是如何工作的?
以下引用听起来像是 kubernetes 在启动后深入了解正在运行的容器,并从侦听 0.0.0.0:PORT 的服务获取端口,并将其映射到 pod 环境(网络命名空间)中的相同端口。
在此处不指定端口不会阻止该端口被公开。任何侦听容器内默认“0.0.0.0”地址的端口都可以从网络访问。来源
如果我的假设朝着正确的方向发展,这对于具有多个容器的 Pod 意味着什么?kubernetes 是否只允许具有内部服务侦听不同端口的容器?或者是否可以将容器内部端口映射到 pod 环境(网络命名空间)中的不同端口?
根据以下引用,我假设从容器到 pod 的端口映射是不可能的。实际上,在具有相同端口的两个容器中指定两个服务并没有太大意义,只是通过紧随其后的映射来更改它们。
在此处公开端口可为系统提供有关容器使用的网络连接的附加信息,但主要是信息性的。来源
更新 2019-10-15
如以下引述所述,默认情况下,docker 容器不会向外界发布任何端口。
默认情况下,当您创建容器时,它不会将其任何端口发布到外部世界。要使端口可用于 Docker 外部的服务或未连接到容器网络的 Docker 容器,请使用 --publish 或 -p 标志。来源
这意味着 kubernetes 必须以某种方式配置在 pod 中运行的 docker 容器,以便将容器的端口发布到 pod。
关于以下引用,kubernetes 是否有可能通过使用--network 主机配置来运行 docker 容器?假设 pod 是 kubernetes 中的 docker 主机。
如果您对容器使用主机网络模式,则该容器的网络堆栈不会与 Docker 主机隔离 [...] 例如,如果您运行绑定到端口 80 的容器并使用主机网络,则该容器的应用程序是在主机 …
看了kubernetes.io上的官方文档,我还是想知道 Kubernetes 中 label 和 selector 到底有什么区别?
编辑:例如考虑以下 Kubernetes 对象,以下 yaml 文件的 Labels 和 Selectors 有什么区别。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: label-demo
labels:
environment: production
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: App1
template:
metadata:
labels:
environment: production
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
Run Code Online (Sandbox Code Playgroud) 要等待某个 pod 完成,命令是
kubectl wait --for=condition=Ready pod/pod-name
同样,我想等待 statefulset 中的任何一个 pod 准备就绪。我试过下面的命令没有用,
kubectl wait --for=condition=Ready statefulset/statefulset-name
命令选项应该是什么样的?
我正在尝试通过以下命令将本地文件夹移动到 kubernetes 卷中:
kubectl cp /* mynamespace/mypod-xxxx-xxxx:/var/www/my-content
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到以下错误消息:
错误:src 或 dest 之一必须是远程文件规范
即使我已经配置卷安装如下:
volumeMounts:
- mountPath: "/var/www/my-content"
name: mycontent
volumes:
- name: mycontent
persistentVolumeClaim:
claimName: mypvc
Run Code Online (Sandbox Code Playgroud)
请让我知道我错过了哪些配置。
我是 Kubernetes 新手,正在致力于在新的 Kubernetes 集群中部署应用程序。
目前,运行的服务有多个Pod需要相互通信。我正在寻找一种通用方法来调试问题,而不是进入服务的详细信息,因为问题会变得过于具体。
集群内的 Pod 抛出错误:
err="Get \"http://testpod.mynamespace.svc.cluster.local:8080/": dial tcp 10.10.80.100:8080: connect: connection refused"
两个 Pod 位于同一集群中。
调试此问题的最佳步骤是什么?
我尝试运行:
kubectl exec -it testpod --namespace mynamespace -- cat /etc/resolv.conf
这返回:
search mynamespace.svc.cluster.local svc.cluster.local cluster.local us-east-2.compute.internal
我在这里找到的: https: //kubernetes.io/docs/concepts/services-networking/dns-pod-service/
我有一个可以正常运行的本地图像:
docker run -p 8080:8080 -v C:\Users\moritz\Downloads\1\imageService\examples1:/images -v C:\Users\moritz\entwicklung\projekte\imageCluster\logs:/logs imageservice
现在我希望它作为 Kubernetes(使用 Docker-for-Windows v1.19.7 内置的)部署运行:
apiVersion: apps/v1
kind: Deployment
metadata:
name: image-service
spec:
selector:
matchLabels:
app: image-service
template:
metadata:
labels:
app: image-service
spec:
containers:
- name: image-service
image: "imageservice"
resources:
limits:
cpu: "0.9"
memory: "1Gi"
ports:
- name: http
containerPort: 8080
volumeMounts:
- mountPath: /images
name: image-volume
- mountPath: /logs
name: log-volume
volumes:
- name: image-volume
hostPath:
path: "c:\\Users\\moritz\\Downloads\\1\\imageService\\examples1"
type: Directory
- name: log-volume
hostPath:
path: /mnt/c/Users/moritz/entwicklung/projekte/imageCluster/logs
type: Directory
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我尝试了不同的方法在 …
我重新启动了 Prometheus pod,现在 Prometheus pod 正在崩溃。在日志中发现这个错误:
level=error ts=2021-06-09T09:27:29.066Z caller=main.go:758 err="opening storage failed: block dir: \"/prometheus/01F6J0P4KBBWVJD2M8B1PE7C5E\": open /prometheus/01F6J0P4KBBWVJD2M8B1PE7C5E/meta.json: no such file or directory"
Run Code Online (Sandbox Code Playgroud)
注意到该01F6J0P4KBBWVJD2M8B1PE7C5E
文件夹中只有 chunks 文件夹。
知道为什么会发生这种情况吗?有没有办法解决这个问题?
kubernetes prometheus kubernetes-helm prometheus-operator kubernetes-pod