Kubernetes 學習筆記

# 前言

Kubernetes 的學習筆記, 內容未整理




# 環境

OS: MacOS
Hypervisor: VMware Fusion




# 安裝

官方文件


# 安裝虛擬機

  • 確認 macOS 有無支援虛擬機

    sysctl -a | grep -E --color 'machdep.cpu.features|VMX'
  • 下載並安裝


# 安裝 minikube

brew cask install minikube


# 安裝 kubectl

參考文件

  • 這邊是直接安裝 gcloud sdk, 參考文件

  • 設定 kubectl auto completion
    打開 zshrc

    vim ~/.zshrc

加入設定檔

source <(kubectl completion zsh)


# 啟動 minikube

參考文件

  • 啟動 minikube start --vm-driver=<driver_name>, 在這個例子中, 就是 minikube start --vm-driver=vmwarefusion




# kubectl

# config

  • 顯示目前有的 contexts

    kubectl config get-contexts
  • 取得目前套用的 contexts

    kubectl config current-contexts
  • 刪除指定 contexts

    kubectl config delete-contexts
  • 從 kubeconfig 刪除指定叢集

    kubectl config delete-cluster
  • 取得 kubeconfig 中定義的叢集

    kubectl config get-clusters
  • 從 kubeconfig 檔案中重新命名 context

    kubectl config rename-context


# create

create -f FILENAME

  • 建立元件
    kubectl create component componentName


# secret generic

generic NAME [--type=string] [--from-file=[key=]source] [--from-literal=key1=value1] [--dry-run]

  • 建立一個 secret, 基於一個檔案, 資料夾, 或是指定的值
  • 一個單一個 secret 可能會包含一個或多個 key/value 組
  • 當基於檔案建立 secret, key 預設會是檔案名稱, value 為檔案內容
  • 如果檔名是不合法的, 而你希望選擇你自己的, 可以自己指定
  • 當基於資料夾建立 secret 時. 每個資料夾內合法的檔名都會成為一個 key, 被打包進 secret, 任何除了 regular file 之外的內容都會被忽略 (e.g. subdirectories, symlinks, devices, pipes, etc).


# configMap


# logs

  • 取得 log

    kubectl logs componentName
  • 取得即時 log
    logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]

kubectl logs -f componentName


# exec

exec (POD | TYPE/NAME) [-c CONTAINER] [flags] -- COMMAND [args...]




# 元件

# Pod


# Service




# Dashboard

# 安裝

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml


# 開啟

kubectl proxy


# 取得 token

kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | awk '/^deployment-controller-token-/{print $1}') | awk '$1=="token:"{print $2}'




# Kubectl CLI




# YAML

  • YAML 檔案支援使用 Tab 縮進嗎?
    不支援

  • YAML 檔案中, 什麼是註解?
    #

  • 以下的 YAML 格式, 若使用 JSON 呈現的話, 是如何?

    {
    "apiVersion": "v1",
    "kind": "pod"
    }

---
apiVersion: v1
kind: Pod
  • 以下的 YAML 格式, 若使用 JSON 呈現的話, 是如何?
    {
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
    "name": "kube100-site",
    "labels": {
    "app": "web"
    }
    }
    }

---
apiVersion: v1
kind: Pod
metadata:
name: kube100-site
labels:
app: web
  • 以下的 YAML 格式, 若使用 JSON 呈現的話, 是如何?
    {
    "args": ["Cat", "Dog", "Fish"]
    }
args
- Cat
- Dog
- Fish
  • 以下的 YAML 格式, 若使用 JSON 呈現的話, 是如何?
    {
    "apiVersion": "v1",
    "kind": "Pod",
    "metadata": {
    "name": "kube100-site",
    "labels": {
    "app": "web"
    }
    },
    "spec": {
    "containers": [{
    "name": "front-end",
    "image": "nginx",
    "ports": [{
    "containerPort": 80
    }]
    }, {
    "name": "flaskapp-demo",
    "image": "jcdemo/flaskapp",
    "ports": [{
    "containerPort": 5000
    }]
    }]
    }
    }

---
apiVersion: v1
kind: Pod
metadata:
name: kube100-site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
- name: flaskapp-demo
image: jcdemo/flaskapp
ports:
- containerPort: 5000




# 靜態 Pod

  • Kubernetes 中, 靜態 Pod 可以通過 kubectl 管理嗎?
    不行

  • Kubernetes 中, 如何建立靜態 pod?
    在 node 的 /etc/kubernetes/manifests 資料夾中, 新增 YAML 檔

  • Kubernetes 中, 如何刪除靜態 pod?
    將該 YAML 檔案移除

  • Kubernetes 中, 靜態 pod 由誰管理?
    特定節點上的 kubelet




# RBAC

  • Kubernetes 中, RBAC 的全寫是什麼?
    Role-based access control

  • Kubernetes 中, 如何啟用 RBAC?
    在 apiserver yaml 檔案中添加 --authorization-mode=RBAC

  • Kubernetes 中, Role 和 ClusterRole 的差別?
    Role 適用於單個命名空間, ClusterRole 適用於整個叢集

  • Kubernetes 中, 叢集中有哪三種 subject 資源?
    User Account, Group, Service Account




# Questions and Answers

In Kubernetes, 如何列出 pods?

kubectl get pods

In Kubernetes, 如何暴露一個 deployment, 並建立一個外部的平衡負載?

kubectl expose deployment nginx –port 80 –type LoadBalancer

In Kubernetes, 如何列出 service?

kubectl get services

In Kubernetes, Pod 內可以裝幾個容器?

一個或多個

In Kubernetes, 什麼元件提供了 namespace?

Pods

In Kubernetes, 一個 Pod 有幾個 IP?

一個

In Kubernetes, 如何利用 YAML 檔案建立一個 pod

kubectl create -f configFile.yaml

In Kubernetes, 如何取得物件的更多資訊?

kubectl describe component componentName

In Kubernetes, 假設我本地的 port 為 10080, Pod 的 port 為 80, 如何將兩個連接起來?

kubectl port-forward podName 10080:80

In Kubernetes, 如何取得 log

kubectl logs [-f] componentName

In Kubernetes, 如何在容器內開一個 shell?

kubectl exec podName -c containerName -it –stdin /bin/sh

In Kubernetes, Service 的作用?

提供端點給 Pods

In Kubernetes, Service 如何選擇 Pod?

利用 label

In Kubernetes, Service 提供給 Pod 的存取等級, 有幾種?

三種

In Kubernetes, Service 提供的存取等級中, ClusterIP 有誰可以看見?

只能在叢集內部

In Kubernetes, Service 提供的存取等級中, NodePort 有誰可以看見?

給予叢集內的節點一個外部可以存取的 IP

In Kubernetes, Service 提供的存取等級中, LoadBalancer 有誰可以看見?

從雲端提供者那增加一個平衡負載, 將外部流量經由 Service 導向節點

In Kubernetes, Volume 的生命週期?

跟 Pod 共存亡

kubernetes 中, 同一個 pod 內的 container 可以啟用相同的 port 嗎?

不可, 因為共享一個空間, 若 port 相同會衝突

kubernetes 中, replicaSet 是什麼?

Pod 副本的抽象, 用以擴縮 Pod




# 參考資料

官方文件
Medium
PHP 學習筆記 GCP Deployment Manager - 正式環境

留言

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×