我正在尝试使用Kubernetes运行我的应用程序我已经从名为deployment.yaml
的文件中创建了一个名为service.yaml
的文件中的服务部署
这是deployment.yaml
的内容:
apiVersion: v1
kind: Pod
metadata:
name: kubectl-test
spec:
containers:
- name: kubectl-test
image: gcr.io/[my-name]/node-app:0.0.1
imagePullPolicy: Always
ports:
- containerPort: 8080
hostPort: 8080
这是我的services.yaml
kind: Service
apiVersion: v1
metadata:
#Service name
name: kubectl-test-node-app
spec:
selector:
app: kubectl-test-189010
ports:
- protocol: TCP
port: 8000
targetPort: 8000
type: LoadBalancer
当我运行命令kubectl get deployments
时,我可以看到:
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1 1 1 1 16m
我可以通过使用kubectl get services
查看我的服务,我可以看到:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubectl-test-node-app LoadBalancer 10.59.242.211 35.195.2.76 8000:31592/TCP 8m
kubernetes ClusterIP 10.59.240.1 <none> 443/TCP 1d
当我尝试访问EXTERNAL-IP:8000
时,我无法在那里看到我的应用程序,我没有得到任何错误,但我不会出现什么问题!
编辑
我必须使用以下方法创建部署:
`kubectl run kubernetes-bootcamp --image=[image-name] --port=8080`
但没有这个命令
`kubectl create -f deployment.yaml`
这与港口有关:8000:31592/TCP
?
kubectl get pods
kubectl-test 1/1 Running 0 4h
kubernetes-bootcamp-1654181842-czwqg 1/1 Running 0 3h
编辑
运行命令kubectl describe services kubectl-test-node-app
返回:
Name: kubectl-test-node-app
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=kubectl-test-189010
Type: LoadBalancer
IP: 10.59.242.211
LoadBalancer Ingress: 35.195.2.76
Port: <unset> 8000/TCP
TargetPort: 8000/TCP
NodePort: <unset> 31592/TCP
Endpoints: <none>
Session Affinity: None
External Traffic Policy: Cluster
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CreatingLoadBalancer 58m service-controller Creating load balancer
Normal CreatedLoadBalancer 57m service-controller Created load balancer
没有定义端点。我想这是问题所在?我该如何建立终点?
您的服务规范针对所有pod,其标签为“app = kubectl-test-189010”,您的pod的规范没有。
您需要更新pod的元数据,以便它与服务规范中的选择器匹配:
metadata:
name: kubectl-test
app: kubectl-test-189010
您的服务也接受端口8000上的连接,然后将其转发到pod上的端口8000(targetPort)。但pod侦听端口8080(containerPort)。因此,应将其中一个更改为匹配另一个 - targetPort或containerPort。
您可以在此处阅读有关在Kubernetes中配置服务的更多信息:https://kubernetes.io/docs/concepts/services-networking/service/
对于初学者,请确保您知道自己想要完成的任务。你说service
和deployment
,但你的文件是指服务和Pod。
部署是一个对象,它将创建ReplicaSet并对其进行扩展,以便在集群中启动特定的一组底层Pod。从Deployments元数据中获取,它们将具有一些标签。这些标签是Service将匹配(labels&selectors)的选择器。我确实假设您确实想要使用部署,以利用诸如滚动更新之类的东西(在很多情况下通常非常难以更新Pod,并且您最终会删除并手动重新创建它)或缩放。
有了这个假设,你需要部署(如果你真的想采用“手动”的方式,那就是Pod),这就像下面的那样
metadata:
labels:
app: myappname
其次是具有选择器defined的服务
selector:
app: myappname
这应该足以让你有一个工作的设置,你应该看到你的服务现在将有活动的端点(假设您的pod已启动并处于Ready
状态。
此外,如果您想在标签中包含版本,那么您可以。使用服务定位特定的pod版本,或者将其用于pod亲缘关系等其他原因,你应该将它分成两个标签,如
metadata:
labels:
app: myappname
ver: v12
我能够修复它,我不得不更改dokcerfile并做了一些调整,然后我的deployment.yaml文件也必须稍微更改一下,主要是在我的service.yaml中添加正确的名称和端口号,以及最后我的webpack配置已经改变了!
正如@Leonid Talalaev所说,您的pod和服务中的选择器不同步。此外,查看kubectl get services
的输出,您的应用程序在NodePort
31592上暴露在集群外部。您是否尝试使用此端口访问该应用程序?
我还建议使用Deployment而不是Pod。使用kubectl
创建部署时,使用部署将自动创建所需的ReplicaSet和Pod。
我不确定你想要的NodePort
是什么,但如果你想在端口32000(例如)上将你的应用程序暴露在集群之外,你可以使用下面的配置。然后你应该能够使用http://<CLUSTER_IP>:32000/
访问你的应用程序
# deployment.yml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kubectl-test
labels:
app: kubectl-test
spec:
replicas: 3
strategy: {}
template:
metadata:
labels:
app: kubectl-test
spec:
containers:
- image: gcr.io/[my-name]/node-app:0.0.1
name: kubectl-test
ports:
- containerPort: 8080
resources: {}
restartPolicy: Always
status: {}
# service.yml
kind: Service
metadata:
name: kubectl-test-node-app
labels:
app: kubectl-test
spec:
ports:
- protocol: TCP
name: "8080"
port: 8080
targetPort: 8080
nodePort: 32000
selector:
app: kubectl-test
type: LoadBalancer
sessionAffinity: None
externalTrafficPolicy: Cluster
status:
loadBalancer: {}
kubectl create -f deployment.yml
kubectl create -f service.yml