Skip to content

antony@notes:~/kubernetes$ cat "k8s產生pods的過程.md"

k8s產生pods的過程

2021-10-26· kubernetes ·Kubernetes

k8s產生pods的過程

  • k8s叢集中,只要是能產生pod的工作機(worker node) 都會有kubelet ,負責產生pod,並告知CRI-O協助產生container,最後由runc產生container
  • 每一個 node(m1、w1、w2) 都有 kubelet 在背景執行 可以由 ps aux |grep kubelet 得知 ps. 而且是一開機就執行 (sudo rc-update add kubelet default)
  • pod是由 kubelet(daemon) 產生的
  • containers 是由 kubelet(daemon) → cri-o → runc 產生的 by 子謙

把睡夢羅漢的版本換成3.2

bigred@m1:~$ sudo podman images | grep api
k8s.gcr.io/kube-apiserver                                 v1.22.2     e64579b7d886  5 weeks ago   130 MB
bigred@m1:~$ sudo podman images | grep pause
k8s.gcr.io/pause                                          3.5         ed210e3e4a5b  7 months ago  690 kB
  • k8s版本代號V1.22.2搭配的pause(睡夢羅漢)版本是3.5。

bigred@m1:~$ sudo podman pull k8s.gcr.io/pause:3.2

  • 下載3.2版本睡夢羅漢的image。

bigred@m1:~$ sudo nano /etc/containers/containers.conf

  • 進去以後,alt+shift+3 開啟行數,到第335行("# infra_image = "k8s.gcr.io/pause:3.4.1"")版本改成3.2,m1、w1和w2都要做設定。

Liveness Probe - Exec

$ echo 'apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox
    args:
    - /bin/sh      #只用sh來run下面的命令,不用互動
    - -c           #此及下一行是補充給/bin/sh的參數,/bin/sh –c=command,接續欲執行的命令
    - touch /tmp/healthy; sleep 20; rm -rf /tmp/healthy; sleep 300   #睡完container結束
    livenessProbe:  #給kubelet看,叫他來偵測(執行
      exec:
        command:     #要run來確認pod生死的命令
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5   
      periodSeconds: 5 '>  exec-liveness.yml
  • yaml 沒有順序的問題,這些全部都是一起進去的參數,不是直譯式。

livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy         #檢查 /tmp/healthy在不在
      initialDelaySeconds: 5   #發呆5秒
      periodSeconds: 5         #每5秒回去pod檢查一次,,kubelet判讀pod消亡會重建

上面這段是cubelet在執行


Readiness Probe - TCP

$ echo 'apiVersion: v1
kind: Pod
metadata:
  name: tcp-readiness
spec:
  containers:
  - name: tcp-readiness
    image: quay.io/cloudwalker/busybox
    stdin: true
    tty: true
    args:
    - /bin/sh
    - -c
    - sleep 20; timeout 20s nc -l localhost -p 9999; sleep 60; nc -l localhost -p 9999 #timeout 20s 是只給大肥貓20秒
    ports:
    - containerPort: 9999
    readinessProbe:
      tcpSocket:
        port: 9999
      initialDelaySeconds: 5
      periodSeconds: 5 ' >tcp-readiness.yml

Assigning Pods to Namespace

  • 把這台新建的pod加到myring這個namespace裡面
$ echo 'apiVersion: v1
kind: Pod
metadata:
  name: n1
  namespace: myring    #這行
  labels:
    name: n1
spec:
  hostname: n1
  containers:
  - image: quay.io/cloudwalker/busybox
    command:
      - sleep
      - "3600"
    name: n1 ' > pod-n1.yaml
bigred@m1:~$ kubectl apply -f pod-n1.yaml
Error from server (NotFound): error when creating "pod-n1.yaml": namespaces "myring" not found
  • 失敗的原因是因為系統找不到myring的namesapce。
bigred@m1:~$ kubectl create namespace myring
namespace/myring created
  • 先創一個myring的namesapce。
bigred@m1:~$ kubectl apply -f pod-n1.yaml
pod/n1 created
bigred@m1:~$ kg pods -n myring
NAME   READY   STATUS    RESTARTS   AGE
n1     1/1     Running   0          2m23s
  • 如果只有打kg pods會找不到,因為這個命令式在deafault namespace裡面找,後面要多加-n myring才能看到新建的pod。

  • 可以在同一個 k8s 叢集中,新增出隔離環境給不同的使用者使用
  • 並且 namespace 可以設定 firewall 阻隔之間的網路傳輸 (v1.2x 後才有的)
  • 可以針對 namespace 來限制硬體資源 (CPU,memory) 等

tags: Kubernetes