我正在尝试kubectl expose在 Google Container Engine 上通过带有静态 IP 地址的命令公开 kubernetes“部署” 。
使用临时 IP,一切正常:
kubectl expose deployment my-application \
--type="LoadBalancer" --port=80 --target-port=8080
Run Code Online (Sandbox Code Playgroud)
我使用kubectl get services并等待几分钟以查看已分配的临时 IP。我在浏览器中输入 IP 并看到应用程序,即一切正常。
但是,当我执行以下操作时:
使用 gcloud 网络界面创建静态 IP 地址(网络 -> 外部 IP 地址 -> 保留静态 IP 地址)
使用与上述相同的命令重新创建服务,但使用额外的--load-balancer-ip选项
kubectl expose deployment my-application \
--type="LoadBalancer" --port=80 --target-port=8080 \
--load-balancer-ip='1.2.3.4' # IP as assigned by web interface above
Run Code Online (Sandbox Code Playgroud)命令成功,但在该 IP 地址下无法访问应用程序,当我使用以下命令时:
$ kubectl get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
endpoints 10.119.247.39 <pending> …Run Code Online (Sandbox Code Playgroud) 这个有点理论性,但请耐心等待。
目前我有一个服务器运行几个 Docker 容器(4 个或 5 个,取决于日期和时间)。我计划添加另一个,就像第一个一样,甚至可能是第三个。
现在,我的问题是:我应该管理 15 个容器而不是 5 个,使用 Google Kubernetes 有什么好处吗?
此外,是否有“官方”或至少“确定性”的工作流程可以从 Docker 容器迁移到 Kubernetes 的本机单元“pods”。在你问之前,我确实知道 pod 是由容器组成的(有时甚至是一个)。我的主要问题是“dockerfiles”与 pod 配置完全不同。
有任何想法吗?
文档说...
Pod(如鲸鱼或豌豆荚)是一组一个或多个容器(例如 Docker 容器)、这些容器的共享存储以及有关如何运行容器的选项。Pod 始终位于同一地点和共同调度,并在共享上下文中运行。Pod 模拟特定于应用程序的“逻辑主机”——它包含一个或多个相对紧密耦合的应用程序容器——在预容器世界中,它们将在相同的物理或虚拟机上执行。
但我不确定“共址”是否意味着在同一个 P?o?d 上?节点。当卫星位于同一地点时,它们“非常接近,因此对于地面上的接收设备,它们‘似乎’占据一个单一的轨道位置。” 所以,这可能在同一个集群上,而不是在同一个节点上。
在发布此内容时,我可以在此问题上找到的唯一信息是https://platform9.com/blog/compare-kubernetes-vs-ecs/那里说...
单个 Pod 中的容器保证在单个 Kubernetes 节点上运行。
现在这听起来很确定,但我无法在任何地方得到任何证实。我想确保它们是正确的,而不仅仅是误解和传播错误信息。
我问的原因是,如果这是真的,Kubernetes 似乎本质上是浪费的。几乎可以肯定,部署了 Pod 的节点将剩余资源。您可能会拥有一个 Pod,它的需求可以通过这些剩余资源的组合来满足。但是,如果一个 Pod 不能跨越多个节点,您将不得不创建一个新节点并拥有更多未利用的资源。
我使用janus-gateway作为用于群组视频通话的 webrtc 媒体服务器。以前我使用 docker-compose 将它部署在单个节点中,但现在我希望能够水平扩展它。为此,我正在尝试使用 kubernetes,但我面临两个问题:
1:指定要为媒体服务器公开的端口范围。由于媒体服务器需要一个端口范围才能运行,我可以在 docker-compose 中使用以下代码进行操作
janus-gateway:
build: ./gateway
image: janus-gateway-image
restart: always
ports:
- 8088:8088
- 8188:8188
- 7088:7088
- "10000-10200:10000-10200/udp"
networks:
- back-tier
Run Code Online (Sandbox Code Playgroud)
但是我无法在 kubernetes 中找到任何替代方案。如何使用 kubernetes 公开端口范围。
2:如何从我的 nodejs 应用程序连接到网关的特定实例。所以假设网关的两个实例正在运行,现在当用户连接到应用程序时,我将它连接到正在运行的两个实例之一并将其保存在 redis 中,并确保来自该用户的任何请求都传递到该特定实例. 如何从节点连接到特定副本?还获取副本列表?
我已经在 kuebernetes 上检查过这个问题,但它仍然没有解决。有什么解决方法吗?
想象一下这个场景。
我如何为这个容器分配 192.168.0.3 的 IP?
我需要服务在他们设计的默认端口上运行。
我不能使用反向代理作为解决方案,因为这并不能解决如何通过 SSH 与 GitLab 实例通信的问题。
在这种情况下,将端口 22 映射到主机上的不同端口是不专业的,我的客户端开发人员不会喜欢这种设置。
如果我正在启动此应用程序的许多实例,这也将很难维护。并且必须为每个容器将每个 SSH 映射到主机上的新端口。
我的客户需要能够在没有额外配置客户端的情况下解析和运行以下内容。
https://GitLab.internal.net.work
ssh git 克隆https://GitLab.internal.net.work
我已经查看了 Docker 网络文档,除非我弄错了,否则我看不到一个易于维护的解决方案(尽管我还是 Docker 的新手)。
如何才能做到这一点?在这种情况下,其他人在做什么作为“最佳实践”?(如果可能,请以 docker-compose 语法的形式给出答案)。
我正在尝试在 GKE 上运行机器学习作业,并且需要使用 GPU。
我使用 Tesla K80 创建了一个节点池,如本演练中所述。
我将最小节点大小设置为 0,并希望自动缩放器会根据我的工作自动确定我需要多少个节点:
gcloud container node-pools create [POOL_NAME] \
--accelerator type=nvidia-tesla-k80,count=1 --zone [COMPUTE_ZONE] \
--cluster [CLUSTER_NAME] --num-nodes 3 --min-nodes 0 --max-nodes 5 \
--enable-autoscaling
Run Code Online (Sandbox Code Playgroud)
最初,没有需要 GPU 的作业,因此集群自动缩放器正确地将节点池缩小到 0。
但是,当我使用以下规范创建作业时
resources:
requests:
nvidia.com/gpu: "1"
limits:
nvidia.com/gpu: "1"
Run Code Online (Sandbox Code Playgroud)
这是完整的作业配置。(请注意,此配置是部分自动生成的。我还删除了一些与问题无关的环境变量)。
在Insufficient nvidia.com/gpu我手动将节点池增加到至少 1 个节点之前,Pod一直处于挂起状态。
这是 GPU 节点池的当前限制,还是我忽略了什么?
graphics-processing-unit kubernetes google-kubernetes-engine nvidia
我的 kubernetes 集群的节点都有小的根分区。是否可以将 k8s 配置为使用 emptyDir 卷的备用位置?
我有一个基本的 nginx 部署和一个由 let's 通过 cert-manager 加密颁发的现有证书。我以为一切都已准备就绪,可以开始使用证书,但我无法连接 https。
连接到 LoadBalancer IP 和域可以正常工作。使用 https 连接域无法连接。Chrome 这么说ERR_SSL_PROTOCOL_ERROR,Firefox 这么说SSL_ERROR_RX_RECORD_TOO_LONG,SSL Labs 这么说Assessment failed: No secure protocols supported。都是同一个问题。
这是服务:
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: example
labels:
app: example
spec:
type: LoadBalancer
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
- name: https
protocol: TCP
port: 443
targetPort: 80
selector:
app: example
Run Code Online (Sandbox Code Playgroud)
这是入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx
namespace: example
annotations:
cert-manager.io/cluster-issuer: letsencrypt-production …Run Code Online (Sandbox Code Playgroud) 我知道运行单节点集群的后果和问题。不过,我仍然很好奇这是否可能。我打算自己把一切都安排好。
换句话说,我可以在同一台物理机上运行控制平面和工作节点吗?
基础设施没有变化如果我执行任何 kubectl 命令,即:
kubectl get nodes
Run Code Online (Sandbox Code Playgroud)
我有错误
You must be logged in to the server (Unauthorized)
Run Code Online (Sandbox Code Playgroud)
而且我有工作的 kubernetes 集群并且没有对其进行任何更改......任何想法如何调试它?kubectl 没有 -vv od 调试标志来提供更多信息。
如果我尝试
kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0",
(...)
error: You must be logged in to the server (the server has asked for the client to provide credentials)
Run Code Online (Sandbox Code Playgroud) kubernetes ×10
docker ×3
containers ×1
docker-swarm ×1
gcloud ×1
ingress ×1
k3s ×1
nvidia ×1
ssh ×1
ssl ×1
webrtc ×1