接下來的幾天就是介紹各種k8s元件囉
不過都只po比較簡單的
只是一些學習筆記,後面幾天甚至還有沒頭沒尾的主題
所以還是建議看官網文件喔~
中文的話推薦先看這2篇喔:
# 列出元件
$ kubectl get nodes
$ kubectl get pods
$ kubectl get pod [pod name]
$ kubectl describe pod tomcat-deployment-3392291-33388
# 將 deployment、pod等資源,Expose 一個 port (TCP/UDP)
$ kubectl expose deployment tomcat-deployment --type=NodePort service "tomcat-deployment" exposed
# 把1~n個127.0.0.1 local的port,forward到1個pod
$ kubectl port-forward <pod Name> LOCAL_PORT : REMOTE_PORT
$ kubectl port-forward tomcat-deployment-3392291-33388 5000:6000
# 連接到pod的container
# 獲取container的output
$ kubectl attach <pod name> -c <container>
$ kubectl attach 123456-7890 -c ruby-container
# 進到 ruby-container 的 bash
$ kubectl attach 123456-7890 -c ruby-container -i -t
# 在container執行command
# 跑command,必須用two dashes (--)分隔command
$ kubectl exec 123456-7890 -i -t -- ls -t /usr
# 切到bash
$ kubectl exec 123456-7890 -c ruby-container -i -t -- bash -il
# 假設有個database 的 container (跑mysql),還蠻實用的
$ kubectl exec database -i -t -- mysql -u root -p
Enter password:
mysql> show database;
mysql> \q
Bye~啾咪
# 更新pod的label,label就像docker image裡的tag一樣,非常重要
$ kubectl label pods foo unhealthy=true
# 在pod把container跑起來
$ kubectl run nginx
--image=nginx
--replicas=1 # 維持container的instance數量
--labels="fun=webserver,env=prod" # 設定labels,很重要
--env="DNS_DOMAIN=cluster" --env="POD_NAMESPACE=default" # 給環境變數
--port=8080 # 讓這個container expose port 5701
# --replicas=2以上我不知道--port要怎麼指定??
$ kubectl get pods -n kube-system
會有一個STATUS欄位
$ kubectl get deployments
$ kubectl rollout status deployment nginx-deployment
$ kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
$ kubectl rollout history
幾乎大部分的資源都能設labels(可以設很多),設的labels方便filter出來(selectors)
例如:
我們要對node設label
$ kubectl get nodes
# minikube
$ kubectl label node minikube nodeType=localTest # 可以用指令設,也可以寫在yaml檔
$ kubectl describe node minikube
spec:
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
nodeSelector: # here!!
nodeType=localTest
$ kubectl apply -f ./nginx-deployment.yaml
另一個範例:
# 對一個node加label
$ kubectl label nodes node1 hardware=high-spec
# 可以在pod的yaml檔指定要跑在哪個node上~
nodeSelector:
hardware:high-spec
# 列出nodes的labels
$ kubectl get nodes --show-labels
判斷一個pod的服務是不是正常運作,k8s一些方式可檢查
服務掛掉的話,可以再自動化補救
這個很重要喔,以後不用等客戶打來罵,工程師再手動重啟伺服器
可以定義在Deployment或Pod
template:
metadata:
labels:
app: nginx # 非唯一、1個object可設很多個labels
spec:
replicas:3
containers:
- name: nginx
image: nginx:1.15.4
ports:
- containerPort: 80
# livenessProbe:看是不是running
# 如果check fail,container會被restarted
# 使用時機,container三不五時會出錯
livenessProbe:
failureThreshold:3 # 連續失敗3次就刪掉重開一個新的
httpGet:
path: /
port:80
initialDelaySeconds:30
periodSeconds:30
successThreshold:1
timeoutSeconds:30
# readinessProb:服務是已ready,只有在startup時測試,測試成功後才會有負載
# 如果check fail:
# 1、container「不會」被restarted
# 2、pod's IP 會從service中刪除 # 這個我不確定,以後有用到再試了
readinessProb:
httpGet:
path: /
port:80
initialDelaySeconds:15
periodSeconds:5
$ kubectl create -f ./nginx-deployment.yaml
$ kubectl get pods # 應該會跑3個pod
$ kubectl describe deployment pod nginx-22342342-o234a # 就可以看到一直送出的httpGet 成功、失敗的次數
# 就可以看到這個pod裡的container,有liveness,及相關probe的資訊
# watch -n 1 每隔1秒重複執行kubectl get pods指令
$ watch -n 1 kubectl get pods
$ kubectl get componentstatuses