K8S 入門基本操作體驗及 YAML 使用
阿新 • • 發佈:2021-01-17
一、安裝Tomcat
1、部署一個tomcat(主節點部署)
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
kubectl get pods -o wide # 可以獲取到Tomcat資訊(Tomcat具體部署在哪個節點)
列印結果:
可以看到Tomcat已經部署在 k8s-node2 節點上了。在 k8s-node3 伺服器檢視映象,在主節點安裝的,已經在從節點上安裝好了。
2、暴露埠訪問
kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort # 主節點執行 Pod 的 80 對映器的8080;service會代理 Pod 的80
檢視:kubectl get svc
kubectl get svc -o wide
可以看到,tomcat6的service暴露在了 32711 這個埠,然後可以通過 http://192.168.10.102:30925/ 訪問。
3、動態擴容測試
kubectl get deployment
應用升級:kubectl set image
(–help 檢視幫助)
擴容:kubectl scale --replicas=3 deployment tomcat6
擴容了多份,所有無論訪問哪個node的指定埠,都可以訪問到 tocat6
4、刪除
kubectl get all kubectl delete deploy/nginx kubectl delete service/nginx-service
流程:建立deployment會管理replicas,replicas控制pod數量,有pod故障會自動拉起新的pod。
二、yaml基本使用
1、K8S 建立資源的方式
K8S有兩種建立資源的方式:kubectl 命令和 yaml 配置檔案。
kubectl命令列:最為簡單,一條命令就OK,但缺點也很明顯,你並不知道這條命令背後到底做了哪些事!
yaml配置檔案:提供了一種讓你知其然更知其所以然的方式。優勢如下:
- 完整性:配置檔案描述了一個資源的完整狀態,可以很清楚地知道一個資源的建立背後究竟做了哪些事;
- 靈活性:配置檔案可以建立比命令列更復雜的結構;
- 可維護性:配置檔案提供了建立資源物件的模板,能夠重複使用;
- 可擴充套件性:適合跨環境、規模化的部署。
yml模板:
2.檔案模板
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
yaml例項檔案
apiVersion: extensions/v1beta1 #介面版本
kind: Deployment #介面型別
metadata:
name: ptengine-demo #Deployment名稱
namespace: ptengine-prd #namespace 名稱
labels:
app: ptengine-demo #標籤
spec:
replicas: 3
strategy:
rollingUpdate: ##由於replicas為3,則整個升級,pod個數在2-4個之間
maxSurge: 1 #滾動升級時會先啟動1個pod
maxUnavailable: 1 #滾動升級時允許的最大Unavailable的pod個數
template:
metadata:
labels:
app: ptengine-demo #模板名稱必填
sepc: #定義容器模板,該模板可以包含多個容器
containers:
- name: ptengine-demo #映象名稱
image: reg.pt1.com/ptengine-prd/ptengine-demo:0.0.1-SNAPSHOT #映象地址
CMD: [ "/bin/sh","-c","cat /etc/config/path/to/special-key" ] #啟動CMD
args: #啟動引數
- '-storage.local.retention=$(STORAGE_RETENTION)'
。。。。。。。。
- '-web.external-url=$(EXTERNAL_URL)'
imagePullPolicy: IfNotPresent #如果不存在則拉取
livenessProbe: #表示container是否處於live狀態。如果LivenessProbe失敗,LivenessProbe將會通知kubelet對應的container不健康了。隨後kubelet將kill掉container,並根據RestarPolicy進行進一步的操作。預設情況下LivenessProbe在第一次檢測之前初始化值為Success,如果container沒有提供LivenessProbe,則也認為是Success;
httpGet:
path: /health #如果沒有心跳檢測介面就為/
port: 8080
scheme: HTTP
initialDelaySeconds: 60 ##啟動後延時多久開始執行檢測
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
readinessProbe:
readinessProbe:
httpGet:
path: /health #如果沒有健康檢測介面就為/
port: 8080
scheme: HTTP
initialDelaySeconds: 30 ##啟動後延時多久開始執行檢測
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 5
resources: ##CPU記憶體限制
requests:
cpu: 2
memory: 2048Mi
limits:
cpu: 2
memory: 2048Mi
env: ##通過環境變數的方式,直接傳遞pod=自定義Linux OS環境變數
- name: LOCAL_KEY #本地Key
value: value
- name: CONFIG_MAP_KEY #local策略可使用configMap的配置Key,
valueFrom:
configMapKeyRef:
name: special-config #configmap中找到name為special-config
key: special.type #找到name為special-config裡data下的key
ports:
- name: http
containerPort: 8080 #對service暴露埠
volumeMounts: #掛載volumes中定義的磁碟
- name: log-cache
mount: /tmp/log
- name: sdb #普通用法,該卷跟隨容器銷燬,掛載一個目錄
mountPath: /data/media
- name: nfs-client-root #直接掛載硬碟方法,如掛載下面的nfs目錄到/mnt/nfs
mountPath: /mnt/nfs
- name: example-volume-config #高階用法第1種,將ConfigMap的log-script,backup-script分別掛載到/etc/config目錄下的一個相對路徑path/to/...下,如果存在同名檔案,直接覆蓋。
mountPath: /etc/config
- name: rbd-pvc #高階用法第2中,掛載PVC(PresistentVolumeClaim)
#使用volume將ConfigMap作為檔案或目錄直接掛載,其中每一個key-value鍵值對都會生成一個檔案,key為檔名,value為內容,
volumes: # 定義磁碟給上面volumeMounts掛載
- name: log-cache
emptyDir: {}
- name: sdb #掛載宿主機上面的目錄
hostPath:
path: /any/path/it/will/be/replaced
- name: example-volume-config # 供ConfigMap檔案內容到指定路徑使用
configMap:
name: example-volume-config #ConfigMap中名稱
items:
- key: log-script #ConfigMap中的Key
path: path/to/log-script #指定目錄下的一個相對路徑path/to/log-script
- key: backup-script #ConfigMap中的Key
path: path/to/backup-script #指定目錄下的一個相對路徑path/to/backup-script
- name: nfs-client-root #供掛載NFS儲存型別
nfs:
server: 10.42.0.55 #NFS伺服器地址
path: /opt/public #showmount -e 看一下路徑
- name: rbd-pvc #掛載PVC磁碟
persistentVolumeClaim:
claimName: rbd-pvc1 #掛載已經申請的pvc磁碟
kubernetes建立pod的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,這裡裝置型別支援很多種
4、示例
部署(Deployment):
在上邊我們使用 kubectl
命令來建立了 Tomcat:
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8
下邊我們使用yml來看如何建立:
# 使用該命令來建立yaml檔案,--dry-run 測試,不真正執行。
kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run -o yaml
執行以上命令即可輸出yaml檔案:
[[email protected]-node2 vagrant]# kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: tomcat6
name: tomcat6
spec:
replicas: 1
selector:
matchLabels:
app: tomcat6
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: tomcat6
spec:
containers:
- image: tomcat:6.0.53-jre8
name: tomcat
resources: {}
status: {}
上邊輸出的檔案就是我們要部署的Tomcat6檔案的yaml詳細資訊,或者也可以將上邊的列印輸出到yaml檔案,然後對這個檔案進行修改,執行操作:
# kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8 --dry-run -o yaml > tomcat6.yaml # 重定向檔案
kubectl apply -f tomcat6.yaml # 執行yaml檔案
埠暴露(service):
上邊的暴露埠命令我們也可以使用yaml檔案來執行。
[[email protected] k8s]# kubectl expose deployment tomcat6 --port=80 --target-port=8080 --type=NodePort --dry-run -o yaml
列印:
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: tomcat6
name: tomcat6
spec:
ports:
- port: 80
protocol: TCP
targetPort: 8080
selector:
app: tomcat6
type: NodePort
status:
loadBalancer: {}
可以看到,kind型別為 service,這裡相當於暴露服務。
定義pod:
[[email protected] k8s]# kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat6-5f7ccf4cb9-xljrm 1/1 Running 2 15h
[[email protected] k8s]# kubectl get pod tomcat6-5f7ccf4cb9-xljrm
NAME READY STATUS RESTARTS AGE
tomcat6-5f7ccf4cb9-xljrm 1/1 Running 2 15h
[[email protected] k8s]# kubectl get pod tomcat6-5f7ccf4cb9-xljrm -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2020-09-21T13:12:49Z"
generateName: tomcat6-5f7ccf4cb9-
labels:
app: tomcat6
pod-template-hash: 5f7ccf4cb9
name: tomcat6-5f7ccf4cb9-xljrm
namespace: default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: tomcat6-5f7ccf4cb9
uid: 81b504a0-c4d1-4bc7-a637-f7e42c1a16dd
resourceVersion: "51703"
selfLink: /api/v1/namespaces/default/pods/tomcat6-5f7ccf4cb9-xljrm
uid: 5b91ec85-b2de-4c95-b480-974a5a68037a
spec:
containers:
- image: tomcat:6.0.53-jre8
imagePullPolicy: IfNotPresent
name: tomcat
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-rhqrl
readOnly: true
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: k8s-node3
priority: 0
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: default-token-rhqrl
secret:
defaultMode: 420
secretName: default-token-rhqrl
status:
conditions:
- lastProbeTime: null
lastTransitionTime: "2020-09-21T13:12:49Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2020-09-22T04:30:41Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2020-09-22T04:30:41Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2020-09-21T13:12:49Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://daa3d00931e7548c9bcdf93e1b80cc68e81caf9350e6495fefbbd589af29ceb7
image: tomcat:6.0.53-jre8
imageID: docker-pullable://[email protected]:8c643303012290f89c6f6852fa133b7c36ea6fbb8eb8b8c9588a432beb24dc5d
lastState:
terminated:
containerID: docker://47f0ae5eb452fd05ae1172a9489fc8bb929aac863365ac3eaecaaeb3cee7e41c
exitCode: 143
finishedAt: "2020-09-21T15:12:59Z"
reason: Error
startedAt: "2020-09-21T13:37:25Z"
name: tomcat
ready: true
restartCount: 2
started: true
state:
running:
startedAt: "2020-09-22T04:30:40Z"
hostIP: 10.0.2.5
phase: Running
podIP: 10.244.1.4
podIPs:
- ip: 10.244.1.4
qosClass: BestEffort
startTime: "2020-09-21T13:12:49Z"