二進制部署K8s集羣第17節pod控制器

1、pod控制器

  • controller用於控制pod

控制器主要分爲:node

  • ReplicationController(至關於ReplicaSet的老版本,如今建議使用
  • Deployments加ReplicaSet替代RC)
  • ReplicaSet 副本集,控制pod擴容,裁減
  • Deployments 控制pod升級,回退
  • StatefulSets 部署有狀態的pod應用
  • DaemonSet 運行在全部集羣節點(包括master), 好比使用
  • filebeat,node_exporter
  • Jobs 一次性
  • Cronjob 週期性

1.1 Deployment&ReplicaSet

1.1.1 Replicaset控制器的功能:

  • 支持新的基於集合的selector(之前的rc裏沒有這種功能)
  • 經過改變Pod副本數量實現Pod的擴容和縮容

1.1.2 Deployment控制器的功能:

  • Deployment集成了上線部署、滾動升級、建立副本、回滾等功能
  • Deployment裏包含並使用了ReplicaSet

1.1.3 YAML文件建立deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx2 # deployment名
spec:
  replicas: 1 # 副本集,deployment裏使用了
  selector:
    matchLabels:
      app: nginx # 匹配的pod標籤,表示deployment和rs控制器控制帶有此標籤的pod
 template: # 表明pod的配置模板
   metadata:
     labels:
       app: nginx # pod的標籤
  spec:
    containers: # 如下爲pod裏的容器定義
    - name: nginx
      image: nginx:1.15-alpine
      imagePullPolicy: IfNotPresent
      ports:
      - containerPort: 80
kubectl apply -f nginx2-deployment.yml
kubectl get deployment
kubectl get pods

1.2 DaemonSet控制器

  • DaemonSet可以讓全部(或者特定)的節點運行同一個pod
  • 當節點加入到K8S集羣中,pod會被(DaemonSet)調度到該節點上運
    行,當節點從K8S集羣中被移除,被DaemonSet調度的pod會被移除
  • 若是刪除DaemonSet,全部跟這個DaemonSet相關的pods都會被刪
    除。
  • 若是一個DaemonSet的Pod被殺死、中止、或者崩潰,那麼
    DaemonSet將會從新建立一個新的副本在這臺計算節點上
  • DaemonSet通常應用於日誌收集、監控採集、分佈式存儲守護進程等
vim nginx-daemonset.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-daemonset
spec:
  selector:
    matchLabels:
      name: nginx-test
 template:
   metadata:
     labels:
       name: nginx-test
   spec:
     tolerations: # tolerations表明容忍
     - key: node-role.kubernetes.io/master  # 能容忍的污點key
       effect: NoSchedule  # kubectl explain pod.spec.tolerations查看(能容忍的污點effect)
     containers:
     - name: nginx
       image: nginx:1.15-alpine
       imagePullPolicy: IfNotPresent
       resources:   # resources資源限制是爲了防止master節點的資源被佔太多(根據實際狀況配置)
       limits:
         memory: 100Mi
       requests:
         memory: 100Mi

1.3 Job控制器

  • Job負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束

1.3.1 建立一次性job

vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi # job名
spec:
  template:
    metadata:
      name: pi # pod名
  spec:
    containers:
    - name: pi # 容器名
      image: perl # 此鏡像有800多M,可提早導入到全部節點,也可能指定導入到某一節點而後指定調度到此節點
      imagePullPolicy: IfNotPresent
      command: ["perl",  "-Mbignum=bpi", "-wle", "printbpi(2000)"]
    restartPolicy: Never # 執行完後再也不重啓
kubectl apply -f job.yml
kubectl get jobs
kubectl get pods
kubectl logs pi-tjq9b

1.3.2 建立固定次數job

vim job2.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox-job
spec:
  completions: 10 # 執行job的次數
  parallelism: 1 # 執行job的併發數
 template:
   metadata:
     name: busybox-job-pod
  spec:
    containers:
    - name: busybox
      image: busybox
      imagePullPolicy: IfNotPresent
      command: ["echo", "hello"]
    restartPolicy: Never
kubectl apply -f job2.yml
kubectl get job

1.4 crontab控制器

  • 相似於Linux系統的crontab,在指定的時間週期運行相關的任務
vim cronjob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob1
spec:
  schedule: "* * * * *"         # 分時日月周
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo hello kubernetes
              imagePullPolicy: IfNotPresent
              restartPolicy: OnFailure
kubectl apply -f cronjob.yml
kubectl get cronjob
kubectl get pod

1.5 建立service

cat > nginx_service.yml <<eof
apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: default
spec:
  clusterIP: 10.2.11.22 # 這個ip能夠不指定,讓它自動分配,須要與集羣分配的網絡對應
  type: ClusterIP # ClusterIP類型,也是默認類型
  ports: # 指定service 端口及容器端口
  - port: 80 # service ip中的端口
    protocol: TCP
    targetPort: 80 # pod中的端口
  selector: # 指定後端pod標籤(不是deployment的標籤)
    app: nginx # 可經過kubectl get pod -l  app=nginx查看哪些pod在使用此標籤

1.6 pod版本升級(滾動更新)

# 升級前查看版本
kubectl describe pod nginx1-7d9b8757cf-czcz4 |grep Image: # 升級前版本
  Image:      nginx:1.15-alpine
kubectl exec nginx1-7d9b8757cf-czcz4 --nginx -v

# 正式升級
kubectl set image deployment nginx1 nginx1=nginx:1.16-alpine --record  # 升級爲1.16版
kubectl set image -h # 查看幫助
kubectl rollout status deployment nginx1 # 滾努更新

# 查看版本
kubectl get pods
kubectl describe pod nginx1-7ffc8cb4fb-tn4ls |grep Image:
kubectl exec nginx1-7ffc8cb4fb-tn4ls --nginx -v

deployment nginx1 表明名爲nginx1的deployment
nginx1=nginx:1.16-alpine 前面的nginx1爲容器名
--record 表示會記錄nginx

1.7 pod版本回滾

kubectl rollout history deployment nginx1 # 查看版本歷史信息
kubectl rollout history deployment nginx1--revision=1 # 定義要回退的版本爲1
kubectl rollout undo deployment nginx1 --to-revision=1 # 開始回退
deployment.extensions/nginx1 rolled back
kubectl rollout history deployment nginx1 deployment.extensions/nginx1 # 查看有沒回退
kubectl get pods
kubectl describe pod nginx1-7d9b8757cf-m7rt4 |grep Image:
kubectl exec nginx1-7d9b8757cf-m7rt4 --nginx -v

1.8 副本擴容

kubectl scale -h # 查看幫助
kubectl scale deployment nginx1 --replicas=10 -n kube-public # 擴容爲10個副本,改小字則副本縮減
kubectl get pods -o wide
相關文章
相關標籤/搜索