將所需要的程式碼、套件、執行檔、組態檔等等內容進行封裝在一起的獨立容器,具有隔離性且輕量,確保應用程序可以在不同環境中一致。
為 Kubernetes 中創建和管理的、最小的可部署的單元,在K8s中會運行不同種類的應用程式,一個Pod相當於一個應用程式,在一個Pod內部可以包含1~多個的container,同一個Pod裡面的container內會共享相同的網路資源。
Node 是 Kubernetes 集群中的工作機器,就像是一台虛擬機,這個節點負責管理其中的pod以及pod當中的container。
K8s會自診斷這個節點是否為可運行狀態,不然集群活動中都會忽略不健康狀態的Node。
Node 名稱必須是合法的 DNS 子域名。
kubectl config get-contexts
:取得目前有哪些集群
kubectl config use-context <context_name>
:選擇使用哪一個集群
kubectl apply -f <file_name>
:運行一個檔案
kubectl get nodes
:取得目前有哪些節點
kubectl get pods
:取得目前有哪些部署單位。(默認是查看default namespace項下的pods)
kubectl get pods -A
:取得目前有哪些部署單位(不限定namespace)。
kubectl get pod -n <name>
:指定查看某一個namespace
中有哪些pod
kubectl get namespace
:取得目前有哪些命名空間
kubectl create ns <name>
:創建一個命名空間
kubectl run <自定義name> --image=<image_name>:<tag>
:啟動一個pod(會以指定的image以及版本來啟動這個pod)
這邊預設是會先使用docker從DockerHub中拉取image下來,再使用這個image run 構建出一個pod。(使用 docker images 也會看到自己多了一個 nginx的image)
當有啟動pod之後,在dashboard也可以看到相關訊息
點選pod名稱,就可以看到這個pod的詳細資訊
kubectl delete pos <image_name> -n <namespace_name>
:刪除一個在指定的namespace中的image。
kubectl describe pod <pod_name>
:查看pod的詳細資訊(default namespace)
kubectl describe pod -n <namespace_name> <pod_name>
:查看指定namespace的pod的詳細資訊。(如果namespace不是default,就需要指定
kubectl logs -n <namespace_name> <pod_name>
:取得指定的namespace的指定pod的log
建立一個yml檔案,撰寫要使用到的image及相關配置,使用 kubectl apply -f <file_name>.yml
執行,就會在k8s的namespace下創建一個名為nginx-tomcat的pod,而這個pod中的image使用的是nginx:latest以及tomcat:latest。
(這邊一樣會是從docker pull image下來)
類似於docker-compose的概念。
apiVersion: v1
kind: Pod
metadata:
name: nginx-tomcat
namespace: k8s
spec:
containers:
- image: nginx:latest
name: nginx
- image: tomcat:latest
name: tomcat
Deployment 區塊
Service 區塊
Service 監聽端口8090,並轉發到Pod的80端口。
使用 selector 將 Service 與 Deployment 中的 Pod 關聯。
type: NodePort:表示會隨機指定一個端口號供外部連接,也可以使用nodePort: 30000指定端口。
Ingress 區塊
透過Ingress域名 tw.app.com暴露資源在外,會映射service的8090端口。
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 8090
targetPort: 80
type: NodePort
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app-ingress
spec:
ingressClassName: ingress
rules:
- host: tw.app.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: my-app-service
port:
number: 8090
執行:kubectl apply -f app-test.yaml
取得Service的連線資訊:kubectl get service my-app-service
使用 http://localhost:32600/ 連接,看到以下頁面就表示連接成功囉!
也可改變本地映射Ingress host名稱
mac 使用 sudo nano /etc/hosts
進到檔案編輯環境,把127.0.0.1本地拜訪的ip,改為host名稱
接著使用 tw.app.com:32600
就可以連接成功