Kubernetes Pod故障排除

时间:2020-01-18 08:00:46

标签: kubernetes

我在kubernetes容器中部署了我的容器,并且d容器和相关服务已启动并正在运行。

请找到下面的Pod和Pod的部署状态

root@jenkins-linux-vm:/home/admin/kubernetes# kubectl get pods
NAME                                  READY   STATUS    RESTARTS   AGE
angular-deployment-5d5fbf967c-zvzvl   1/1     Running   0          70m

root@jenkins-linux-vm:/home/admin/kubernetes# kubectl get svc
NAME              TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
angular-service   NodePort   10.96.16.68    <none>        80:31000/TCP     79m

root@jenkins-linux-vm:/home/admin/kubernetes# kubectl get deployment
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
angular-deployment   1/1     1            1           70m

请找到下面的curl访问权限

root@jenkins-linux-vm:/home/admin/kubernetes# kubectl exec -it angular-deployment-5d5fbf967c-zvzvl curl 10.0.0.1:31000
curl: (7) Failed to connect to 10.0.0.1 port 31000: Connection refused
command terminated with exit code 7

即使我无法像下面那样在浏览器中访问应用程序服务,也是如此。

https://10.0.0.1:31000
apiVersion: apps/v1
kind: Deployment 
metadata: 
  name: angular-deployment 
spec: 
  selector: 
    matchLabels: 
      app: frontend-app 
  replicas: 1
  template: 
    metadata: 
      labels: 
        app: frontend-app 
    spec: 
      containers: 
      - name: frontend-app 
        image: ${IMAGE_NAME}:${IMAGE_TAG} 
        ports: 
        - containerPort: 80 
---
kind: Service 
apiVersion: v1 
metadata: 
  name: angular-service 
spec: 
  selector: 
    app: frontend-app 
  ports: 
  - protocol: TCP 
    port: 80 
    targetPort: 80 
    nodePort: 31000 
  type: NodePort
root@jenkins-linux-vm:/home/admin# kubectl describe pod angular-deployment-556c47f666-9d2x4
Name:         angular-deployment-556c47f666-9d2x4
Namespace:    pre-release
Priority:     0
Node:         poc-worker2/10.0.0.2
Start Time:   Sat, 18 Jan 2020 08:47:35 +0000
Labels:       app=frontend-app
              pod-template-hash=556c47f666
Annotations:  <none>
Status:       Running
IP:           10.32.0.8
IPs:
  IP:           10.32.0.8
Controlled By:  ReplicaSet/angular-deployment-556c47f666
Containers:
  frontend-app:
    Container ID:   docker://43fea22e4c1d49e0c94fc8aca3a4b41df44b5f91f45ea29ede263c5a6bcf6503
    Image:          frontend-app:future-master-fix-f2d2a8bd
    Image ID:       docker://sha256:0099587db89de9ef999a7d1f087d4781e73c491b17e89392e92b08d2f935ad27
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sat, 18 Jan 2020 08:47:40 +0000
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-r67p7 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-r67p7:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-r67p7
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age   From                       Message
  ----    ------     ----  ----                       -------
  Normal  Scheduled  21s   default-scheduler          Successfully assigned pre-release/angular-deployment-556c47f666-9d2x4 to poc-worker2
  Normal  Pulled     17s   kubelet, poc-worker2  Container image "frontend-app:future-master-fix-f2d2a8bd" already present on machine
  Normal  Created    16s   kubelet, poc-worker2  Created container frontend-app
  Normal  Started    16s   kubelet, poc-worker2  Started container frontend-app

请找到以下是部署的svc

root@jenkins-linux-vm:/home/admin# kubectl describe svc angular-service
Name:                     angular-service
Namespace:                pre-release
Labels:                   <none>
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"angular-service","namespace":"pre-release"},"spec":{"ports":[{"no...
Selector:                 app=frontend-app
Type:                     NodePort
IP:                       10.96.227.143
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31000/TCP
Endpoints:                10.32.0.4:80,10.32.0.8:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

请在此处找到docker文件

FROM node:12.2.0

# set working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install and cache app dependencies
COPY package.json /app/package.json

# add app
COPY . /app

# start app
CMD ng serve --host 0.0.0.0

能否请您帮我解决此问题

2 个答案:

答案 0 :(得分:1)

在这里我可以看到问题在于您的Angular Dockerfile,您正在使用ng serve,如果您在package.json中看到您的依赖项,您将看到"@angular/cli": "*"以便将其放入您的Docker中添加RUN npm install,这会将所有依赖项安装在docker容器中,您可以执行ng serve,但是ng serve是用于本地开发的,这不是一个好方法。

要识别此类问题,建议您在本地计算机上运行类似的内容,以便在将Docker容器部署到k8s集群之前,先确定其Docker容器是否工作正常,因为您知道kubernetes是一个非常大的宇宙需要花费一些时间来确定实际问题。

可以解决这个问题(我可以简单地将一个命令添加到您的dockerfile中并添加我的答案,但是我不建议这种方法。因此添加完整的答案看起来不错),当您部署一些前端时相关应用程序,您的docker映像需要具有serving功能,即在构建AngularReact应用程序之后,index.html页面是最终产品。

有几种方法可以完成此操作。并且有几本教程对此进行了解释,我建议您这样做,您的dockerfile应该看起来像这样。添加评论内容。

#Stage0: builder, based on Node alpine imagine to build and compile your angular code
FROM node:10-alpine as builder 

WORKDIR /app 

COPY package*.json /app/

# This is one thing you forgot in your dockerfile, if you add this it might work
RUN npm install 

COPY . . 

# This is normal build, it does ng build
RUN npm run build

#Stage 1, based on Nginx imagine, to have only the compile app inside nginx folders to serve
FROM nginx:1.15

COPY --from=builder /app/dist/ /usr/share/nginx/html

# This one copies the local nginx.conf file as default.conf for nginx to let it serve
COPY ./nginx.conf /etc/nginx/conf.d/default.conf

请确保您的代码中包含nginx.conf文件,文件级别与package.json相同

server {
  listen 80;

  sendfile on;

  default_type application/octet-stream;


  gzip on;
  gzip_http_version 1.1;
  gzip_disable      "MSIE [1-6]\.";
  gzip_min_length   1100;
  gzip_vary         on;
  gzip_proxied      expired no-cache no-store private auth;
  gzip_types        text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  gzip_comp_level   9;

  root /usr/share/nginx/html;

  location / {
     #try_files $uri $uri/ /index.html =404;
    expires -1d;
    alias /usr/share/nginx/html/;
    try_files $uri$args $uri$args/ /index.html =404;
    location ~* \.(?:ico|css|js|gif|jpe?g|png|svg|woff|woff2|ttf|eot)$ {
            add_header Access-Control-Allow-Origin *;
    }
  }
}

在将docker run部署到群集上之前,请确保在本地计算机上运行。

希望这会有所帮助。

答案 1 :(得分:0)

如果您通过nodeip:nodeport访问Pod,则仅当您使用浏览器从集群外部访问Pod时才有效。

此处是如何expose an application via NodePort的指南。在这种情况下,您的kubernetes集群的节点需要可访问,即应该具有公共ip。

您应该使用集群ip从集群内访问集群,即通过另一个集群的exec来访问集群,如以下命令所示。

kubectl exec -it angular-deployment-5d5fbf967c-zvzvl curl 10.96.16.68:80

我觉得您的docker容器未在端口80上监听。

相关问题