k8s爬坑筆記-pod篇


一.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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM