k8s-Pod控制器基礎(chǔ)

快速創(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


image.png

比如想要查看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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容