最近公司專案會需要使用到kubernetes(k8s),就在這邊紀錄一下相關的名詞以及會使用到的指令。

Pod

pod: K8s運作的最小單位,一個 Pod 對應到一個應用服務(Application)

config

  • .kind: Pod
  • .metadata.name: 定義該pod的名稱
  • .metadata.labels: 定義該pod相關標籤,提供給service去選取對應的pod
  • .spec.containers: 定義該pod使用的docker相關資訊
  • .spec.containers[*].ports[*].containerPort: 定義該pod expose出來的port

k8s config example:

apiVersion: v1
kind: Pod
metadata:
  name: mongo
  labels:
    app: mongo
spec:
  containers:
  - name: mongo
    image: mongo:4-focal
    ports:
    - containerPort: 27017

Deployment

定義部屬pod的相關策略。

Config

  • .kind: 定義此config要啟用的k8s元件的類型
  • .metadata.name: 定義deployment的名稱
  • .spec.replicas: 定義要建多少個”複製”pods
  • .spec.selector: 定義deployment要如何找到需要管理的pods
  • .spec.template: 建出來的pods相關設定
    • .metadata.labels: 標註pod
    • .spec: 定義與pods相關配置

k8s config example:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: qrux-portal-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: qrux-portal-pods
  template:
    metadata:
      labels:
        app: qrux-portal-pods
    spec:
      containers:
        - name: qrux-portal-page
          image: qnapcharliehsu/qrux-portal-page:1.0.0
          ports:
            - name: http
              containerPort: 80

Service

定義 Pods 如何被取用

Config

  • .spec.type: 定義service類型 ([ ClusterIP | NodePort | LoadBalancer | ExternalName ])
  • .spec.selector: 定義需要服務連結的pods的label
  • .spec.ports[*].port: 定義service需要開哪一個port
  • .spec.ports[*].targetPort: 定義需要連接pod的哪一個port

Type:

  • ClusterIP: expose service的cluster的內部IP,只能被cluster中的各元件存取
  • NodePort: expose service在Node IP中固定的port上
  • LoadBalancer: expose service在cloud所提供的load balancer上,在minikube上使用的話,需使用minikube tunnel讓minikube建立load balancer連線

Notes:

  • 使用kubectl port-forward 功能可以將minikube node上的service expose 出來
$ kubectl port-forward --address 0.0.0.0 service/qrux-portal-service 8080:8080

k8s config example:

apiVersion: v1
kind: Service
metadata:
  name: qrux-portal-service
spec:
  type: LoadBalancer
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 80
  selector:
    app: qrux-portal-pods

StatefulSet

與deployment雷同,但是StatefulSet所創造出來的pod會有固定的名稱,不會因為重建而導致名稱往上疊加。搭配Persistent Volumes適合用來建立資料庫相關的服務。

Commands

跑yaml檔(用來啟用deployments, services或pod等等)

$ kubectl apply -f ${k8s_yaml}

列出k8s pods

$ kubectl get pods

列出k8s deployments

$ kubectl get deployments

可以使用kubectl get來列出各種k8s物件

刪除使用該yaml檔跑的k8s物件

$ kubectl delete -f ${k8s_yaml}

觀察deployment/statefulset rollout的狀態

$ kubectl rollout status deployment/${deployment_name}

顯示某pods詳細資訊,可用來debug

$ kubectl describe pods ${pod_name}