快速創(chuàng)建一個(gè)pod
[root@k8s-master ~]# kubectl run --help
Create and run a particular image in a pod.
Examples:
# Start a nginx pod.
kubectl run nginx --image=nginx
# Start a hazelcast pod and let the container expose port 5701.
kubectl run hazelcast --image=hazelcast/hazelcast --port=5701
# Start a hazelcast pod and set environment variables "DNS_DOMAIN=cluster" and "POD_NAMESPACE=default" in the
container.
kubectl run hazelcast --image=hazelcast/hazelcast --env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default"
# Start a hazelcast pod and set labels "app=hazelcast" and "env=prod" in the container.
kubectl run hazelcast --image=hazelcast/hazelcast --labels="app=hazelcast,env=prod"
# Dry run. Print the corresponding API objects without creating them.
kubectl run nginx --image=nginx --dry-run=client
# Start a nginx pod, but overload the spec with a partial set of values parsed from JSON.
kubectl run nginx --image=nginx --overrides='{ "apiVersion": "v1", "spec": { ... } }'
# Start a busybox pod and keep it in the foreground, don't restart it if it exits.
kubectl run -i -t busybox --image=busybox --restart=Never
# Start the nginx pod using the default command, but use custom arguments (arg1 .. argN) for that command.
kubectl run nginx --image=nginx -- <arg1> <arg2> ... <argN>
# Start the nginx pod using a different command and custom arguments.
kubectl run nginx --image=nginx --command -- <cmd> <arg1> ... <argN>
創(chuàng)建一個(gè)pod:
kubectl run nginx-deploy --image=nginx:1.14-alpine ---port=80
查看是否創(chuàng)建成功:
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deploy 1/1 Running 0 100s 10.244.2.21 k8s-node2 <none> <none>
刪除pod:
kubectl delete pod nginx-deploy
使用命令創(chuàng)建一個(gè)deploy
kubectl create deploy nginx-deploy --image=nginx:1.14-alpine
k8s的資源類別:
資源類型:
workload:pod,ReplicaSet,deployment,statefulSet,DaemonSet,Joob,CronJob
服務(wù)發(fā)現(xiàn)及均衡:
Services,Ingress
配置與存儲(chǔ):
Volume CSI
特殊類型存儲(chǔ)卷: configmap,secret,DownwardAPI
集群級(jí)別資源:
Namespace,Node,Role,ClusterRole,RoleBinding,ClusterRoleBinding
元數(shù)據(jù)類型資源:
HPA,PodTemplate,LimitRange
創(chuàng)建資源的方法:
apiserver僅接收J(rèn)SON格式的資源定義,如果用yaml格式提供的配置清單,apiserver可自動(dòng)將其轉(zhuǎn)為json格式,然后在提交,大部分資源的配置清單都有五個(gè)一級(jí)字段組成
apiVersion:指明我們創(chuàng)建的資源是屬于哪個(gè)api群組及其版本( kubectl api-versions查看)
kind:資源類別 (標(biāo)記打算創(chuàng)建一個(gè)什么資源,不能隨意定義一般都是內(nèi)鍵的)
metadate:元數(shù)據(jù)(主要是提供一下幾個(gè)字段)
name:(在同一類別中這個(gè)那么必須是唯一的)
namespace:(名稱空間)
labels:(標(biāo)簽)
annotations:(注解)
spec:(此字段是最重要的 ,定義用戶期望的狀態(tài))
status:當(dāng)前狀態(tài),此字段是由kubernetes集群維護(hù)
以上字段格式說(shuō)明都可以在集群中查看:kubectl explain pods

比如想要查看metadata的二級(jí)字段怎么定義:kubectl explain pods.metadata
labels <map[string]string> (像這種map類型的是映射,由鍵值組成的映射,是另外一種json格式的數(shù)組,不是一個(gè)列表是眾多kv組成的數(shù)據(jù))
finalizers <[]string> (這種前面有中括號(hào)的一般都是字符串列表,就是字符串類型的數(shù)組)
ownerReferences <[]Object>(這種就是對(duì)象列表里面可以嵌套很多三級(jí)字段)
containers <[]Object> -required- (像這種對(duì)象列表后面有required是必選字段)
[root@k8s-master daem]# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp
namespace: default
labels:
app: myapp
tier: frnotend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
- name: busybox
image: busybox:latest
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
查看狀態(tài)
[root@k8s-master daem]# kubectl get pods
NAME READY STATUS RESTARTS AGE
myapp 2/2 Running 0 13m
定義pod時(shí)在spec中的常用字段
spec.containers
- name <string> -required- (pod內(nèi)嵌的容器名稱)
image <string> (啟動(dòng)內(nèi)嵌容器使用的鏡像倉(cāng)庫(kù)地址,)
imagePullPolicy <string>
Always (總是到倉(cāng)庫(kù)中去下載,本地倉(cāng)庫(kù)中有或者沒(méi)有都去倉(cāng)庫(kù)中下載)
Never (如果有鏡像就用,沒(méi)有也不去下載,需要用戶手動(dòng)去下載鏡像)
IfNotPresent (如果本地有鏡像就使用沒(méi)有就去下載)
如果你的鏡像標(biāo)簽是latest的默認(rèn)就是Always,如果是其他的就使用IfNotPresent,一旦鏡像創(chuàng)建過(guò)后這個(gè)字段的值是不能更改的,
ports <[]Object> (定義容器內(nèi)部的要暴露端口號(hào),協(xié)議)-
name <string> (名稱)
containerPort <integer> -required- (容器的端口)
protocol <string> (協(xié)議,不指定默認(rèn)是TCP)
修改鏡像中的默認(rèn)應(yīng)用:
command <[]string>
args <[]string>
image.png
如果要覆蓋默認(rèn)的 Entrypoint 與 Cmd,需要遵循如下規(guī)則:
如果在容器配置中沒(méi)有設(shè)置 command 或者 args,那么將使用 Docker 鏡像自帶的命令及其參數(shù)。
如果在容器配置中只設(shè)置了 command 但是沒(méi)有設(shè)置 args,那么容器啟動(dòng)時(shí)只會(huì)執(zhí)行該命令, Docker 鏡像中自帶的命令及其參數(shù)會(huì)被忽略。
如果在容器配置中只設(shè)置了 args,那么 Docker 鏡像中自帶的命令會(huì)使用該新參數(shù)作為其執(zhí)行時(shí)的參數(shù)。
如果在容器配置中同時(shí)設(shè)置了 command 與 args,那么 Docker 鏡像中自帶的命令及其參數(shù)會(huì)被忽略。 容器啟動(dòng)時(shí)只會(huì)執(zhí)行配置中設(shè)置的命令,并使用配置中設(shè)置的參數(shù)作為命令的參數(shù)。
示例:
image.png
-
Dod中的常用字段
apiVersion: v1 #必選,版本號(hào),例如v1,版本號(hào)必須可以用 kubectl api-versions 查詢到 .
kind: Pod #必選,Pod
metadata: #必選,元數(shù)據(jù)
name: string #必選,Pod名稱
namespace: string #必選,Pod所屬的命名空間,默認(rèn)為"default"
labels: #自定義標(biāo)簽
- name: string #自定義標(biāo)簽名字
annotations: #自定義注釋列表
- name: string
spec: #必選,Pod中容器的詳細(xì)定義
containers: #必選,Pod中容器列表
- name: string #必選,容器名稱,需符合RFC 1035規(guī)范
image: string #必選,容器的鏡像名稱
imagePullPolicy: [ Always|Never|IfNotPresent ] #獲取鏡像的策略 Alawys表示總是到倉(cāng)庫(kù)中去下載,本地倉(cāng)庫(kù)中有或者沒(méi)有都去倉(cāng)庫(kù)中下載 IfNotPresent表示如果本地有鏡像就使用沒(méi)有就去下載,Nerver如果有鏡像就用,沒(méi)有也不去下載,需要用戶手動(dòng)去下載鏡像
command: [string] #容器的啟動(dòng)命令列表,如不指定,使用打包時(shí)使用的啟動(dòng)命令
args: [string] #容器的啟動(dòng)命令參數(shù)列表
workingDir: string #容器的工作目錄
volumeMounts: #掛載到容器內(nèi)部的存儲(chǔ)卷配置
- name: string #引用pod定義的共享存儲(chǔ)卷的名稱,需用volumes[]部分定義的的卷名
mountPath: string #存儲(chǔ)卷在容器內(nèi)mount的絕對(duì)路徑,應(yīng)少于512字符
readOnly: boolean #是否為只讀模式
ports: #需要暴露的端口庫(kù)號(hào)列表
- name: string #端口的名稱
containerPort: int #容器需要監(jiān)聽(tīng)的端口號(hào)
hostPort: int #容器所在主機(jī)需要監(jiān)聽(tīng)的端口號(hào),默認(rèn)與Container相同
protocol: string #端口協(xié)議,支持TCP和UDP,默認(rèn)TCP
env: #容器運(yùn)行前需設(shè)置的環(huán)境變量列表
- name: string #環(huán)境變量名稱
value: string #環(huán)境變量的值
resources: #資源限制和請(qǐng)求的設(shè)置
limits: #資源限制的設(shè)置
cpu: string #Cpu的限制,單位為core數(shù),將用于docker run --cpu-shares參數(shù)
memory: string #內(nèi)存限制,單位可以為Mib/Gib,將用于docker run --memory參數(shù)
requests: #資源請(qǐng)求的設(shè)置
cpu: string #Cpu請(qǐng)求,容器啟動(dòng)的初始可用數(shù)量
memory: string #內(nèi)存請(qǐng)求,容器啟動(dòng)的初始可用數(shù)量
livenessProbe: #對(duì)Pod內(nèi)各容器健康檢查的設(shè)置,當(dāng)探測(cè)無(wú)響應(yīng)幾次后將自動(dòng)重啟該容器,檢查方法有exec、httpGet和tcpSocket,對(duì)一個(gè)容器只需設(shè)置其中一種方法即可
exec: #對(duì)Pod容器內(nèi)檢查方式設(shè)置為exec方式
command: [string] #exec方式需要制定的命令或腳本
httpGet: #對(duì)Pod內(nèi)個(gè)容器健康檢查方法設(shè)置為HttpGet,需要制定Path、port
path: string
port: number
host: string
scheme: string
HttpHeaders:
- name: string
value: string
tcpSocket: #對(duì)Pod內(nèi)個(gè)容器健康檢查方式設(shè)置為tcpSocket方式
port: number
initialDelaySeconds: 0 #容器啟動(dòng)完成后首次探測(cè)的時(shí)間,單位為秒
timeoutSeconds: 0 #對(duì)容器健康檢查探測(cè)等待響應(yīng)的超時(shí)時(shí)間,單位秒,默認(rèn)1秒
periodSeconds: 0 #對(duì)容器監(jiān)控檢查的定期探測(cè)時(shí)間設(shè)置,單位秒,默認(rèn)10秒一次
successThreshold: 0
failureThreshold: 0
securityContext:
privileged: false
restartPolicy: [Always | Never | OnFailure] #Pod的重啟策略,Always必須重啟,總是重啟,OnFailure表示只有狀態(tài)為錯(cuò)誤時(shí)才重啟,Nerver表示不再重啟該P(yáng)od
nodeSelector: obeject #設(shè)置NodeSelector表示將該P(yáng)od調(diào)度到包含這個(gè)label的node上,以key:value的格式指定
imagePullSecrets: #Pull鏡像時(shí)使用的secret名稱,以key:secretkey格式指定
- name: string
hostNetwork: false #是否使用主機(jī)網(wǎng)絡(luò)模式,默認(rèn)為false,如果設(shè)置為true,表示使用宿主機(jī)網(wǎng)絡(luò)
volumes: #在該pod上定義共享存儲(chǔ)卷列表
- name: string #共享存儲(chǔ)卷名稱 (volumes類型有很多種)
emptyDir: {} #類型為emtyDir的存儲(chǔ)卷,與Pod同生命周期的一個(gè)臨時(shí)目錄。為空值
hostPath: string #類型為hostPath的存儲(chǔ)卷,表示掛載Pod所在宿主機(jī)的目錄
path: string #Pod所在宿主機(jī)的目錄,將被用于同期中mount的目錄
secret: #類型為secret的存儲(chǔ)卷,掛載集群與定義的secre對(duì)象到容器內(nèi)部
scretname: string
items:
- key: string
path: string
configMap: #類型為configMap的存儲(chǔ)卷,掛載預(yù)定義的configMap對(duì)象到容器內(nèi)部
name: string
items:
- key: string
path: string

