问题标签 [kubernetes-apiserver]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
authentication - 来自 kube-rbac-proxy 的身份验证错误,api 服务器无法进行身份验证
我有一个准入控制器来验证请求。我已经单独测试了准入控制器,它工作正常。现在我已经将kube-rbac-proxy实现为 sidecar 容器。Sidecar 容器是 https,它需要一个 ca 证书或一个不记名令牌。带有 ca 的 curl 请求运行良好。当我尝试使用 kubectl 命令时,它给了我 tls: bad certificate error。我已经记录了请求,但找不到请求中包含的任何 ca 证书。
单独的准入控制器(https 服务器)工作正常。带有相应 ca 证书的 curl 请求能够通过 kube-rbac-proxy 调用准入控制器。实施此以支持 tls。
kubernetes-pod - K8S:容器在删除 pod 时将状态从 Running 更改为 Waiting
我的目标是什么:
我有一个研究任务,我正在使用 Kubernetes Java 客户端订阅 Kubernetes API 并从所有命名空间(创建、修改、删除)接收有关所有 pod 的事件。我的目标是根据响应中的容器状态进行一些分析。
我在做什么:
我有一个 Kubernetes 1.14 的测试集群。集群在一些节点上运行并旋转一堆 pod。出于测试目的,我选择了在副本集中运行的 2 个 pod。每个 pod 有 1 个容器。重启策略是“始终”。为了不在同一个节点上运行 2 个副本,启用了反关联功能。有时我会从副本集中删除一个随机选择的 pod 并检查响应。我希望 pod 内的容器从 Running 状态切换到 Terminated 状态,pod 终止,新的 pod 启动。
我所面临的:
大多数情况下它按预期工作。但有时容器会从运行状态切换到等待状态,原因是“ContainerCreating”。一段时间后,发现只有将新创建的 pod 分配给已删除的 pod 仍在终止的完全相同的节点时才会发生这种情况。
问题:
为什么容器不将其状态更改为已终止状态?是否有任何目的以另一种方式改变状态?
kubernetes - Kubernetes API Server watch 机制是如何工作的?
在 kubenertes 环境中,有一个 API 服务器,我们可以调用它来监视资源。感谢 HTTP 请求(或 WebSocket,但这与我的问题无关),我们可以调用此 API 服务器,我想知道 API 服务器如何处理永不终止此请求并继续通知客户端有关资源的任何更改。
编辑:我的意思是 HTTP 协议是一个请求/响应协议,我知道使用 HTTP2 我们可以保持同一个 TCP 连接打开以执行多个请求,但它仍然必须是请求/响应性质。那么监视机制如何与这个请求/响应协议一起工作呢?
从键
关键是分块头。
您可以在向 kube API 服务器请求时看到一个标头
Transfer-Encoding: chunked
https://en.wikipedia.org/wiki/Chunked_transfer_encoding
在 doc 中,服务器可以使用此标头连续发送有效负载。
在 kubernetes 中,您也可以检查它
curl -v 127.0.0.1:8001/apis/apps/v1/watch/namespaces/<mycase :)>>
go - k8s api 服务器前面的 Golang 代理挂在 kubectl delete pod 上并带有“WINDOW_UPDATE”
我正在编写一个位于 k8s api 服务器前面的基于 Golang 的 L7 代理。像这样的东西,
kubectl <----> 网关/代理 <----> AWS EKS API 服务器
, , ,等常用kubectl
命令可以正常工作。但是,对于,卡住/挂起。get pods
exec
run
apply
create
kubectl delete pod <name>
kubectl
通常,这些是kubectl
添加watch=true
标志的情况。在这种情况下,k8s 服务器不发送END_STREAM
,所以我的代理卡在“读帧 WINDOW_UPDATE”中
有人见过这个吗?我正在查看client-go
或kubernetes
repo 以查看设置时如何kubectl
处理响应watch=true
。将不胜感激任何指针。
下面是我的调试日志——
代理代码使用 Golang 编写NewSingleHostReverseProxy
,它终止 TLS,修补与 k8s api 服务器的新连接。
kubernetes - 尝试从 pod 访问 Kubernetes API 时出现 403 禁止错误
根据本文档,我正在尝试使用以下命令从 pod 访问 Kuberenetes API
curl --cacert ca.crt -H "Authorization: Bearer $(<token)" https://kubernetes/apis/extensions/v1beta1/namespaces/default/deployments/ballerina-prime/scale
遵循以下模板
curl --cacert ca.crt -H "Authorization: Bearer $(<token)" https://kubernetes/apis/extensions/v1beta1/namespaces/{namespace}/deployments/{name}/scale
它抛出以下错误
有人可以指出我在哪里犯错或建议我可以访问 Kubernetes API 的任何其他方式吗?
更新01
我根据建议的文档创建了一个角色。以下是我使用的清单。
我使用此命令应用了它。kubectl apply -f deployments-and-deployements-scale.yaml
. 我仍然无法访问所需的端点。我在哪里犯错?
kubernetes - Kubernetes API 调用是否是秘密更新和 configmap 更新原子调用?
client.Secrets(namespace).Update(secret) 是原子调用吗?如果此调用以某种方式失败,存储在 Kubernetes API 服务器中的原始机密是否会损坏?
同样, core.ConfigMaps(namespace).Update(configmap) 是原子调用吗?如果此调用失败,现有的 configmap 是否会损坏?
go - golang http server 拖尾日志 kubeapi 代理
也许有人遇到过类似的问题。我们有一个 kubeapi 代理,它使用 sso 模拟用户。Kubectl 工具适用于任何命令,除非您使用 tail-f
我确实看到应用程序数据每 1-5 秒返回一次,但输出需要大约 45 秒。
我们使用标准 go 包中的 http/server,我们的代理基于https://github.com/ericchiang/kube-oidc/issues
附加 TCP 转储。谢谢
kubernetes-apiserver - preStop hook inside pod using K8s API
Is there a way to call a function before the Pod is being terminated? preStop hook examples are based on yaml specs.
I want to use the K8s API, should I just write a SIGTERM handler ? What is the "safe" way to do it ?
go - 在单个 YAML 文件中使用多种类型直接针对 Kubernetes API 使用 client-go 到 `kubectl apply`
我正在使用https://github.com/kubernetes/client-go并且一切正常。
我有官方 Kubernetes 仪表板的清单 (YAML):https ://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
我想kubectl apply
在 Go 代码中模仿这个清单,使用 client-go。
我知道我需要将 YAML 字节编组到包中定义的正确 API 类型中:https ://github.com/kubernetes/api
我已经成功地Create
将单个 API 类型编辑到我的集群中,但是如何为包含不同类型列表的清单执行此操作?是否有kind: List*
支持这些不同类型的资源?
我目前的解决方法是使用csplit
with --- 作为分隔符来拆分 YAML 文件
接下来,我循环创建新的 (14) 部分,读取它们的字节,打开 UniversalDeserializer 解码器返回的对象类型,并使用我的 k8s 客户端集调用正确的 API 方法。
我想以编程方式执行此操作,以将仪表板的任何新版本更新到我的集群中。我还需要为 Metrics Server 和许多其他资源执行此操作。另一种(可能更简单)的方法是将安装了 kubectl 的代码发送到容器映像并直接调用kubectl apply -f -
; 但这意味着我还需要将 kube 配置写入磁盘,或者内联传递它,以便 kubectl 可以使用它。
我发现这个问题很有帮助:https ://github.com/kubernetes/client-go/issues/193 解码器住在这里:https ://github.com/kubernetes/apimachinery/tree/master/pkg/runtime/串行器
它在 client-go 中公开:https ://github.com/kubernetes/client-go/blob/master/kubernetes/scheme/register.go#L69
我还查看了 kubectl 使用的 RunConvert 方法:https ://github.com/kubernetes/kubernetes/blob/master/pkg/kubectl/cmd/convert/convert.go#L139并假设我可以提供我自己的genericclioptions.IOStreams来获取输出吗?
我还查看了标记为 [client-go] 的其他问题,但大多数使用旧示例或使用带有单个kind
定义的 YAML 文件,此后 API 发生了变化。
编辑:因为我需要为多个集群执行此操作,并且正在以编程方式创建集群(AWS EKS API + CloudFormation/ eksctl),所以我想尽量减少ServiceAccount
跨多个 AWS 账户创建跨多个集群上下文的开销。理想情况下,创建我的客户端集所涉及的唯一身份验证步骤是使用aws-iam-authenticator使用集群数据(名称、区域、CA 证书等)获取令牌。有一段时间没有发布aws-iam-authenticator,但是内容master
允许使用第三方角色跨账户角色和外部ID传递。IMO,这比使用ServiceAccount
(和IRSA) 因为应用程序(创建附加组件并将其应用到这些集群的后端 API)需要与之交互的其他 AWS 服务。
编辑:我最近发现了https://github.com/ericchiang/k8s。在高层次上,它绝对比 client-go 更简单,但不支持这种行为。
kubernetes - 如何在 Kubernetes 中执行清单策略?
我建立了一个基于 Kubernetes 的自助服务平台,我们为每个团队创建命名空间,并允许他们“在命名空间内做任何他们想做的事情”(我们设置了资源限制,所以没有人可以杀死整个集群)。
但是,现在我想在整个组织中实施某种标准。例如,我希望每个 PodSpec 定义它自己的资源限制,并且我希望每个资源都有一个标签来指定它属于哪个应用程序。
是否有一种机制允许 API 服务器根据一组规则检查正在应用的清单,如果检查失败,则清单被拒绝。
例如,以下清单将被拒绝,因为它既没有标签也没有设置资源限制。
但是以下清单会成功,因为它满足所有规则: