kubernetes(八) kubernetes的使用

kubernetes的使用

kubectl命令行管理工具

參考命令:前端

kubernetes(八) kubernetes的使用

kubectl經常使用的命令行管理命令

  • 部署應用
kubectl create deployment web --image=nginx:1.14
kubectl get deploy,pods
  • 暴露應用
kubectl expose deployment web --port=80 --type=NodePort --targer-port=80 --name=web
kubectl get service
  • 應用升級
kubectl set image deployment/web nginx=nginx:1.16
kubectl rollout status deployment/web
  • 應用回滾
kubectl rollout undo deployment/web    #回滾到上一個版本
kubectl rollout history deploy/web     #查看版本(版本號遞增,最新的也就是版本號最大的)
kubectl rollout undo deploy/web --to-revision=1  #指定版本回滾
  • 擴縮容
kubectl scale deployment web --replicas=4   #擴容至4個pod
kubectl scale deployment web --replicas=1   #縮容至1個pod

資源編排

kubeadm init工做:

一、[preflight] 檢查環境是否知足條件
二、[kubelet-start] 啓動kubelet
三、[certs] /etc/kubernetes/pki 生成apiserver和etcd兩套證書
四、[kubeconfig] 鏈接apiserver的配置文件
五、[control-plane] 靜態Pod /etc/kubernetes/manifests
六、[etcd] 靜態pod啓動etcd
七、[upload-config] 將kubeadm配置存放到kube-system configmap
八、[kubelet] 將kkubelet配置存放到kube-system configmap
九、[mark-control-plane] node-role.kubernetes.io/master='' 說明master節點不調度pod
十、[bootstrap-token] 爲kubelet自動頒發證書機制
十一、安裝插件 CoreDNS kube-proxy









java

k8s組成回顧

  • master
    • apiserver: 爲api對象驗證並配置數據,包括pods,services,APIserver提供Restful操做和到集羣共享狀態的前端,全部其它組件經過apiserver進行交互
    • kube-scheduler: 具備豐富的資源策略,可以感知拓撲變化,支持特定負載的功能組件,它對集羣的可用性,性能表現以及容量都影響巨大,scheduler須要考慮獨立的和集體的資源需求,服務質量需求,硬件、軟件,策略限制,親和與反親和規範,數據位置嗎內部負載接口,截止時間等等,若有特定的負載需求能夠經過apiserver暴露出來
    • kube-controllermanager:做爲集羣內部的控制中心,負責集羣內部的Node,Pod副本,服務端點,命名空間,服務帳號,資源配額的管理,當某個Node意外宕機時,controller-manager會及時發現並執行自動修復,確保集羣始終處於預期的工做狀態
  • Node
    • kube-proxy: 維護node節點上的網絡規則,實現用戶訪問請求的轉發,其實就是轉發給service,須要管理員指定service和NodePort的對應關係
    • kubelet: kubelet 是運行在每一個節點上的主要的「節點代理」,它按照 PodSpec 中的描述工做。 PodSpec 是用來描述一個 pod 的 YAML 或者 JSON 對象。kubelet 經過各類機制(主要經過 apiserver )獲取一組 PodSpec 並保證在這些 PodSpec 中描述的容器健康運行。kubelet 無論理不是由 Kubernetes 建立的容器。
  • Etcd: 存儲全部集羣數據

yaml文件格式說明

  • 聲明式API: 資源清單
  • 定義資源控制器,以便維護資源建立的對象
  • 資源比較多,文檔查找方法
# dry-run獲取
kubectl create deployment nginx --image=nginx:1.14 -o yaml --dry-run=client > my-deploy.yml
# 命令行導出
kubectl get deploy/web  -o yaml --export > my-deploy.yml
# 忘記字段
kubectl explain pod.spec

深刻理解POD資源對象

kubectl的命令可分爲三類

  • 陳述式命令: 用到的run,expose,delete和get等命令,他們直接操做於k8s系統上的活動對象,簡單易用;但不支持代碼服用,修改以及日誌審計等功能,這些功能的實現要經過依賴於資源配置文件中,這些文件稱爲資源清單
  • 陳述式對象配置
  • 聲明式對象配置: apply完成增和改的操做 [推薦使用]

POD基本概念

  • k8s最小部署單元
  • pod是名稱空間級別的資源(namespace)
  • 能夠是一組容器的組合
  • 一個POD中的容器共享網絡名稱空間
  • Pod是短暫的

建立pod的方式

  • 直接命令行建立
  • 使用pod控制器建立,例如(deployment,daemonset,statefulset)
  • service也能建立

pod存在的意義

  • pod爲親密性應用而存在
  • 親密性應用場景
    • 兩個應用之間發生文件交互
    • 應用之間須要經過127.0.0.1或者socket通訊
    • 兩個應用之間須要發生頻繁的調用

pod實現機制與設計模式

  • 共享網絡
  • 共享存儲

kubernetes(八) kubernetes的使用

$ vim demo1.yml
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: prod
spec:
  containers:
  - name: write
    image: centos:7
    command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
    volumeMounts:
    - name: data
      mountPath: /data
  - name: read
    image: centos:7
    command: ["bash","-c","tail -f /data/hello"]
    volumeMounts:
    - name: data
      mountPath: /data
  volumes:
  - name: data
    emptyDir: {}

$ kubectl create ns prod
$ kubectl apply -f demo1.yml 
$ kubectl get pod -n prod
$ kubectl exec -it my-pod -n prod bash

鏡像拉取策略

  • imagePullPolicy
    • ifNotPresent
    • Always
    • Never
$ vim demo2.yml
apiVersion: v1
kind: Pod
metadata:
  name: foo
  namespace: prod
spec:
  containers:
  - name: foo
    image: janedoe/awesomeapp:v1
    imagePullPolicy: IfNotPresent

$ kubectl apply -f demo2.yml
$ kubectl describe pod foo -n prod
$ kubectl get pod foo -n prod

資源限制

官方文檔:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/node

Pod和Container的資源請求和限制:
• spec.containers[].resources.limits.cpu
• spec.containers[].resources.limits.memory
• spec.containers[].resources.requests.cpu
• spec.containers[].resources.requests.memory



mysql

  • 資源限制類型
    • limits: 最大值
    • requests: 最小值
$ vim demo3.yml
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "password"
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: wp
    image: wordpress
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

$ kubectl apply -f demo3.yml

重啓策略

  • restartPolicy:
    • Always: 默認策略,當容器退出後老是重啓容器
    • OnFailure
    • Never
kubectl explain pod.spec.restartPolicy
$ vim demo4.yml
apiVersion: v1
kind: Pod
metadata:
  name: demo
  namespace: prod
spec:
  containers:
  - name: demo1
    image: janedoe/awesomeapp:v1
  restartPolicy: Always
$ kubectl get pod -n prod -w   #查看重啓狀態

健康檢查(probe)

  • 有兩種健康檢查方式
    • livenessProbe: 存活檢測
    • readinessProbe: 就緒檢測
  • probe支持如下三種檢查方法
    • httpGet
    • exec
    • tcpSocket
$ vim pod_healthy.yml 
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: healthy-check
  namespace: prod
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy;sleep 30;rm -fr /tmp/healthy;sleep 60
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

資源調度

  • pod建立流程

kubernetes(八) kubernetes的使用

沒有涉及到控制器,因此就沒有涉及到kube-controller-managernginx

調度策略-影響Pod調度的重要屬性

schedulerName: default-secheduler
nodeName: "k8s-node1"
nodeSelector: {}
affinity: {}
tolerations: {}



web

$ vim pod_sheduler.yml
apiVersion: v1
kind: Pod
metadata:
  name: web
  namespace: prod
spec:
  containers:
  - name: java-demo
    image: lizhenliang/java-demo
    imagePullPolicy: IfNotPresent
    livenessProbe:
      initialDelaySeconds: 30
      periodSeconds: 20
      tcpSocket:
        port: 8080
    resources: {}
  restartPolicy: Always
  schedulerName: default-secheduler 
  nodeName: "k8s-node1"
  nodeSelector: {}
  affinity: {}
  tolerations: {}

$ kubectl apply -f pod_sheduler.yml
$ kubectl get pod -n prod -o wide   #能夠發現pod被調度到k8s-node1

資源限制對Pod調度的影響

  • 根據request的值查找有足夠資源的node來調度此pod
$ vim pod_schedule_resource.yml
apiVersion: v1
kind: Pod
metadata:
  name: mysql
  namespace: prod
spec:
  containers:
  - name: mysql
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "123456"
    resources:
      requests:
        cpu: "250m"
        memory: "64Mi"
      limits:
        cpu: "500m"
        memory: "128Mi"
$ kubectl apply -f pod_schedule_resource.yml

nodeSelector & nodeAffinity

  • nodeSelector:用於將Pod調度到指定Label的Node上
# 給節點打標籤
$ kubectl label nodes k8s-node2 disktype=ssd
# 讓pod調度到ssd節點
$  vim pod_ssd.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  namespace: prod
spec:
  nodeSelector:
    disktype: ssd
  containers:
  - name: nginx
    image: nginx:1.14-alpine

$ kubectl apply -f pod_ssd.yml    
$ kubectl get pod -n prod -o wide   #pod被調度到k8s-node2
  • nodeAffinity:節點親和相似於nodeSelector,能夠根據節點上的標籤來約束Pod能夠調度到哪些節點。sql

    • 相比nodeSelector:
    • 匹配有更多的邏輯組合,不僅是字符串的徹底相等
    • 調度分爲軟策略和硬策略,而不是硬性要求
      • 硬(required):必須知足
      • 軟(preferred):嘗試知足,但不保證
    • 操做符:In、NotIn、Exists、DoesNotExist、Gt、Lt
    $ vim pod_affinity.yml
    apiVersion: v1
    kind: Pod
    metadata:
    name: node-affinity
    namespace: prod
    spec:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: gpu
              operator: In
              values:
              - nvida-telsla
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
            - key: group
              operator: In
              values:
              - ai
    
    containers:
    - name: web
      image: nginx:1.14-alpine
    
    $ kubectl apply -f pod_affinity.yml

    taint(污點)

    Taints:避免Pod調度到特定Node上bootstrap

    • 應用場景:
    • 專用節點
    • 配備了特殊硬件的節點
    • 基於Taint的驅逐
# 節點污點的設置
$ kubectl taint node k8s-master item-names=aard:NoSchedule

kubectl taint node [node] key=value:effectvim

其中effect可取值:centos

• NoSchedule :必定不能被調度。

• PreferNoSchedule:儘可能不要調度。

• NoExecute:不只不會調度,還會驅逐Node上已有的Pod。

# 查看node污點
$ kubectl describe node k8s-master
#去掉污點
$kubectl taint node k8s-master item-name:NoSchedule-
污點容忍
# 首先選一個節點設置污點
$ kubectl taint node k8s-node2 DiskType=nossd:NoSchedule
$ vim pod_tolerate.yml
apiVersion: v1
kind: Pod
metadata:
  name: tolerate
  namespace: prod
spec:
  containers:
  - name: pod-taint
    image: busybox:latest
  tolerations:
  - key: "DiskType"
    operator: "Equal"
    value: "nossd"
    effect: "NoSchedule"
  schedulerName: default-secheduler
  nodeName: "k8s-node2"
$ kubectl apply -f pod_tolerate.yml   
$ kubectl get pod -n prod -o wide   #發現會被調度到k8s-node2

故障排查

kubectl describe TYPE/NAME
kubectl logs TYPE/NAME [-c CONTAINER]
kubectl exec POD [-c CONTAINER] -- COMMAND [args...]
相關文章
相關標籤/搜索