1. 程式人生 > >《kubernetes權威指南》讀書筆記

《kubernetes權威指南》讀書筆記

本文只是隨便記錄k8s一些常用命令列、一些配置、一些基本概念。後期再進行整理

【概念】

1、為啥會出現pasue容器?

1)用pasue容器的存活狀態標誌整個容器組的狀態

2)一個pod裡的多個業務容器可共享Pause容器的IP、共享Pause容器掛接的Volume。

     k8s為每個pod都分配了一個唯一的IP地址,稱之為PodIp。一個Pod裡的多個容器共享PodIp地址。

因此在k8s中,一個Pod裡的容器與另外主機上的Pod容器能夠直接通訊(通常採用虛擬二層技術,例如Flannel、ovs)

2、三種IP

NodeIP: Node節點的Ip地址。物理網絡卡上的IP。

Pod Ip:  Pod的Ip地址。docker engine根據docker0網橋的ip地址段進行劃分的。

ClusterIp: Service的Ip地址,屬於kubernetes管理的,無法ping通。

3、三種Port

containerPort:容器暴露的埠。也就是說可以通過該容器埠,訪問對應的服務。

targetPort: 當service中指定的埠和pod中暴露出的埠不一致時,需要用targetPort指定出pod暴露出的埠

nodePort:  出現在Service中,指定外部機器可通過該物理埠,訪問服務。其中type必須是NodePort

舉例說明:

apiVersion: v1

kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  clusterIP: 10.254.202.240
  ports:
    - port: 8085            // service抽象出來的埠
      targetPort: 8080   // pod容器短埠
      nodePort: 30001  //物理埠

  selector:

    app: myweb

訪問方式:

1)仍然通過host主機Ip:30001訪問

2)可以在master節點通過curl clusterIP:8085訪問,如果有代理則需要設定noproxy引數例如

      curl http://10.254.202.240:8080 -v --noproxy 10.254.202.240

3、kubernetes網路模型:Ip-per-Pod。以pod作為最小單位進行ip劃分。也就是說Pod裡面的所有容器對外表現都是同一個ip地址。pod裡面共享namespace空間。

     優點:共享資源,效能會好一些。相當於一個虛擬機器多個程序,可以使用localhost通訊

     缺點:隔離性被破壞,會引入不安全因素

【命令】

kubectl get pods  -- 獲取pod

kubectl get rc   -- 獲取rc

kubectl get svc  -- 獲取服務

 kubectl get all --all-namespaces  -- 獲取所有內容(前三種綜合)

kubectl exec myweb-zkm6k -it /bin/bash  進入pod(適合一個pod中只有一個容器)

kubectl exec -it <Pod名稱> -c <容器名稱>  /bin/bash  進入pod中指定容器

kubectl create -f 檔案.yaml   -- 用於建立各類服務

kubectl delete -f 檔案.yaml   -- 用於刪除各類服務

kubectl describe node node名稱  -- 用於檢視node相關資訊

kubectl scale rc redis-slave --replicas = 3  ---用於擴充套件或者收縮pod 設定副本數量

kubectl get endpoints 

kubectl get namespaces

kubectl expose rc webapp   --- 根據rc(webapp)生成其service

echo "source <(kubectl completion bash)" >> ~/.bashrc  --- 設定kubectl自動補全命令

【外掛】

Heapster -- 效能資料採集外掛

跨主機容器間網路通訊:

       Flannel 、Open vSwitch、Weave、Calico

Etcd         -- 分散式資料儲存

【配置】

apiVersion包括:v1,extensions/v1beta1

kind:包括

kindv1extensions/v1beta1autoscaling/v1備註
ReplicationController
Pod
Service
ReplicaSet
Deployment
HorizontalPodAutoscaler
PersistentVolume網路永久儲存定義
Namespace名稱空間定義,用於隔離租戶間資源
DaemonSet確保每個Node上僅有一份Pod的副本
Endpoints

yaml檔案模板:

apiVersion: v1 #指定api版本,此值必須在kubectl apiversion中  
kind: Pod #指定建立資源的角色/型別  
metadata: #資源的元資料/屬性  
  name: web04-pod #資源的名字,在同一個namespace中必須唯一  
  labels: #設定資源的標籤,詳情請見http://blog.csdn.net/liyingke112/article/details/77482384
    k8s-app: apache  
    version: v1  
    kubernetes.io/cluster-service: "true"  
  annotations:            #自定義註解列表  
    - name: String        #自定義註解名字  
spec:#specification of the resource content 指定該資源的內容  
  restartPolicy: Always #表明該容器一直執行,預設k8s的策略,在此容器退出後,會立即建立一個相同的容器  
  nodeSelector:     #節點選擇,先給主機打標籤kubectl label nodes kube-node1 zone=node1  
    zone: node1  
  containers:  
  - name: web04-pod #容器的名字  
    image: web:apache #容器使用的映象地址  
    imagePullPolicy: Never #三個選擇Always、Never、IfNotPresent,每次啟動時檢查和更新(從registery)images的策略,
                           # Always,每次都檢查
                           # Never,每次都不檢查(不管本地是否有)
                           # IfNotPresent,如果本地有就不檢查,如果沒有就拉取
    command: ['sh'] #啟動容器的執行命令,將覆蓋容器中的Entrypoint,對應Dockefile中的ENTRYPOINT  
    args: ["$(str)"] #啟動容器的命令引數,對應Dockerfile中CMD引數  
    env: #指定容器中的環境變數  
    - name: str #變數的名字  
      value: "/etc/run.sh" #變數的值  
    resources: #資源管理,請求請見http://blog.csdn.net/liyingke112/article/details/77452630
      requests: #容器執行時,最低資源需求,也就是說最少需要多少資源容器才能正常執行  
        cpu: 0.1 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值為0.001核(1m)
        memory: 32Mi #記憶體使用量  
      limits: #資源限制  
        cpu: 0.5  
        memory: 32Mi  
    ports:  
    - containerPort: 80 #容器開發對外的埠
      name: httpd  #名稱
      protocol: TCP  
    livenessProbe: #pod內容器健康檢查的設定,詳情請見http://blog.csdn.net/liyingke112/article/details/77531584
      httpGet: #通過httpget檢查健康,返回200-399之間,則認為容器正常  
        path: / #URI地址  
        port: 80  
        #host: 127.0.0.1 #主機地址  
        scheme: HTTP  
      initialDelaySeconds: 180 #表明第一次檢測在容器啟動後多長時間後開始  
      timeoutSeconds: 5 #檢測的超時時間  
      periodSeconds: 15  #檢查間隔時間  
      #也可以用這種方法  
      #exec: 執行命令的方法進行監測,如果其退出碼不為0,則認為容器正常  
      #  command:  
      #    - cat  
      #    - /tmp/health  
      #也可以用這種方法  
      #tcpSocket: //通過tcpSocket檢查健康   
      #  port: number   
    lifecycle: #生命週期管理  
      postStart: #容器執行之前執行的任務  
        exec:  
          command:  
            - 'sh'  
            - 'yum upgrade -y'  
      preStop:#容器關閉之前執行的任務  
        exec:  
          command: ['service httpd stop']  
    volumeMounts:  #詳情請見http://blog.csdn.net/liyingke112/article/details/76577520
    - name: volume #掛載裝置的名字,與volumes[*].name 需要對應    
      mountPath: /data #掛載到容器的某個路徑下  
      readOnly: True  
  volumes: #定義一組掛載裝置  
  - name: volume #定義一個掛載裝置的名字  
    #meptyDir: {}  
    hostPath:  

      path: /opt #掛載裝置型別為hostPath,路徑為宿主機下的/opt,這裡裝置型別支援很多種  

【其他雜項】

1、Node排程   可以指定排程到某節點

     NodeSelector -- 比較固定,相對簡單

     NodeAffinity  -- 更加靈活,支援邏輯運算:In NotIn Exists DoesNotExist(不存在) Gt Lt等

2、k8s為什麼會抽象出一層Service呢?容器已經啟動,為什麼不使用PodIp+埠方式呢?

     1)一個pod中可能會有多個容器,通過podip+埠方式訪問,且不同node,分配的podip可能會重複。因此不是很方便。

     2)容器本身是分散式部署,因此前端需要一個類似負載均衡器的東西,來進行請求的分發。

     所以抽象出一個Service是非常合適的。

3、k8s Service提供排程的後端Pod的負載均衡方式:輪訓方式(RoundRobin)和會話保持方式(SessionAffinity)

     SessionAffinity方式指的是第一次排程到哪個pod上,以後同一會話均轉到這個pod中

 4、pod中容器必須是前端程序,如果前端程序結束則pod就結束。因此設定command欄位執行的命令為死迴圈:

       command: ["/bin/bash","-c","while true; do sleep 5d;done"]