天蓝色内部服务器错误时弹簧启动

时间:2018-04-19 12:14:26

标签: docker spring-boot kubernetes kubectl

我有一个非常简单的"你好" spring-boot应用程序

@RestController
public class HelloWorld {
    @RequestMapping("/")
    public String sayHello() {
        return "Hello Spring Boot!!";
    }
}

我打包了Dockerfile

FROM java:8
COPY ./springsimple-1.0-SNAPSHOT.jar /Users/a/Documents/dev/intellij/dockerImages/
WORKDIR /Users/a/Documents/dev/intellij/dockerImages/  
EXPOSE 8090
CMD ["java", "-jar", "springsimple-1.0-SNAPSHOT.jar"]

并拉入我的容器注册表并部署它

amhg$ kubectl run testproject --image acontainerregistry.azurecr.io/hellospring:v1 
    deployment.apps "testproject" created
amhg$ kubectl expose deployments testproject --port=5000 --type=LoadBalancer
    service "testproject" exposed

命令kubectl get pods

NAME                               READY     STATUS             RESTARTS   AGE
    testproject-bdf5b54d-gkk92         1/1       Running            0          41s

然而,当我尝试命令(开始服务于127.0.0.1:8001)时,我收到错误:

 amhg$ curl http://127.0.0.1:8001/api/v1/proxy/namespaces/default/pods/testproject-bdf5b54d-gkk92/
    Internal Server Error

缺少什么?

pod的描述是

amhg$ kubectl describe pod testproject-bdf5b54d-gkk92
Name:           testproject-bdf5b54d-gkk92
Namespace:      default
Node:           aks-nodepool1-39744669-0/10.240.0.4
Start Time:     Thu, 19 Apr 2018 13:13:20 +0200
Labels:         pod-template-hash=68916108
                run=testproject
Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"testproject-bdf5b54d","uid":"aa99808e-43c2-11e8-9537-0a58ac1f0f4...
Status:         Running
IP:             10.244.0.40
Controlled By:  ReplicaSet/testproject-bdf5b54d
Containers:
  testproject:
    Container ID:   docker://6ed3878fa4476a5d2e56f0ba70908742702709c7505c7b19989efc6ff658ea55
    Image:          acontainerregistry.azurecr.io/hellospring:v1
    Image ID:       docker-pullable://acontainerregistry.azurecr.io/azure-vote-front@sha256:e2af252d275c99b802e21b3b469c75b256d7812ee71d7582cd759bd4faf5a6ec
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Thu, 19 Apr 2018 13:13:21 +0200
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-vkpjm (ro)
Conditions:
  Type           Status
  Initialized    True 
  Ready          True 
  PodScheduled   True 
Volumes:
  default-token-vkpjm:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-vkpjm
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.alpha.kubernetes.io/notReady:NoExecute for 300s
                 node.alpha.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason                 Age   From                               Message
  ----    ------                 ----  ----                               -------
  Normal  Scheduled              57m   default-scheduler                  Successfully assigned testproject-bdf5b54d-gkk92 to aks-nodepool1-39744669-0
  Normal  SuccessfulMountVolume  57m   kubelet, aks-nodepool1-39744669-0  MountVolume.SetUp succeeded for volume "default-token-vkpjm"
  Normal  Pulled                 57m   kubelet, aks-nodepool1-39744669-0  Container image "acontainerregistry.azurecr.io/hellospring:v1" already present on machine
  Normal  Created                57m   kubelet, aks-nodepool1-39744669-0  Created container
  Normal  Started                57m   kubelet, aks-nodepool1-39744669-0  Started container

1 个答案:

答案 0 :(得分:1)

让我们从头开始:使用YAML配置文件与Kubernetes做任何事情总是更好。如果出现问题,它将帮助您进行调试,并在将来重复您的操作。

首先,使用命令创建窗格:

  

kubectl run testproject --image acontainerregistry.azurecr.io/hellospring:v1

YAML的样子:

apiVersion: v1
kind: Pod
metadata:
  name: test-app
spec:
  containers:
  - name: java-app
    image: acontainerregistry.azurecr.io/hellospring:v1
    ports:
    - containerPort: 8090

您可以将其作为命令应用:

kubectl apply -f ./pod.yaml

您获得与运行命令时相同的结果,但另外您有配置文件,可以在将来使用。

您正尝试使用以下命令公开您的广告连拍:

  

kubectl公开部署testproject --port = 5000 --type = LoadBalancer

YAML为您的服务看起来像:

apiVersion: v1
kind: Service
metadata:
  name: java-service
  labels:
    name: test-app
spec:
  type: LoadBalancer
  ports:
  - port: 5000
    targetPort: 8090
    name: http
  selector:
    name: test-app

做同样的事情,但使用YAML可以描述更多,并确保你不会错过任何东西。

你试图卷曲本地主机,但我不确定你对这个命令的期望是什么:

  

amhg $ curl http://127.0.0.1:8001/api/v1/proxy/namespaces/default/pods/testproject-bdf5b54d-gkk92/       内部服务器错误

创建服务后,请致电kubectl describe service $service_name,您可以在此处找到:

LoadBalancer Ingress:     XX.XX.XX.XX
Port:                     http  5000/TCP

您可以卷曲此地址并从您的申请中获得答案。

curl -v XX.XX.XX.XX:5000

别忘了在Azure防火墙上打开端口。