kubectl cluster-info
*// app.js
const http = require('http');
const os = require('os');
const ip = '0.0.0.0';
const port = 3000;
const hostname = os.hostname();
const whoami = process.env['WHOAMI'] || 'Anonymous';
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end(`Hi, I’m ${whoami}, from ${hostname}.\n`);
});
server.listen(port, ip, () => {
console.log(`Server running at http://${ip}:${port}/`);
});*
-
將伺服器本機IP定義為0.0.0.0而不是127.0.0.1。因為後者僅僅適用於IP迴路定址。而這段程式需監聽來自一個叢集IP的請求(由0.0.0.0捕獲請求)。
-
將“Hello World”訊息分拆為2個變數:主機名,提供請求響應的一個副本節點的標識;WHOAMI環境變數,在部署時設定,預設值為“Anonymous”。
node app.js # 開啟連結 http://localhost:3000測試
# Dockerfile
FROM node:8
COPY app.js .
ENTRYPOINT [“node”, “app.js”]
docker build -t myrepo:mytag .
採用GCR,就替換為 gcr.io/project-name/image-name,採用預設的DockerHub,就替換為 user-name/image-name,用非 latest的任何詞語,來替代 mytag。tag不能重覆,如果您是和多人一起學習本課程時,請確保這點。最後的那個點不能遺漏,它表示用當前目錄環境構建背景關係。
docker push myrepo:mytag
kubectl run myapp --image myrepo:mytag --replicas 2
-
Kubectl將Deployment物件傳送給執行在Kubernetes叢集內的API伺服器—— kube-apiserver。
-
kube-apiserver將Deployment資訊儲存到叢集內分散式鍵值對儲存etcd中,etcd為Kubectl請求提供響應。
-
Kubernetes負責監控Deployment及其他事件的控制器管理器kube-controller-manager,將為Deployment建立一個ReplicasSet副本,並將其傳送到kube-apiserver。一個ReplicaSet就是一個Deployment的版本。在滾動更新時,將建立一個新的ReplicaSet,並逐步擴充套件到預先配置的期望副本數,而舊的ReplicasSet數量逐步變為零。這整個過程都是採用非同步機制。
-
kube-apiserver將ReplicaSet資訊儲存到etcd中。
-
kube-controller-manager同樣以非同步的方式為ReplicaSet建立2個或以上的Pod,並將其傳送給kube-apiserver。Pod是Kubernetes的基本單元,是搭載1或多個共享Linux cgroup和名稱空間的容器環境。
-
kube-apiserver將Pod資訊儲存到etcd中。
-
負責監視Pod事件的Kubernetes排程器kube-scheduler,將逐步更新每個Pod,為其分配到某個節點,並將更新的資訊發送回kube-apiserver。
-
kube-apiserver在etcd中更新Pod狀態。
-
最後,節點上執行的kubelet會實時監控Pod,併在Pod啟動了容器。
kubectl get deployments # plural or singular, or deploy for short
kubectl get replicasets # or rs
kubectl get pods # or po
kubectl get deployment myapp
kubectl get deployment myapp -o yaml
kubectl describe deployment myapp
kubectl get deployments --show-labels
kubectl get replicasets --show-labels
kubectl get pods --show-labels
kubectl get replicasets -L run
kubectl get pods -l run=myapp
還可以手動新增新的標簽。如:
kubectl label deployment myapp foo=bar
kubectl delete pods -l run=myapp
# 等待一會兒後再執行
kubectl get pods -l run=myapp
kubectl port-forward deployment/myapp 3000
kubectl port-forward deployment/myapp 5000:3000
kubectl expose deployment myapp --port 80
# 因為本地裝置埠不能用,採用標準的HTTP埠
kubectl get service # or svc
kubectl describe service myapp
kubectl get endpoints myapp
kubectl run mytest -it --rm --image alpine # Alpine很輕量
# inside mytest:
apk add curl
curl http://myapp # “Hello World…”
exit
-
-t或–tty,分配一個TTY終端
-
-i或–stdin保持stdin開啟
-
–rm退出時刪除Deployment
kubectl logs deployment/myapp
在我們的教學中,日誌較少,但實際生產應用的日誌會詳細且多很多。尤其是出問題的時候。可以通行引數,按日誌量—since (1m),日誌時間–since-time (2018–11–01T16:30:00)或尾部記錄數 –tail (20)來設定輸出結果。其他的引數選項還包括 –follow(-f),–previous(容器持續崩潰),–timestamps(應用沒有記錄時間戳)。最後將日誌輸出到檔案和進行您所需的分析。如:
kubectl logs deployment/myapp --since 5m > log.txt
grep error log.txt
# more grep
POD_NAME=$(kubectl get pods -l run=myapp -o
jsonpath={.items[0].metadata.name})
kubectl exec $POD_NAME -it sh # 在容器內開啟一個互動式shell。
# 容器內的執行段樣本:
node --version
echo $WHOAMI
exit
# 傳回到本地機器
kubectl cp $POD_NAME:app.js remote-app.js # 用於理解容器內執行的樣本
kubectl get deployment myapp -w
# 在第二個終端:
kubectl get replicasets -w -l run=myapp
# 在第三個終端:
kubectl get pods -w -l run=myapp
# 在第四個終端:
kubectl set env deployment/myapp WHOAMI="HAL 9000"
kubectl scale --replicas 3 deployment myapp
kubectl get pods -l run=myapp -o wide # 檢視NODE列
NODE_NAME=$(kubectl get pods -l run=myapp -o
jsonpath={.items[0].spec.nodeName})
kubectl patch deployment myapp -p
'{"spec":{"template":{"spec:{"nodeName":"'$NODE_NAME'"}}}}'
kubectl get pods -l run=myapp -o wide
kubectl get -o yaml --export:
kubectl get deployment myapp -o yaml --export > myapp-deployment.yaml
kubectl get service myapp -o yaml --export > myapp-service.yaml
# ReplicaSet和pod是被控制物件,所以不需要進行manifest。
# myapp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
run: myapp
template:
metadata:
labels:
run: myapp
spec:
containers:
- name: myapp
image: psdocker/myapp:mytag
env:
- name: WHOAMI
value: "HAL 9000"
# myapp-service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
selector:
run: myapp
ports:
- port: 80
targetPort: 3000
kubectl delete deployment myapp
kubectl delete service myapp
kubectl apply -f myapp-deployment.yaml -f myapp-service.yaml
-
https://kubernetes.io/docs/reference/#api-reference
-
https://www.manning.com/books/kubernetes-in-action
-
https://kubernetes.io/docs
朋友會在“發現-看一看”看到你“在看”的內容