Skip to main content

K8S 101

Kubectl

命令基本格式

kubectl <action> <resource>
# Action, Resource都不分大小寫

列出所有pod

kubectl get pods

檢視name是app-7yh8的pod的狀態

kubectl describe pods app-7yh8

列出整座cluster的所有pod

kubectl get pods --all-namespaces

要小心的是,edit, delete這些action,執行下去就會對cluster目前的資源產生修改

kubectl edit pod app-7yh8

剛開始進有跑服務的K8S Cluster,describe, get這些不會有side-effect的命令可以先試試

Master Node & Worker Node

Node是指加入Cluster的機器本身 一般來說就是指實體機器或VM

  • Master Node
    • 不能跑Pod
    • 最小3個,必須是奇數個,彼此在資料不一致時會透過選舉取得共識
  • Worker Node
    • 跑Pod的地方

看目前Cluster的Node清單

kubectl get node

加上-o wide,可以在清單中看到更細的資訊,例如各Node的IP Address

kubectl get node -o wide

Namespace

  • 抽象的服務空間,在同一個namespace下的資源,彼此溝通會比較方便
    • 有些資源無法跨Namespace被存取,例如Secrets, Configmap
  • 有幾個保留的namespace
    • default
      • 沒有指定namespace的資源會起到default 這個namespace下
    • kube-system
      • 保留給Cluster本身使用,跑在這個namespace的資源都屬於Cluster的基礎服務的一部份
kubectl get namespaces

# 可以簡寫
kubectl get ns

Pod / Deployment / ReplicaSet / DaemonSet / Job

  • Pod: 最小被調度的單位
  • Deployment: Declaration,一般來說工程師操作到這個層級
    • ReplicaSet
    • DaemonSet
  • Job

Selector & Label

# 選擇所有key=value的pod
kubectl get pods -l key=value

Service / Ingress

  • Service: 提供服務的進入點

    • 因為Pod會被cluster在不同情況下調度移動,使用Service指向Pod,能夠在Pod被調度時維持相同的存取指定
    • By Selector
    • 小心太寬鬆的selector,會讓Service將流量導向錯誤的目標
  • Ingress: 將Pod, HTTP/WS的entrypoint

    • 一般來說by Service Name

Configmap / Secret

  • Secret, Configmap只能在同一個NS

ServiceAccount

  • AKS/GKE 給予pod permission的主要依據

Kubectl Config & Context

  • kubectl其實都是在跟K8S Cluster Master Node的API溝通
    • 所以有設定,有auth token之類的資訊
  • kubectl在本地執行時,相關的設定以及credentials
    • ~/.kube
kubectl config set-context --current --namespace some-ns

Helm Chart

https://helm.sh/docs/helm/helm_create/

新建一個Helm Chart

helm create

主要的幾個檔案

  • Chart.yaml
  • values.yaml
  • ./templates
helm upgrade application-name ./charts  --install --create-namespace --atomic --debug --timeout 360s \
--namespace ${{ env.namespace }} \
--values "${HELM_VALUE_FILE}" \
--set "Var1=123"
--set "Var2=456"

Tools

AWS CLI https://github.com/venth/aws-adfs brew install awscli

AWS ADFS https://github.com/venth/aws-adfs

Helm brew install helm

Kubectl brew install kubernetes-cli

K9S/Lens https://k8slens.dev/ https://github.com/derailed/k9s