1. 程式人生 > 其它 >部署應用到叢集中

部署應用到叢集中

一、部署應用需要的YAML檔案

<方法一> 直接命令執行

kubectl run testapp --image=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1

<方法二> 使用配置好的YMAL

Pod

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  # 定義容器,可以多個
  containers:
    - name: test-k8s # 容器名字
      image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 映象

二、Deployment 通過 label 關聯起來 Pods

Deployment(與Pod中的name同名)

apiVersion: apps/v1
kind: Deployment
metadata:
  # 部署名字
  name: test-k8s
spec:
  replicas: 2
  # 用來查詢關聯的 Pod,所有標籤都匹配才行
  selector:
    matchLabels:
      app: test-k8s
  # 定義 Pod 相關資料
  template:
    metadata:
      labels:
        app: test-k8s
    spec:
      # 定義容器,可以多個
      containers:
      - name: test-k8s # 容器名字
        image: ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v1 # 映象

三、部署應用

部署一個 nodejs web 應用,原始碼地址:Github

# 部署應用
kubectl apply -f app.yaml
# 檢視 deployment
kubectl get deployment
# 檢視 pod
kubectl get pod -o wide
# 檢視 pod 詳情
kubectl describe pod pod-name
# 檢視 log
kubectl logs pod-name
# 進入 Pod 容器終端, -c container-name 可以指定進入哪個容器。
kubectl exec -it pod-name -- bash
# 伸縮擴充套件副本
kubectl scale deployment test-k8s --replicas=5
# 把叢集內埠對映到節點
kubectl port-forward pod-name 8090:8080
# 檢視歷史
kubectl rollout history deployment test-k8s
# 回到上個版本
kubectl rollout undo deployment test-k8s
# 回到指定版本
kubectl rollout undo deployment test-k8s --to-revision=2
# 刪除部署
kubectl delete deployment test-k8s

Pod 報錯解決

如果你執行 kubectl describe pod/pod-name 發現 Events 中有下面這個錯誤

networkPlugin cni failed to set up pod "test-k8s-68bb74d654-mc6b9_default" network: open /run/flannel/subnet.env: no such file or directory

在每個節點建立檔案/run/flannel/subnet.env寫入以下內容,配置後等待一會就好了

FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

更多命令

# 檢視全部
kubectl get all
# 重新部署
kubectl rollout restart deployment test-k8s
# 命令修改映象,--record 表示把這個命令記錄到操作歷史中
kubectl set image deployment test-k8s test-k8s=ccr.ccs.tencentyun.com/k8s-tutorial/test-k8s:v2-with-error --record
# 暫停執行,暫停後,對 deployment 的修改不會立刻生效,恢復後才應用設定
kubectl rollout pause deployment test-k8s
# 恢復
kubectl rollout resume deployment test-k8s
# 輸出到檔案
kubectl get deployment test-k8s -o yaml >> app2.yaml
# 刪除全部資源
kubectl delete all --all

更多官網關於 Deployment 的介紹

將 Pod 指定到某個節點執行:nodeselector
限定 CPU、記憶體總量:文件

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disktype: ssd

工作負載分類

  • Deployment
    適合無狀態應用,所有pod等價,可替代
  • StatefulSet
    有狀態的應用,適合資料庫這種型別。
  • DaemonSet
    在每個節點上跑一個 Pod,可以用來做節點監控、節點日誌收集等
  • Job & CronJob
    Job 用來表達的是一次性的任務,而 CronJob 會根據其時間規劃反覆執行。

參考資料