004-k8s資源清單-01-yaml文件創建pod、deployment、service、secret、namespace等


一、概述

  上文使用kubectl run 或者kubectl expose等方式使用,其實不是常用方案,一般使用資源清單方式

  k8s中的資源、資源清單、常用字段解釋、容器生命周期

  k8s中所有的內容都抽象為資源,資源實例化之后,叫做對象

1.1、k8s中的資源

資源分類:名稱空間級別、集群級資源、元數據型資源

1.1.1、名稱空間級別

  工作負載資源(workload):Pod、ReplicaSet、Deployment、StatefulSet、DaemonSet、Job、CronJob(ReplicationController 在v1.11版本放棄)

  服務發現及負載均衡型資源(ServiceDiscovery LoadBalance):Service、Ingress、……

  配置與存儲型資源:Volume(存儲卷)、CSI(容器存儲接口,可以擴展各種各樣的第三方存儲卷)

  特殊類型的存儲卷:ConfigMap(當配置中心來使用的資源類型)Secret(保存敏感數據)DownwardAPI(把外部環境中的信息輸出給容器) 

1.1.2、集群級資源

  Namespace、Node、Role、ClusterRole、RoleBinding、ClusterRoleBinding

1.1.3、元數據型資源

  HPA、PodTemplate、LimitRange

1.2、資源清單 yaml編寫使用

  通過yaml格式文件來創建符合預期的pod ,一般統稱為資源清單

  可以通過命令查看:kuibectl explain pod 具體屬性可以使用:kubectl explain pod.spec

1.2.1、必選參數

參數名 字段類型 說明
apiVersion String k8s的api版本,目前均是v1,可以使用 kubectl api-version查看
kind String 使用yaml文件定義的資源類型和角色,如Pod
metadata Object 元數據對象
metadata.name String 元數據對象的名字,如Pod名稱
metadata.namespace String 元數據對象的命名空間,自定義,默認是default。
spec Object 詳細定義對象
spec.containers[] list 容器列表定義,是個list
spec.containers[].name String 容器名稱
spec.containers[].image String 容器使用的鏡像

1.2.2、pod的yaml模板

# yaml格式的pod定義文件完整內容:
apiVersion: v1       #必選,版本號,例如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    #必選,容器的鏡像名稱
    imagePullPolicy: [Always | Never | IfNotPresent] #獲取鏡像的策略 Alawys表示下載鏡像 默認值; IfnotPresent表示優先使用本地鏡像,否則下載鏡像,Nerver表示僅使用本地鏡像
    command: [string]    #容器的啟動命令列表,如不指定,使用打包時使用的啟動命令
    args: [string]     #容器的啟動命令參數列表
    workingDir: string     #容器的工作目錄
    volumeMounts:    #掛載到容器內部的存儲卷配置
    - name: string     #引用pod定義的共享存儲卷的名稱,需用volumes[]部分定義的的卷名
      mountPath: string    #存儲卷在容器內mount的絕對路徑,應少於512字符
      readOnly: boolean    #是否為只讀模式
    ports:       #需要暴露的端口庫號列表
    - name: string     #端口號名稱
      containerPort: int   #容器需要監聽的端口號
      hostPort: int    #容器所在主機需要監聽的端口號,默認與Container相同
      protocol: string     #端口協議,支持TCP和UDP,默認TCP
    env:       #容器運行前需設置的環境變量列表
    - name: string     #環境變量名稱
      value: string    #環境變量的值
    resources:       #資源限制和請求的設置
      limits:      #資源限制的設置
        cpu: string    #Cpu的限制,單位為core數,將用於docker run --cpu-shares參數
        memory: string     #內存限制,單位可以為Mib/Gib,將用於docker run --memory參數
      requests:      #資源請求的設置
        cpu: string    #Cpu請求,容器啟動的初始可用數量
        memory: string     #內存清楚,容器啟動的初始可用數量
    livenessProbe:     #對Pod內個容器健康檢查的設置,當探測無響應幾次后將自動重啟該容器,檢查方法有exec、httpGet和tcpSocket,對一個容器只需設置其中一種方法即可
      exec:      #對Pod容器內檢查方式設置為exec方式
        command: [string]  #exec方式需要制定的命令或腳本
      httpGet:       #對Pod內個容器健康檢查方法設置為HttpGet,需要制定Path、port
        path: string
        port: number
        host: string
        scheme: string
        HttpHeaders:
        - name: string
          value: string
      tcpSocket:     #對Pod內個容器健康檢查方式設置為tcpSocket方式
         port: number
       initialDelaySeconds: 0  #容器啟動完成后首次探測的時間,單位為秒
       timeoutSeconds: 0   #對容器健康檢查探測等待響應的超時時間,單位秒,默認1秒
       periodSeconds: 0    #對容器監控檢查的定期探測時間設置,單位秒,默認10秒一次
       successThreshold: 0
       failureThreshold: 0
       securityContext:
         privileged:false
    restartPolicy: [Always | Never | OnFailure]#Pod的重啟策略,Always表示一旦不管以何種方式終止運行,默認值,kubelet都將重啟,OnFailure表示只有Pod以非0退出碼退出才重啟,Nerver表示不再重啟該Pod
    nodeSelector: obeject  #設置NodeSelector表示將該Pod調度到包含這個label的node上,以key:value的格式指定
    imagePullSecrets:    #Pull鏡像時使用的secret名稱,以key:secretkey格式指定
    - name: string
    hostNetwork:false      #是否使用主機網絡模式,默認為false,如果設置為true,表示使用宿主機網絡
    volumes:       #在該pod上定義共享存儲卷列表
    - name: string     #共享存儲卷名稱 (volumes類型有很多種)
      emptyDir: {}     #類型為emtyDir的存儲卷,與Pod同生命周期的一個臨時目錄。為空值
      hostPath: string     #類型為hostPath的存儲卷,表示掛載Pod所在宿主機的目錄
        path: string     #Pod所在宿主機的目錄,將被用於同期中mount的目錄
      secret:      #類型為secret的存儲卷,掛載集群與定義的secre對象到容器內部
        scretname: string  
        items:     
        - key: string
          path: string
      configMap:     #類型為configMap的存儲卷,掛載預定義的configMap對象到容器內部
        name: string
        items:
        - key: string
          path: string 

測試:

vim pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
    version: v1
spec:
  containers:
  - name: app
    image: 10.0.0.82/library/myapp:v1
  - name: test
    image: 10.0.0.82/library/myapp:v1 

這樣會有80端口沖突問題。可以測試下

kubectl apply -f pod.yaml

查看,發現一直報錯

# kubectl get pod
NAME                               READY   STATUS             RESTARTS   AGE
myapp-pod                          1/2     CrashLoopBackOff   4          2m37s

原因是一個pod中復用了一個pause,使用pause的網絡,會有端口沖突問題。如何查看問題

查看容器詳情:kubectl describe pod

查看容器啟動的詳細日志:kubectl log myapp-pod -c test

可以看到端口沖突,-c是指定具體容器名,可以增加端口映射,或者暫時刪除test 容器

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
    version: v1
spec:
  containers:
  - name: app
    image: 10.0.0.82/library/myapp:v1

刪除pod:kubectl delete pod myapp-pod

重新建立pod:kubectl create -f pod.yaml

1.2.3、deployment的yaml模板

一個redis 的Deployment模板

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: redis-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: default.Deployment.redis_server
    spec:
      containers:
      - name: redis
        image: redis:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 6379
      volumes:
        - name: data
          emptyDir: {} 

1.2.4、service的yaml

上述redis對應的對應的service配置文件

kind: Service
apiVersion: v1
metadata:
  name: redis
spec:
  type: NodePort
  ports:
  - protocol: TCP
    port: 6379
    targetPort: 6379
    nodePort: 30379
    name: test
  selector:
    app: default.Deployment.redis_server

1.2.5、Secret的yaml

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
data:
  username: xxx
  password: yyy

# 敏感數據必須是base64編碼后的結果,如上面的username和password
# 創建secret用 kubectl apply -f xxx.yml命令

pod讀取secret文件

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 30000
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
# k8s會在 /etc/foo 下創建文件,每個數據創建一個文件,文件名是數據的key
# 即 會存在 username 和 password兩個文件,內容就是其內容的明文存儲
# volume方式支持動態更新

pod也可以使用環境變量方式讀取secret數據,但不支持動態更新

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: busybox
    args:
      - /bin/sh
      - -c
      - sleep 10; touch /tmp/healthy; sleep 30000
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password

1.2.6、configMap yml

和secret大致相似

apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigMap
data:
  config1: xxx
  config2: yyy

調用方式和secret相似,對應類型換成configMap就OK了

1.2.7、namespace

apiVersion: v1
kind: Namespace
metadata:
   name: development
   labels:
     name: lhx 

pod選擇namespace

apiVersion: v1
kind: Pod
metadata:
   name: test
   labels: 
     name: php-test
   namespace: lhx
spec:
  containers:
  - name: php-test
    image: 192.168.174.131:5000/php-base:1.0
    env:
    - name: ENV_TEST_1
      value: env_test_1
    - name: ENV_TEST_2
      value: env_test_2
    ports:
    - containerPort: 80
      hostPort: 80 
 

附注、yaml語法

  可讀性高,用來表達數據序列的格式。仍是一種標記語言。

1》基礎語法

  縮進時不允許使用Tab鍵,只允許使用空格

  縮進的空格數目不重要,只要相同層級的元素左側對其即可

  # 標記注釋,至結尾

2》yaml支持的數據結構

  對象:鍵值對的集合,又稱為映射(mapping)、哈希(hashes)、字典(dictonary)

  數組:一組按次序排列的值,又稱為序列(sequence)、列表(list)

  純量(scalars):單個的、不可再分的值

示例一、對象類型,使用“:”分隔

name: lihongxu
age: 30

或者:

hash: {name: lihongxu,age: 30}

示例二、數組:一組連詞線開頭的行,構成一個數據

animal
- Cat
- Dog

或者

animal: [Cat,Dog]

示例三、復合使用

languages:
- Ruby
- Java
websites:
Ruby: ruby-lang.org
Java: java-lang.org

示例四、純量:

字符串、布爾值、整數、浮點數、null、時間、日期等

# 數值直接以字面量的形式標識
number: 12.30
#布爾值用 true false
isSet: true
# null用~,或者不寫
parent: ~
# 時間采用iso8601
iso8601: 2020-08-28t04:34:54.10-05:00
# 日期采用復合iso8601格式的年月日
date: 2020-08-28
#使用兩個感嘆號,強制轉換數據類型
e: !!str 123
f: !!str true

字符串特殊用法

# 字符串默認不使用引號括起來,如果有個空格特殊字符等。使用可以用單引號或雙引號,其中雙引號不轉義
str: hello
str: 'hello lihongxu'
str: 'hello\nlihongxu'
str: "hello\nlihongxu"
# 單引號之間還有單引號,需要寫兩個單引號轉義
str: 'labor''s day'
# 多行,第二行開始縮進,換行符被轉為空格
str: 這是一個
  多行
  記錄
#多行可以使用|保留換行符,也可以使用>折疊換行
this: |
Foo
bar
that: >
Foo
Bar
# +表示保留文字塊末尾的換行,-表示刪除
s1: |
  Foo
s2: |+
  Foo
s3: |-
  Foo

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM