spring 在 azure 内部服务器错误上启动

spring boot on azure Internal Server Error

我有一个非常简单的 "Hello" 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

然而,当我尝试命令(Starting to serve on 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

少了什么?

广告连播的描述是

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

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

首先,您使用命令创建 pod:

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

您得到的结果与 while 运行 您的命令相同,但您还拥有可在将来使用的配置文件。

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

kubectl expose deployments 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/ Internal Server Error

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

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

您可以 curl 这个地址并从您的应用程序中收到答案。

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

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