一、概述
上文使用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