在k8s中的基本概念

在k8s中的基本概念php

一.Pod
1. pod
k8s下最重要也最基本的概念,由一個根容器Pause和許多用戶業務容器組成,是容器的載體.html

2. pod的yaml定義格式及字段node

apiVersion: v1            //版本
kind: pod                 //類型,pod
metadata:                 //元數據
  name: String            //元數據,pod的名字
  namespace: String       //元數據,pod的命名空間
  labels:                 //元數據,標籤列表
    - name: String        //元數據,標籤的名字
  annotations:            //元數據,自定義註解列表
    - name: String        //元數據,自定義註解名字
spec:                     //pod中容器的詳細定義
  containers:             //pod中的容器列表,能夠有多個容器
  - name: String
    image: String         //容器中的鏡像
    imagesPullPolicy: [Always|Never|IfNotPresent]//獲取鏡像的策略
    command: [String]     //容器的啓動命令列表(不配置的話使用鏡像內部的命令)
    args: [String]        //啓動參數列表
    workingDir: String    //容器的工做目錄
    volumeMounts:         //掛載到到容器內部的存儲卷設置
    - name: String
      mountPath: String
      readOnly: boolean
    ports:                //容器須要暴露的端口號列表
    - name: String
      containerPort: int  //容器要暴露的端口
      hostPort: int       //容器所在主機監聽的端口(容器暴露端口映射到宿主機的端口)
      protocol: String
    env:                  //容器運行前要設置的環境列表
    - name: String
      value: String
    resources:            //資源限制
      limits:
        cpu: Srting
        memory: String
      requeste:
        cpu: String
        memory: String
    livenessProbe:         //pod內容器健康檢查的設置
      exec:
        command: [String]
      httpGet:             //經過httpget檢查健康
        path: String
        port: number
        host: String
        scheme: Srtring
        httpHeaders:
        - name: Stirng
          value: String 
      tcpSocket:           //經過tcpSocket檢查健康
        port: number
      initialDelaySeconds: 0//首次檢查時間
      timeoutSeconds: 0     //檢查超時時間
      periodSeconds: 0      //檢查間隔時間
      successThreshold: 0
      failureThreshold: 0
      securityContext:      //安全配置
        privileged: falae
    restartPolicy: [Always|Never|OnFailure]//重啓策略
    nodeSelector: object    //節點選擇
    imagePullSecrets:
    - name: String
    hostNetwork: false      //是否使用主機網絡模式,默認否
  volumes:                  //在該pod上定義共享存儲卷
  - name: String
    meptyDir: {}
    hostPath:
      path: string
    secret:                 //類型爲secret的存儲卷
      secretName: String
      item:
      - key: String
        path: String
    configMap:             //類型爲configMap的存儲卷
      name: String
      items:
      - key: String
        path: String

  

3. label 和 label selector
label是k8s中的核心概念,label由key和value組成,用戶自定義,用以區分和篩選pod.
如:Service和ReplicationController中篩選component爲redis的pod
selector:
component: redisnginx

二.ReplicationController
1.ReplicationController(簡稱Rc)
Rc控制了定期望的數量來運行pod.Rc定義包括瞭如下部分:
a.期待的pod副本數
b.篩選目標pod的label selector
c.但pod小於指定副本數的時候,用於建立pod的模板(template).web

2.定義示例:redis

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

  

3.刪除Rc並不會刪除rc建立的pod.爲了刪除全部pod,能夠將replicas設置爲0.
如:
kubectl scale rc php-rc --replicas 0docker

4.擴容
kubectl scale rc php-rc --replicas 2後端

5.自動控制pod副本數量最小1,最大4:
kubectl autoscale rc php-rc --min=1 --max=4 api

三.Deployment
在內部使用了Replica Set(能夠看作是Rc的升級版本,90%與Rc類似).安全

三.Service
1.概念及做用:
定義了一個服務訪問的入口地址,由於pod副本會有多個,一樣的地址也就有多個,若是沒有service,將須要考慮pod的負載均衡問題.換句話說service將一組pod組成一個集合來提供給其餘資源,用戶無需關注各個pod副本.
Service與先後端的Pod集羣經過label selector來實現對接,rc保證了service(其實是pod的數量)服務質量

2.IP種類
Node IP: 節點IP(物理網卡)
Pod IP: pod上的IP(Docker Engine分配)
Cluster IP: service上的IP(K8s分配,沒法被ping)

3.ports屬性:
nodePort: 外部訪問service,經過nodeIP:nodePort方式提供給外部訪問k8s中的服務(須要配置對應service的type爲NodePort,同時在節點服務器上設置轉發iptables -P FORWARD ACCEPT,默認爲30000-32767)
port: k8s內部訪問service的端口
targetPort: 容器的端口,是pod上的端口(如無指定,默認和port相同)
流量進入路徑爲:nodePort -> port -> targetPort

4.服務發現:
環境變量(可進入具體的pod中查看每一個service對應的環境變量)和kube-dns

5.Service的type類型:
ClusterIP: 僅僅使用一個集羣內部的IP地址 - 這是默認值。選擇這個值意味着你只想這個服務在集羣內部才能夠被訪問到
請注意,這個內部訪問指的是在集羣內部的pod上能夠訪問service,
並非集羣內部節點上直接訪問;在service所在pod的節點主機上是能夠直接以ClusterIP:端口的形式訪問到;若是pod不在該節點上,節點主機要訪問該service,須要作IP轉發:

ip route add 10.254.0.0/16 dev docker0

10.254.0.0是service網段

你能夠在節點服務器上運行:

iptables -S -t nat | grep KUBE-SERVICES

來查看轉發規則

NodePort: 在集羣內部IP的基礎上,在集羣的每個節點的端口上開放這個服務。你能夠在外部經過<NodeIP>:NodePort地址上訪問到這個服務(其中NodeIP是任意節點的ip地址)
LoadBalancer: 在使用一個集羣內部IP地址和在NodePort上開放一個服務以外,向雲提供商申請一個負載均衡器,會讓流量轉發到這個在每一個節點上以<NodeIP>:NodePort的形式開放的服務上。


四.存儲卷(Volume)
1.示例:

spec:
            containers:
                - name: nginx
                  image: nginx:alpine
                  volumeMounts:
                      - name: web-root
                        mountPath: /usr/share/nginx/html
            volumes:
                - name: web-root
                  nfs:
                      server: 192.168.2.17
                      path: /data/nfs

  

2.volume取值
emptyDir: 是在pod分配到node上建立的,初始內容爲空;無需指定名稱,k8s會自動分配目錄.pod移除時,該目錄也被刪除.
hostPath: 在pod上掛載宿主機上的目錄.
nfs: 使用nfs網絡文件系統提供的共享目錄


五.命名空間
1.k8s默認使用的命名空間是default,使用kubectl get namespaces查看
2.定義命名空間:

apiVersion: v1
kind: namespace
metadata:
   name: projectA

  

3.使用命名空間:

apiVersion: v1
kind: Pod
metadata:
   name: nginx-pod
   namespace: projectA
   labels:
     name: nginx-pod
spec:
  containers:
  - name: nginx
....

  

4.namespace能夠實現多用戶資源隔離

查看全部命名空間下的pods

#kubectl get pods --all-namespaces

  


六.kubectl命令行工具用法
1.語法:
kubectl [command] [TYPE] [NAME] [flags]
(1)command:子命令,用於操做k8s集羣資源對象的命令.如create, delete, describe, get, apply
(2)TYPE:資源對象的類型,區分大小寫,能以單數形式,複數形式或者簡寫形式表示.如pod,service,node等
(3)NAME:資源對象的名稱,區分大小寫,若是不指定,則返回所有.
(4)flags:子命令可選參數,如-s指定apiserver的url地址而不使用默認值

2.輸出格式:
輸出格式經過-o參數指定

3.操做示例
(1).建立資源對象
根據yaml配置文件建立
kubectl create -f my-service.yaml my-pod.yaml

(2)查看資源對象
kubectl get pod,rc,service

(3)描述資源對象
kubectl describe pods

顯示由rc管理的pod信息
kubectl describe pods <rc-name>

(4)刪除資源對象
kubectl delete -f my-service.yaml
經過label刪除
kubectl delete pods -l name=<label-name>
刪除全部
kubectl delte pods --all

(5)執行容器命令
默認使用pod中的第一個容器:
kubectl exec <pod-name> date

指定pod中的容器執行命令:
kubectl exec <pod-name> -c <conatiner-name> date

經過bash得到pod中某個容器的tty,至關於登陸容器:
kubectl exec -ti <pod-name> -c <conatiner-name> /bin/bash

6.查看容器日誌:查看容器輸出到stdout的日誌kubectl logs <pod-name>跟蹤查看容器的日誌,至關於tail -f:kubectl logs -f <pod-name> -c <conatiner-name>

相關文章
相關標籤/搜索