抱歉没有保持简短,因为任何这样的尝试都会让我错过我的问题的一些重要细节。
我有一个遗留 Java 应用程序,它在集群环境中以主动/备用模式工作,通过预定义的端口公开某些 RESTful Web 服务。
如果我的应用程序集群中有两个节点,那么在任何时候都只有一个节点处于主动模式,另一个处于被动模式,并且请求始终由运行在主动模式下的应用程序的节点提供。“主动”和“被动”只是角色,因此应用程序将在两个节点上运行。主动和被动实例通过相同的预定端口相互通信。
假设我有一个两节点集群,我的应用程序的一个实例在每个节点上运行,那么其中一个实例最初是主动的,另一个是被动的。如果由于某种原因主动节点因为某种原因而折腾,其他节点中的应用程序实例会使用某种心跳机制识别出这一点,接管控制权并成为新的主动节点。当旧的主动恢复时,它检测到另一个人已经拥有新的主动角色,因此它进入被动模式。
应用程序设法在同一端点 IP 上提供 RESTful web 服务,而不管哪个节点在“活动”模式下运行应用程序,通过使用集群 IP,它搭载在活动实例上,因此集群 IP 切换到任何节点在活动模式下运行应用程序。
我正在尝试将这个应用程序容器化并在 Kubernetes 集群中运行它,以实现扩展和易于部署。我能够容器化并将其部署为 Kubernetes 集群中的 POD。
为了在此处引入主动/被动角色,我正在运行此 POD 的两个实例,每个实例都使用节点关联固定到单独的 K8S 节点(每个节点被标记为主动或被动,POD 定义固定在这些标签上) ,并使用我的应用程序的集群机制将它们集群起来,而只有一个是主动的,另一个是被动的。
我通过使用 NodePort 使用 K8S 服务语义在外部公开 REST 服务,并通过主节点上的 NodePort 公开 REST WebService。
这是我的 yaml 文件内容:
apiVersion: v1
kind: Service
metadata:
name: myapp-service
labels:
app: myapp-service
spec:
type: NodePort
ports:
- port: 8443
nodePort: 30403
selector:
app: myapp
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: active
spec:
replicas: 1
template:
metadata: …Run Code Online (Sandbox Code Playgroud) 面临以下问题:我需要在某些 Pod 上添加搜索域,以便能够与无头服务通信。Kubernetes 文档建议设置一个 dnsConfig 并设置其中的所有内容。这就是我所做的。此外,还有一个限制,即只能设置 6 个搜索域。清单的一部分:
spec:
hostname: search
dnsPolicy: ClusterFirst
dnsConfig:
searches:
- indexer.splunk.svc.cluster.local
containers:
- name: search
Run Code Online (Sandbox Code Playgroud)
不幸的是,它没有任何效果,并且目标 pod 上的 resolv.conf 文件不包含此搜索域:
search splunk.svc.cluster.local svc.cluster.local cluster.local us-east4-c.c.'project-id'.internal c.'project-id'.internal google.internal
nameserver 10.39.240.10
options ndots:5
Run Code Online (Sandbox Code Playgroud)
快速查看此配置后,我发现当前指定了 6 个搜索域,这可能就是未添加新搜索域的原因。您可以手动添加,一切都会正常,但这不是我想要实现的目标。
您有什么想法如何绕过这个限制吗?
PS 将 dnsPolicy 设置为 None 也不是一个选项,因为设置预启动挂钩来添加我的搜索区域。
---
# Search-head deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: search
namespace: splunk
labels:
app: splunk
spec:
replicas: 1
selector:
matchLabels:
app: splunk
template:
metadata:
labels:
app: splunk
spec:
hostname: search …Run Code Online (Sandbox Code Playgroud) google-cloud-platform kubernetes google-kubernetes-engine kubernetes-pod
我有一个 JSON 格式的现有配置文件,如下所示
{
"maxThreadCount": 10,
"trackerConfigs": [{
"url": "https://example1.com/",
"username": "username",
"password": "password",
"defaultLimit": 1
},
{
"url": "https://example2.com/",
"username": "username",
"password": "password",
"defaultLimit": 1
}
],
"repoConfigs": [{
"url": "https://github.com/",
"username": "username",
"password": "password",
"type": "GITHUB"
}],
"streamConfigs": [{
"url": "https://example.com/master.json",
"type": "JSON"
}]
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用 --from-file 选项传递键/值对属性文件,用于配置映射和秘密创建。
但是 JSON 格式的文件呢?Kubernetes 是否也将 JSON 格式文件作为输入文件来创建 configmap 和 secret?
$ kubectl create configmap demo-configmap --from-file=example.json
Run Code Online (Sandbox Code Playgroud)
如果我运行此命令,它会显示已创建 configmap/demo-configmap。但是如何在其他 pod 中引用此 configmap 值?
我使用 Go 中的 client-go API 来访问给定控制器(部署)下的 Pod 列表。使用选择器标签查询属于它的 pod 列表时,您会得到一个数组PodConditions- https://pkg.go.dev/k8s.io/api/core/v1?tab=doc#PodCondition。
这与 Pod 条件的官方文档非常一致 - https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-conditions。但文档并不清楚如何访问这个条目数组。是按照最近的条目先排序吗?例如,如果我只想访问 Pod 的最新状态,应该怎么做?从我在本地集群中进行的一项试验中,我获得了控制器 Pod 之一的更新(Pod 条件数组),如下所示
{Initialized True 0001-01-01 00:00:00 +0000 UTC 2020-07-29 08:01:15 +0000 UTC }
{Ready True 0001-01-01 00:00:00 +0000 UTC 2020-07-29 08:01:22 +0000 UTC }
{ContainersReady True 0001-01-01 00:00:00 +0000 UTC 2020-07-29 08:01:22 +0000 UTC }
{PodScheduled True 0001-01-01 00:00:00 +0000 UTC 2020-07-29 08:01:15 +0000 UTC }
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,给定的 Pod几乎同时从 转变ContainersReady为。但它们都不在第一个或最后一个索引中。Ready08:01:22 +0000 UTC
TLDR,问题是如何从这个值数组推断最新的 Pod …
我们在 K8s 上运行的平台有不同的组件。我们需要在其中两个组件(comp-A 和 comp-B)之间共享存储,但我们错误地为此定义了 PV 和 PVC ReadWriteOnce,即使这两个组件在不同的节点上运行,一切正常,我们能够从两个组件读取和写入存储。
根据 K8s 文档,ReadWriteOnce可以挂载到一个节点,我们必须使用ReadWriteMany:
所以我想知道为什么一切正常,而它不应该?
更多信息:我们使用 NFS 进行存储,我们没有使用动态配置,下面是我们如何定义我们的 pv 和 pvc(我们使用 helm):
- apiVersion: v1
kind: PersistentVolume
metadata:
name: gstreamer-{{ .Release.Namespace }}
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
mountOptions:
- hard
- nfsvers=4.1
nfs:
server: {{ .Values.global.nfsserver }}
path: /var/nfs/general/gstreamer-{{ .Release.Namespace }}
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gstreamer-claim
namespace: {{ .Release.Namespace }}
spec: …Run Code Online (Sandbox Code Playgroud) 我想在一个 Pod 上运行两个容器。
container1是一个尝试连接到在container2.
如何确保 sql 容器 ( container2) 将运行并在启动前准备就绪container1?
initContainer在这里不起作用,因为它将在两个容器之前运行。
这是我的 compose.yaml:
apiVersion: v1
kind: Pod
metadata:
name: sql-test-pod
labels:
name: sql-test
spec:
restartPolicy: Never
containers:
- name: my-sqldb
image: docker-registry.com/database
imagePullPolicy: Always
resources:
limits:
memory: "4096Mi"
cpu: "750m"
requests:
memory: "4096Mi"
cpu: "750m"
- name: tests
tty: true
stdin: true
image: docker-registry.com/test
imagePullPolicy: Always
resources:
limits:
memory: "4096Mi"
cpu: "750m"
requests:
memory: "4096Mi"
cpu: "750m"
env:
- name: sqlhostname
value: "SqlHostnamePlaceholder" …Run Code Online (Sandbox Code Playgroud) 我有一个 k3s 集群,我的应用程序 Pod 正在运行。当我登录(使用命令)时,在所有 Pod 中kubectl exec <pod_name> -n <ns> -it /bin/bash都有kubernetes.io一个目录,其中包含任何人都可以获得的秘密令牌 cat token:
root@Ubuntu-VM: kubectl exec app-test-pod -n app-system -it /bin/bash
root@app-test-pod:/var/run/secrets/kubernetes.io/serviceaccount# ls -lhrt
total 0
lrwxrwxrwx 1 root root 12 Oct 11 12:07 token -> ..data/token
lrwxrwxrwx 1 root root 16 Oct 11 12:07 namespace -> ..data/namespace
lrwxrwxrwx 1 root root 13 Oct 11 12:07 ca.crt -> ..data/ca.crt
Run Code Online (Sandbox Code Playgroud)
这似乎是一个安全威胁(或漏洞)。有人可以让我知道是否有办法从 pod 中删除此依赖项,以便我可以限制用户(甚至是 root 用户)在登录 pod 时访问此机密?另外,如果这是可能的,那么 pod 将如何与 API 服务器通信?
kubernetes kubernetes-security kubernetes-pod kubernetes-secrets k3s
在一个简单的 bash 脚本中,我想运行多个kubectl和helm命令,例如:
helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.5.4 \
--set installCRDs=true
kubectl apply -f deploy/cert-manager/cluster-issuers.yaml
Run Code Online (Sandbox Code Playgroud)
我的问题是,在helm install命令之后我必须等到 cert-manager pod 运行,然后kubectl apply才能使用该命令。现在脚本调用它太早了,所以它会失败。
我需要设置一个 kubernetes pod 来为我的 Web 应用程序的客户端创建演示环境,试用期为 20 天。20天后,pod应该会自动删除,如何让pod在20天后自毁?我使用 Rancher 来部署我的 Pod。
我有一个使用以下内容创建的正在运行的 Pod pod-definition.yaml:
apiVersion: v1
kind: Pod
metadata:
name: microservice-one-pod-name
labels:
app: microservice-one-app-label
type: front-end
spec:
containers:
- name: microservice-one
image: vismarkjuarez1994/microserviceone
ports:
- containerPort: 2019
Run Code Online (Sandbox Code Playgroud)
然后我使用以下命令创建了一个服务service-definition.yaml:
kind: Service
apiVersion: v1
metadata:
name: microserviceone-service
spec:
ports:
- port: 30008
targetPort: 2019
protocol: TCP
selector:
app: microservice-one-app-label
type: NodePort
Run Code Online (Sandbox Code Playgroud)
然后我跑去kubectl describe node minikube寻找我应该连接的节点 IP——结果是:
Addresses:
InternalIP: 192.168.49.2
Hostname: minikube
Run Code Online (Sandbox Code Playgroud)
但是当我运行以下curl命令时没有得到任何响应:
curl 192.168.49.2:30008
Run Code Online (Sandbox Code Playgroud)
192.168.49.2:30008当我尝试从浏览器访问时,请求也会超时。
Pod 日志显示容器已启动并正在运行。为什么我无法访问我的服务?