我正在尝试使用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
没有定义端点。我想这是问题所在?我如何建立终点?
答案 0 :(得分:4)
您的服务规范定位所有标签为&#34; app = kubectl-test-189010&#34;您的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/
答案 1 :(得分:2)
对于初学者,请确保您知道自己想要完成的任务。您说service
和deployment
,但您的文件是指服务和广告。
部署是一个对象,它将创建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
答案 2 :(得分:2)
我能够修复它,我不得不更改dokcerfile并做了一些调整,然后我的deployment.yaml文件也必须稍微更改一下,主要是在我的服务中添加正确的名称和端口号。 yaml,最后我的webpack配置已经改变了!
答案 3 :(得分:2)
正如@Leonid Talalaev所说,您的pod和服务中的选择器不同步。另外,查看kubectl get services
的输出,您的应用会在NodePort
31592上的群集外部公开。您是否尝试使用此端口访问该应用?
我还建议使用部署而不是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