1. 程式人生 > 其它 >kubernetes實踐錄 - 使用Baget部署一個私有Nuget倉庫

kubernetes實踐錄 - 使用Baget部署一個私有Nuget倉庫

Reference:

目錄

書接上回 kubernetes實踐錄 - 在ubuntu上搭建k8s叢集. 本回將在上次安裝好的kubernetes叢集上部署一個Baget應用. 其實就是通過部署Baget來學習下kubernetes裡面的一些基本的概念, 包括Node, Pod Deployment Service Ingress.

本文只是記錄自己實踐過程, 若有錯誤或不當之處, 敬請指正或討論.

Node

節點(Node)是kubernetes叢集中的一臺物理伺服器或虛擬機器, 節點大致可以分為主節點(master)和其他節點. 主節點主要負責提供一系列管理介面方便對叢集進行管理. 而其他節點一般會被排程執行工作負載, 通常來說pod就是跑在這些其他節點上的. 當然你也可以讓主節點執行指定的pod, 這是可以通過配置實現的, 通常本地開發時可能會這麼做, 此時主節點就相當於被汙染了(tainted).

Pod和Deployment

如果我們要在kubernetes中執行我們自己的應用, 那麼首先我們就需要構建pod. 一個pod中可以包含一個或多個(通常是一個)容器(container).

pod是kubernetes中最小的排程單元, 當pod啟動或停止時, pod中的容器會跟著一起啟動或停止.

pod這個名字的由來: 大家應該都知道, Docker的圖示上是一隻鯨魚, pod之意其實就是一群鯨魚.

那Deployment和Pod有什麼關係呢? 通過Deployment我們可以構建出一個Pod, 配置pod中的容器和容器使用的硬體資源等.

比如我們要部署一個Baget應用, 那麼我們需要先建立baget-deployment.yaml檔案, 這個檔案中定義了一個Deployment資源, 然後執行kubectl apply -f baget-deployment.yaml

, kubernetes就會幫我們建立好pod了, 可以通過kubectl get pods --all-namespaces檢視當前kubernetes叢集中正在執行的pod.

點選檢視 baget-deployment.yaml 檔案
apiVersion: apps/v1
kind: Deployment
metadata:
  name: baget
  namespace: baget
  labels:
    app: baget
spec:
  selector:
    matchLabels:
      app: baget
  replicas: 1
  strategy:
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 2
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: baget
    spec:
      containers:
      - name: baget
        image: loicsharma/baget:latest
        resources:
          requests:
            cpu: 100m
            memory: 100Mi
          limits:
            cpu: 100m
            memory: 100Mi
        livenessProbe:
          httpGet:
            path: /v3/index.json
            port: 80
          initialDelaySeconds: 30
          timeoutSeconds: 30
          successThreshold: 1
          failureThreshold: 3
          periodSeconds: 30
        envFrom:
          - configMapRef:
              name: baget-config
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - name: baget-data
          mountPath: /var/baget
      volumes:
        - name: baget-data
          hostPath:
            path: /laplus/data/baget
      restartPolicy: Always

這是一個yaml格式的配置檔案, 頂層包括了apiVersion kind metadata spec這幾個物件. 幾乎每個kubernetes配置檔案都會有apiVersion kind metadata這幾個東西;
apiVersion用來用來說明這個配置檔案適用的kubernetes api;

apiVersion: apps/v1

kind表示這個資源的型別, 這裡是Deployment;

kind: Deployment

metadata表示的是資源的元資料, 通常有namelabels這兩個屬性, 我這裡還多定義了一個namespace.

metadata:
  name: baget
  namespace: baget
  labels:
    app: baget

重點看下.spec.template.spec這段

spec:
    containers:
    - name: baget
      image: loicsharma/baget:latest
      resources:
          requests:
          cpu: 100m
          memory: 100Mi
          limits:
          cpu: 100m
          memory: 100Mi
      livenessProbe:
          httpGet:
          path: /v3/index.json
          port: 80
          initialDelaySeconds: 30
          timeoutSeconds: 30
          successThreshold: 1
          failureThreshold: 3
          periodSeconds: 30
      envFrom:
          - configMapRef:
              name: baget-config
      ports:
      - containerPort: 80
          protocol: TCP
      volumeMounts:
      - name: baget-data
          mountPath: /var/baget
    volumes:
    - name: baget-data
        hostPath:
        path: /laplus/data/baget

這段中我們定義了容器的映象, 容器可以排程的硬體資源的限制, 容器的健康檢查, 環境變數, 磁碟掛載等內容.

最後執行kubectl apply -f baget-deployment.yaml讓kubernetes建立我們定義的資源, 執行 kubectl get pods -n baget可以列出baget名稱空間下的所有pod

NAME                     READY   STATUS    RESTARTS   AGE
baget-5576d6fc79-n8k2s   1/1     Running   0          20h

用Service在叢集內部轉發請求到指定的pod

有了pod之後, 經過容器化的應用就可以在pod中運行了. 下面我們要通過Service在叢集內部暴露pod中的應用.

一個Service相當於叢集內部的負載均衡器, 建立Service後, kubernetes中的其他pod就可以通過http://baget/v3/index.json訪問到剛剛建立的叫Baget的pod了.

apiVersion: v1
kind: Service
metadata:
  name: baget
  namespace: baget
  labels: 
    app: baget
spec:
  type: ClusterIP
  selector:
    app: baget
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP

上面的Service配置清單中的.spec.type指明瞭服務的型別, 除了這個用的ClusterIP, 另外還有LoadBalancer,NodePort等; 如果用NodePort的話, 那麼可以直接將應用暴露到叢集外, 也就是說可以直接使用宿主機ip + nodePort埠訪問到應用了, 比如我這裡就可以用http://192.168.124.66:<NodePort-Port>/v3/index.json訪問到部署的Baget應用.

用Ingress負載均衡外部的請求

Ingress可以理解為kubernetes中的外部負載均衡器和一個反向代理伺服器. 它通常被部署在叢集的邊緣節點上, 負責處理來自kubernetes叢集外部的請求, 把請求轉發給指定的Service等服務.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: baget
  namespace: baget
  annotations: 
    kubernetes.io/ingress.class: nginx
spec:
  tls:
  - hosts:
    - "baget.inner.laplus.com"
  rules:
  - host: "baget.inner.laplus.com"
    http:
      paths:
      - path: "/"
        pathType: Prefix
        backend:
          service:
            name: baget
            port:
              number: 80

執行 kubectl apply -f baget-ingress.yaml 部署上面的配置清單後, 本地解析baget.inner.laplus.com這個域名到安裝了nginx-ingress的邊緣伺服器ip

192.168.124.66 baget.inner.laplus.com

然後用瀏覽器訪問https://baget.inner.laplus.com就可以訪問到Baget的首頁啦.

小結

理解了Pod Development Service Ingress的相關概念後, 要在kubernetes上部署一個容器化的web應用其實還是挺容易的.

本文來自部落格園,作者:Laggage,轉載請註明原文連結:https://www.cnblogs.com/laggage/p/15490880.html