我正在使用指标服务器来获取 Kubernetes 集群的使用情况。但为了从主机外部使用它,我需要使用“kubectl proxy”。但我不想这样做,因为它不打算在后台运行。我希望它作为服务持续运行
我怎样才能实现这些
预期输出 curl clusterip:8001/apis/metrics.k8s.io/v1beta1/nodes
{
"kind": "NodeMetricsList",
"apiVersion": "metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/metrics.k8s.io/v1beta1/nodes"
},
"items": [
{
"metadata": {
"name": "manhattan-master",
"selfLink": "/apis/metrics.k8s.io/v1beta1/nodes/manhattan-master",
"creationTimestamp": "2019-11-15T04:26:47Z"
},
"timestamp": "2019-11-15T04:26:33Z",
"window": "30s",
"usage": {
"cpu": "222998424n",
"memory": "3580660Ki"
}
}
]
Run Code Online (Sandbox Code Playgroud)
我尝试使用LoadBalancig 服务 metrics-server-service.yaml
apiVersion: v1
kind: Service
metadata:
name: metrics-server
namespace: kube-system
labels:
kubernetes.io/name: "Metrics-server"
kubernetes.io/cluster-service: "true"
spec:
selector:
k8s-app: metrics-server
ports:
- port: 443
protocol: TCP
targetPort: main-port
externalTrafficPolicy: Local
type: LoadBalancer
Run Code Online (Sandbox Code Playgroud)
kubectl …
我正在尝试为基于某些选择器的一组 pod 创建一个服务。例如,以下get pods命令根据我的要求检索正确的 pod -
kubectl get pods --selector property1=dev,property2!=admin
Run Code Online (Sandbox Code Playgroud)
以下是服务定义 yaml 的摘录,我在其中尝试使用与上述相同的选择器 -
apiVersion: v1
kind: Service
metadata:
name: service1
spec:
type: NodePort
ports:
- name: port1
port: 30303
targetPort: 30303
selector:
property1: dev
<< property2: ???? >>>
Run Code Online (Sandbox Code Playgroud)
我尝试过matchExpressions但没有意识到service 不在支持 set-based filters 的资源中。它导致以下错误 -
error: error validating "STDIN": error validating data: ValidationError(Service.spec.selector.matchExpressions): invalid type for io.k8s.api.core.v1.ServiceSpec.selector: got "array", expected "string"; if you choose to ignore these errors, turn validation off with --validate=false …Run Code Online (Sandbox Code Playgroud) 在 Kubernetes 入口中,我想动态地将服务名称更改为与入口中路径的特定部分相匹配。像这样的东西:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example
spec:
rules:
- host: example.com
http:
paths:
- path: /api/(^/+)/(.*)
backend:
serviceName: api-(&1)
servicePort: 80
Run Code Online (Sandbox Code Playgroud)
上面示例中的 &1 将解析为字符串 /api/(^/+)/(.*) 中的第一个正则表达式匹配项
因此,基本上,如果路径类似于/api/asset/fetch/anything-at-all,那么它会将调用定向到名为api-asset的服务
我知道这可能会导致一些安全问题,但如果我强制在服务名称中添加前缀“api-”,那么从技术上讲,只有带有前缀“api-”的服务才会暴露在互联网上。所有其他服务仍将在 Kubernetes 集群内受到保护。为了简单起见,我什至可以将前缀更改为“public-”。
这是可能的事吗?设置它的正确语法是什么?
我有一个使用以下内容创建的正在运行的 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 日志显示容器已启动并正在运行。为什么我无法访问我的服务?
允许在相同/不同命名空间中运行的两个 pod(例如 pod A 和 B)进行通信,而不管协议(例如 http、https、akka.tcp)以及应用的有效网络策略如何。
尝试的解决方案:
尝试将网络策略应用于两个 pod 并使用服务名称:“my-svc.my-namespace.svc.cluster.local”使 pod B 与运行服务“my-svc”的 pod A 通信,但两者无法沟通。
还尝试在部署时在 pod B 中添加 pod A 的 IP 地址和主机映射,然后 pod B 能够与 pod A 通信,但反向通信失败。
请建议我解决这个问题的方法。
默认情况下,根据k8s 文档,服务被分配一个 DNS A 记录作为表单名称my-svc.my-namespace.svc.cluster-domain.example。
是否有检索服务全名的命令?
我是 K8s 的新手,目前正在使用 Minikube 来玩这个平台。如何为服务配置公共(即集群外)端口?我遵循了nginx 示例和 K8s 服务教程。就我而言,我创建了这样的服务:
kubectl expose deployment/mysrv --type=NodePort --port=1234
Run Code Online (Sandbox Code Playgroud)
该服务的端口是 1234,供任何试图从集群内部访问它的人使用。minikube 教程说我需要通过它的随机 nodePort 直接访问服务,这适用于手动测试目的:
kubectl describe service mysrv | grep NodePort
...
NodePort: <unset> 32387/TCP
# curl "http://`minikube ip`:32387/"
Run Code Online (Sandbox Code Playgroud)
但我不明白,在一个真正的集群中,该服务如何拥有一个固定的世界可访问端口。nginx 示例描述了有关使用 LoadBalancer 服务种类的一些内容,但它们甚至没有在那里指定端口...
任何想法如何修复整个服务的外部端口?
我在 Kubernetes 集群中运行 3 个节点。每个节点都有相同的 Pod myApp。我使用 NodePort 类型创建一个服务,以便可以从外部访问所有 3 个节点。服务 yaml 如下所示
apiVersion: v1
kind: Service
metadata:
name: myService
labels:
app: myApp
spec:
selector:
app: myApp
type: NodePort
Run Code Online (Sandbox Code Playgroud)
假设3个节点的节点IP+端口为:
1. 192.168.18.1:30010
2. 192.168.18.2:30010
3. 192.168.18.3:30010
我的问题是:
1.如果所有请求都到达IP(192.168.18.1:30010)的单个节点,服务会将请求负载均衡到其他节点中的Pod,还是仅目标节点(IP 192.168.18.1:30010) )?
2. 如果问题1的答案为是,则表示服务可以负载均衡请求。那么我们还需要负载均衡器吗?
谢谢
我想用 minikube 公开我的 kubernetes 集群。
考虑我的树
.
??? deployment.yaml
??? Dockerfile
??? server.js
??? service.yaml
Run Code Online (Sandbox Code Playgroud)
我在本地构建了我的 docker 镜像,并且能够通过
kubectl create -f deployment.yaml
kubectl create -f service.yaml
Run Code Online (Sandbox Code Playgroud)
. 但是当我跑
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2h
nodeapp LoadBalancer 10.110.106.83 <pending> 80:32711/TCP 9m
Run Code Online (Sandbox Code Playgroud)
没有外部 ip 可以连接到集群。试图暴露一个 pod,但外部 Ip 没有。为什么没有外网ip?
$ cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodeapp
labels:
app: nodeapp
spec:
replicas: 2
selector:
matchLabels:
app: nodeapp
template:
metadata:
labels:
app: …Run Code Online (Sandbox Code Playgroud) 我已经构建了一个暴露端口 80 8080 和 8443 的自定义 tcserver 映像。基本上你有一个 apache 并且在配置中你有一个代理传递来将它转发到 tcserver tomcat。
EXPOSE 80 8080 8443
Run Code Online (Sandbox Code Playgroud)
之后,我创建了一个 kubernetes yaml 来构建仅公开端口 80 的 pod。
apiVersion: v1
kind: Pod
metadata:
name: tcserver
namespace: default
spec:
containers:
- name: tcserver
image: tcserver-test:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
Run Code Online (Sandbox Code Playgroud)
以及随之而来的服务。
apiVersion: v1
kind: Service
metadata:
name: tcserver-svc
labels:
app: tcserver
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
selector:
app: tcserver
Run Code Online (Sandbox Code Playgroud)
但问题是我无法访问它。
如果我登录到 pod ( kubectl exec -it tcserver -- /bin/bash),我可以执行 a …