2017-12-15 100 views
6

Tôi cố gắng để chạy ứng dụng của tôi sử dụng Kubernetes tôi đã tạo ra một triển khai từ tập tin gọi là deployment.yaml một dịch vụ từ các tập tin gọi là service.yamlKubernetes không thể nhìn thấy ứng dụng của tôi tại địa chỉ IP cho

Dưới đây là nội dung của 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 

Đây là tôi 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 

Khi tôi chạy lệnh kubectl get deployments, tôi có thể thấy:

NAME     DESIRED CURRENT UP-TO-DATE AVAILABLE AGE 
kubernetes-bootcamp 1   1   1   1   16m 

tôi có thể thấy dịch vụ của tôi bằng cách sử dụng kubectl get services và tôi có thể thấy:

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 

Khi tôi cố gắng đến thăm EXTERNAL-IP:8000 tôi không thể nhìn thấy tôi ứng dụng ở đó, tôi không nhận được bất kỳ lỗi nào, nhưng tôi không làm gì sai!

EDIT

tôi đã phải tạo triển khai sử dụng:

`kubectl run kubernetes-bootcamp --image=[image-name] --port=8080` 

nhưng không phải với lệnh này

`kubectl create -f deployment.yaml` 

Đây có phải là có liên quan đến cảng: 8000:31592/TCP?

kubectl get pods 
kubectl-test       1/1  Running 0   4h 
kubernetes-bootcamp-1654181842-czwqg 1/1  Running 0   3h 

EDIT

Chạy lệnh kubectl describe services kubectl-test-node-app lợi nhuận:

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 

Không có điểm cuối xác định. Tôi đoán đây là vấn đề? Làm thế nào tôi có thể xây dựng các điểm kết thúc?

+0

bạn đang sử dụng cổng máy chủ cũng như cổng nút đó là lạ. Nếu bạn có thể sử dụng Nodeport thì nó đảm bảo rằng ứng dụng của bạn được liên kết với cổng chính xác. –

+0

@SureshVishnoi Tôi mới làm quen với điều này, tôi phải làm theo hướng dẫn để xem những gì tôi cần làm, u có thể chỉ ra cho tôi những gì tôi cần làm không? –

Trả lời

3

Đặc tả dịch vụ của bạn nhắm mục tiêu tất cả các nhóm có nhãn "app = kubectl-test-189010" mà thông số kỹ thuật của nhóm của bạn không có.

Bạn cần cập nhật metadata pod, do đó nó sẽ phù hợp với chọn từ dịch vụ spec:

metadata: 
     name: kubectl-test 
     app: kubectl-test-189010 

Ngoài ra dịch vụ của bạn chấp nhận kết nối trên cổng 8000 và sau đó chuyển tiếp nó tới cổng 8000 (targetPort) trên pod. Nhưng pod nghe trên cổng 8080 (containerPort). Vì vậy, một trong số chúng nên được thay đổi để khớp với nhau - targetPort hoặc containerPort.

Bạn có thể đọc thêm về cấu hình dịch vụ trong Kubernetes đây: https://kubernetes.io/docs/concepts/services-networking/service/

+0

không ngừng hoạt động, –

+0

nếu bạn xem tệp triển khai, loại là POD, tôi có nên chia sẻ điều đó cho Triển khai không ?? –

1

Đối với người mới bắt đầu, chắc chắn rằng bạn biết những gì bạn muốn đạt được. Bạn nói servicedeployment, nhưng tệp của bạn đề cập đến Dịch vụ và Pod.

Triển khai là một đối tượng, sẽ tạo ReplicaSets và chia tỷ lệ chúng sao cho chúng kết quả với một nhóm Pod cụ thể được khởi chạy trong cụm. Lấy từ siêu dữ liệu triển khai, họ sẽ có một số nhãn. Những nhãn này là những gì Dịch vụ sẽ khớp với bộ chọn của nó so với (labels&selectors). Tôi cho rằng bạn muốn sử dụng Deployment, để tận dụng các công cụ như cập nhật các bản cập nhật (rất khó để cập nhật Pod trong nhiều trường hợp, và cuối cùng bạn sẽ xóa và tái tạo thủ công) hoặc mở rộng quy mô.

Với giả định rằng, bạn cần triển khai (hoặc Pod nếu bạn thực sự muốn đi "thủ công" chiều), có cái gì đó như folowing

metadata: 
    labels: 
    app: myappname 

Tiếp theo dịch vụ mà có một selector defined tương tự

selector: 
    app: myappname 

đó là đủ để bạn có thể có một thiết lập làm việc, và bạn sẽ thấy dịch vụ của bạn bây giờ sẽ có điểm cuối hoạt động (giả sử kén của bạn được đưa ra và trong Ready nhà nước.

Ngoài ra, nếu bạn muốn chứa phiên bản trong nhãn của mình, để bạn có thể có nghĩa là. nhắm mục tiêu phiên bản pod đặc biệt với một dịch vụ, hoặc có thể sử dụng nó cho một lý do khác như pod mối quan hệ, bạn nên chia nó thành hai nhãn như

metadata: 
    labels: 
    app: myappname 
    ver: v12 
1

tôi đã có thể sửa chữa nó, tôi đã phải thay đổi dokcerfile và thực hiện một số điều chỉnh, sau đó tập tin deploy.yaml của tôi cũng phải được thay đổi một chút, chủ yếu là thêm tên và số cổng chính xác và giống như trong service.yaml của tôi, và cuối cùng cấu hình webpack của tôi đã bị thay đổi!

2

Như Talalaev @Leonid đã đề cập, bộ chọn trong nhóm và dịch vụ của bạn không đồng bộ. Ngoài ra, xem đầu ra cho kubectl get services, ứng dụng của bạn được hiển thị bên ngoài cụm trên NodePort 31592. Bạn đã thử truy cập ứng dụng bằng cổng này chưa?

Tôi cũng khuyên bạn nên sử dụng Triển khai thay vì Pod. Sử dụng Deployment sẽ tự động tạo các ReplicaSet và Pod (s) theo yêu cầu khi bạn tạo Deployment với kubectl.

Tôi không chắc chắn mong muốn của bạn NodePort là gì, nhưng nếu bạn muốn hiển thị ứng dụng của mình bên ngoài cụm trên cổng 32000 (ví dụ), bạn có thể sử dụng các cấu hình bên dưới. Sau đó, bạn sẽ có thể truy cập vào ứng dụng của bạn với 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

Các vấn đề liên quan