1、定義pod的完整內容
# 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 |
通過 查看apiVersion
kubectl api-version kubectl get namespace |
2、創建deployment,一般通過deployment 來創建pod
#test-pod apiVersion: v1 #指定api版本,此值必須在kubectl apiversion中 kind: Deployment #指定創建資源的角色/類型 metadata: #資源的元數據/屬性 name: test-pod #資源的名字,在同一個namespace中必須唯一 labels: #設定資源的標籤 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: test-pod #容器的名字 image: 10.192.21.18:5000/rjh/client:latest #容器使用的鏡像地址 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: #資源管理 requests: #容器運行時,最低資源需求,也就是說最少需要多少資源容器才能正常運行 cpu: 0.1 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值爲0.001核(1m) memory: 32Mi #內存使用量 limits: #資源限制 cpu: 0.5 memory: 1000Mi ports: - containerPort: 80 #容器開發對外的端口 name: httpd #名稱 protocol: TCP livenessProbe: #pod內容器健康檢查的設置 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: #掛載持久存儲卷 - name: volume #掛載設備的名字,與volumes[*].name 需要對應 mountPath: /data #掛載到容器的某個路徑下 readOnly: True volumes: #定義一組掛載設備 - name: volume #定義一個掛載設備的名字 #meptyDir: {} hostPath: path: /opt #掛載設備類型爲hostPath,路徑爲宿主機下的/opt,這裏設備類型支持很多種 #nfs |
Deployment 管理的是replicaset-controller,RC會創建Pod。Pod自身會下載鏡像並啓動鏡像
3、service 完整文件
apiVersion: v1 kind: Service matadata: name: string namespace: string labels: - name: string annotations: - name: string spec: selector: [] #必須,將具有指定Label標籤的Pod作爲管理範圍,與deployment的selector.matchLabels對應 type: string # 指定Service的訪問方式,默認爲ClusterIP, ClusterIP:虛擬的服務IP地址,該地址用於Kubernets集羣內部的 # Pod訪問,在Node上Kuber-proxy通過設置的iptables規則進行轉發 # NodePort: 使用宿主機的端口,使能夠訪問各Node的外部客戶端通過Node的IP地址和端口號就能訪問服務 # LoadBalancer: 使用外部負載均衡器完成到服務的負載分發,需要在spec.status.loadBalancer 字段指定外部負 # 載均衡器的IP地址,並同時定義nodePort和clusterIP clusterIP: string #當type=clusterIP時,如果不指定,則系統自動分配,也可以指定。當type=LoadBalancer時,需要指定 sessionAffinity: string #是否支持Session, 可選值爲clientIP,默認爲空,ClientIP:表示將一個客戶端 #(根據客戶端的IP地址決定)的訪問請求都轉發到同一個後端端口 ports: #service 需要暴露的端口列表 - name: string protocol: string #端口協議 支持TCP和UDP port: int #端口號 targetPort: int #需要轉發到後端Pod的端口號 nodePort: int #當spec.type=NodePort時,指定映射到物理機的端口號 status: #當scpe.type=LoadBalancer時,設置外部負載均衡器的地址,用於公有云環境 loadBalancer: ingress: ip: string hostname: string #均衡器的主機名 |
Service 中,NodePort,targetPort,Port三個關係很緊密,而且很難區分,先看下圖
外部客戶端通過指定的負載均衡器,130.211.53.173:80 訪問kubernets 集羣,通過Nodeport:32143 訪問到服務port,服務再去訪問容器暴露出來的targetPort :8080
4、實踐
apiVersion: v1 kind: ConfigMap metadata: name: rjh-configmap namespace: default data: test: rjh-server --- apiVersion: extensions/v1beta1 kind: Deployment metadata: name: test namespace: default labels: app: rjh-client spec: replicas: 1 selector: matchLabels: app:rjh-client spec: containers: - name: coredns image: coredns/coredns:latest imagePullPolicy: Always ports: - containerPort: 53 name: client protocol: TCP resources: #資源管理 requests: #容器運行時,最低資源需求,也就是說最少需要多少資源容器才能正常運行 cpu: 0.1 #CPU資源(核數),兩種方式,浮點數或者是整數+m,0.1=100m,最少值爲0.001核(1m) memory: 32Mi #內存使用量 limits: #資源限制 cpu: 0.5 memory: 1000Mi livenessProbe: httpGet: path: /health port: 8080 scheme: HTTP initialDelaySeconds: 60 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5 dnsPolicy: Default volumes: - name: config-volume configMap: name: test items: - key: rjh-configmap path: #待考證 --- #內部使用服務 apiVersion: v1 kind: Service metadata: name: rjh-service namespace: default labels: app:rjh-client spec: selector: app:client type: ClusterIP ports: #coreDNS 支持TCP、UDP、HTTP、TTL四種協議 - name: ownservice port: 53 protocol: TCP |