一.POD 簡介
最小部署單元
一組容器的集合
一個Pod中的容器共享網絡命名空間
pod是短暫
二.POD容器分類
Infrastructure Container: 基礎容器
維護整個Pod網絡空間
InitContainers: 初始化容器
先於業務容器開始執行
Containers: 業務員容器
並行啟動
三.鏡像拉取策略(imagePullPolicy)
ifNotPresent: 默認值,鏡像在宿主機上不存在時才拉取
Always: 每次創建Pod都會重新拉取一次鏡像
Never: Pod永遠都不會拉取這個鏡像
kubectl get deploy/nginx-deployment -o yaml | grep imagePull #查看鏡像拉取策略
配置拉取私有倉庫鏡像
一般我們在共有倉庫拉取鏡像是可以直接拉取,不需要驗證,單如果需要拉取的鏡像在私有倉庫,就需要配置認證了。
# nginx-deployment.yaml --- #控制器定義 apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx # 被控制對象定義 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.15.4 ports: - containerPort: 80
上面的yaml文件中是默認去共有倉庫拉取nginx鏡像。
3.1.登錄倉庫
在一台能訪問私有倉庫的服務器上使用docker login 登錄一次倉庫,會產生一個/root/.docker/config.json文件,這個文件就是在本地保存的憑證。

3.2.編寫registry-pull-sercrt.yaml
# registry-pull-secret.yaml apiVersion: v1 kind: Secret metadata: name: registry-pull-secret # namespace: web data: .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJyZ]XxxxxxxxxxlIjogewoJCQkxxxxxCI6ICJZV1J0YVc0NlNFOxxxxxxxxwKCSJIdHRwSxxxxxxxQkiVXNlci1BZ2VudCI6xxxxxxx2xpZW50LzE 4LjA5LjcgKGxpbnV4KSIKCX0KfQ== type: kubernetes.io/dockerconfigjson
kubectl create -f registry-pull-secret.yaml
kubectl get secret
3.3.在原有的nginx-deployment.yaml配置imagePullSecrets參數
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: imagePullSecrets: - name: registry-pull-secret containers: - name: nginx image: registry.dockerhub.live/test/http/nginx:v0.1 ports: - containerPort: 80
3.4.應用變更
kubectl apply -f nginx-deployment.yaml
四.POD資源限制
limit限制容器能使用的最大資源
spec.containes[].resources.limits.cpu
spec.containes[].resources.limits.memory
requests現在容器服務時需要的最小資源,如果該node節點不滿足該要求,則不會將容器分配到該節點
spec.containes[].resources.requests.cpu
spec.containes[].resources.requests.memory
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx # 被控制對象定義 template: metadata: labels: app: nginx spec: containers: - name: nginx resources: requests: memory: "100Mi" cpu: "300m" limits: memory: "500Mi" cpu: "1000m" image: nginx:1.15.4 ports: - containerPort: 80
kubectl describe node 192.168.244.227 查看node詳細信息 kubectl get ns 獲取當前所有的命名空間
五.重啟策略
Always: 當容器終止退出后,總是重啟容器,默認策略。
OnFailure: 當容器異常退出(退出狀態碼非0)時,才重啟容器。
Never: 當容器終止退出,從不重啟容器。
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx ports: - port: 80 targetPort: 80 restartPolicy: Always
六.健康檢查
Probe有以下兩種類型: livenessProbe: 如果檢查失敗,將容器殺死,根據Pod的restartPolicy來操作 readinessProbe: 如果檢查失敗,Kubernetes會把Pod從service endpoints中剔除 Probe支持以下三種檢查方法: httpGet: 發起HTTP請求,返回200-400訪問狀態碼為成功 exec: 執行Shell命令返回狀態碼是0為成功 tcpSocket: 發起TCP Socket建立成功
apiVersion: v1 kind: Pod metadata: name: goproxy labels: app: goproxy spec: containers: - name: goproxy image: k8s.gcr.io/goproxy:0.1 ports: - containerPort: 8080 readinessProbe: tcpSocket: port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 30 periodSeconds: 20
七.調度約束
給node打標簽 kubectl label nodes 192.168.244.226 platform=yalla 查看node標簽 kubectl get nodes --show-labels
#將pod根據標簽分配到指定node下面 apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: nodeSelector: platform: yalla - name: nginx image: nginx ports: - port: 80 targetPort: 80 restartPolicy: Always
八.故障排查
Pending Pod創建已經提交到Kubernetes。但是,因為某種原因不能順利創建。例如下載鏡像慢,調度不成功
Running Pod已經綁定到一個節點,並且已經創建了所有容器。至少有一個容器正在運行中,或正在啟動或重新啟動。
Succeeded Pod中的所有容器都成功終止,不會重新啟動
Failed Pod中的所有容器都已成功終止,不會重新啟動。
UnKnown 由於某種原因apiserver無法獲取Pod的狀態,通常是由於Master與Pod所在的主機通信出錯。
kubectl describe TYPE/NAME
kubectl logs pod
