一、創建pod的兩種方式
1.命令方式
①創建命令:
#kubectl run kubia --image=luksa/kubia --replicas=3
②查看資源:
#kubectl get pod -o wide
2.文件方式
#vim nginx-master.yaml
apiVersion: extensions/v1beta1 #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment #創建資源類型爲Deployment
metadata: #該資源元數據
name: nginx-master #Deployment名稱
spec: #Deployment的規格說明
replicas: 3 #指定副本數爲3
template: #定義Pod的模板
metadata: #定義Pod的元數據
labels: #定義label(標籤)
app: nginx #label的key和value分別爲app和nginx
spec: #Pod的規格說明
containers:
- name: nginx #容器的名稱
image: nginx:latest #創建容器所使用的鏡像
①執行創建命令
#kubectl create -f nginx-master.yaml
②查看創建的資源
#kubectl get deployments -o wide
#kubectl get pod
二、進入pod
進入pod kubia-66c8b6d4fc-qhsrd(master節點)
#kubectl exec -it kubia-66c8b6d4fc-qhsrd bash
三、標籤
標籤其實就是一對key/value,可以附加到資源的任意鍵值對,標籤可以用來劃分特定組的對象,用以選擇具有改確切標籤的資源。
1.pod使用標籤
①pod指定標籤
#kubectl run http-label --image=httpd --labels=“app=web,env=prod”
②查看pod的標籤
#kubectl get pod -l app --show-labels
使用標籤篩選pod,通過-l app參數可篩選所有標籤爲app的pod
③修改現有標籤
#kubectl label pod http-label-7cf498876f-59mws env=debug --overwrite
#kubectl get pod --show-labels
④刪除標籤
#kubectl label pod http-label-7cf498876f-59mws env-
2.通過標籤指定pod創建的節點
給node節點打標籤
#kubectl label nodes master node=master
#kubectl label nodes node1 node=node1
#kubectl label nodes node2 node=node2
指定node創建pod
#vim httpd-node.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: httpd-node
spec:
template:
metadata:
labels:
env: prod
spec:
containers:
- name: httpd-node
image: httpd:latest
nodeSelector:
node: master
執行創建命令
#kubectl apply -f httpd-node.yaml
四、命名空間
Namespace是對一組資源和對象的抽象集合,比如可以用來將系統內部的對象劃分爲不同的項目組或用戶組。常見的pods, services, replication controllers和deployments等都是屬於某一個namespace的(默認是default)
1.查看命名空間
#kubectl get ns
2.查看指定命名空間的pod
#kubectl get pod --namespace=default
#kubectl get pod -n kube-system
3.創建命名空間
文件方式創建test01-namespace.yaml
#vim /data/shell/test01-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: test01-namespace
執行創建命令
①#kubectl apply -f test01-namespace.yaml
命令方式:
②#kubectl create ns test02-namespace
4.pod指定命名空間
①指定創建pod的命名空間爲test01-namespace
#kubectl run httpd --image=httpd -n test01-namespace
②查詢pod
#kubectl get pods -n test01-namespace
③命名空間切換
#alias kcd=‘kubectl config set-context $(kubectl config current-context) --namespace’
#kcd test01-namespace
五、擴容/縮容
創建文件nginx-scale.yaml並新建資源
apiVersion: extensions/v1beta1 #描述文件遵循extensions/v1beta1版本的Kubernetes API
kind: Deployment #創建資源類型爲Deployment
metadata: #該資源元數據
name: nginx-scale #Deployment名稱
spec: #Deployment的規格說明
replicas: 3 #指定副本數爲3
template: #定義Pod的模板
metadata: #定義Pod的元數據
labels: #定義label(標籤)
env: prod #label的key和value分別爲app和nginx
spec: #Pod的規格說明
containers:
- name: nginx-scale #容器的名稱
image: nginx:latest #創建容器所使用的鏡像
①執行創建
#kubectl -apply -f nginx-scale.yaml
②查看資源
③文件方式擴容:通過修改文件中參數replicas的值並重新執行kubectl apply命令即可實現pod的擴縮容
④命令方式
#kubectl scale deployment nginx-scale --replicas=1
六、failover
1.pod節點分佈查看
#kubectl get pod -o wide --all-namespaces
2.faillover測試
節點node2關機
查看node狀態和pod分佈
#kubectl get pod -o wide --all
node2狀態爲NotReady且之前在該節點的pod被遷移至master或者node1.當node2恢復後,運行在該節點的Pod會被刪除,且遷移至master和node1的Pod不會重新調度回到node2。
七、升級及回滾
1.創建deployment
#vim nginx-roll.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-roll
namespace: test02-namespace
spec:
selector:
matchLabels:
env: prod
replicas: 3
template:
metadata:
labels:
env: prod
spec:
containers:
- name: nginx-roll
image: nginx:1.16
創建deployment nginx-roll,副本數爲3,namespace爲test02-namespace,nginx版本爲1.16,–record參數會記錄歷史版本號。
#kubectl apply -f nginx-roll.yaml --record
查看部署資源pod
2.升級
升級的方式有多種,比如[kubectl edit deployments -n test02-namespace nginx-roll]方式,直接修改nginx-roll.yaml文件、kubectl set image方式等。
①修改文件方式
#sed -i ‘s/image: nginx:1.16/image: nginx:1.17/g’ nginx-roll.yaml
#kubectl apply -f nginx-roll.yaml --record
#kubectl rollout status deployment -n test02-namespace nginx-roll
②kubectl set image方式
#kubectl set image deployment -n test02-namespace nginx-roll nginx-roll=nginx:1.17.5
3.回滾
①查看deployments版本
#kubectl rollout history deployments -n test02-namespace nginx-roll
②查看deployment具體版本信息
#kubectl rollout history deployments -n test02-namespace nginx-roll --revision=1
③回滾至上一個版本
#kubectl rollout undo deployment -n test02-namespace nginx-roll
④查看
#kubectl rollout status deployment -n test02-namespace nginx-roll
⑤回滾至指定版本
#kubectl rollout undo deployment -n test02-namespace nginx-roll --to-revision=1
⑥查看
⑦查看Replicasets
#kubectl get replicasets -n test02-namespace -o wide
可以看到升級過程中replicaset保留了修改的歷史版本信息。
八、內網訪問
1.創建pod
#vim web-svc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-svc
namespace: test02-namespace
spec:
selector:
matchLabels:
app: web-svc
replicas: 3
template:
metadata:
labels:
app: web-svc
spec:
containers:
- name: web-svc
image: httpd:latest
#kubectl apply -f web-svc.yaml
2.內網訪問
創建service
#vim web-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: web-svc
namespace: test02-namespace
spec:
selector:
app: web-svc
ports:
- protocol: TCP
port: 8080
targetPort: 80
①創建內網service
#kubectl apply -f web-svc.yaml
②查看創建的service
#kubectl get service -n test02-namespace
③修改index.html
master節點:echo '<html><body><h1>It works!web-svc-58956c55fc-z6msf</h1></body></html>'>index.html
node1節點:echo '<html><body><h1>It works!web-svc-58956c55fc-dw5kk</h1></body></html>'>index.html
node2節點:echo '<html><body><h1>It works!web-svc-58956c55fc-bcpbx</h1></body></html>'>index.html
④內網訪問pod
#for i in {1…10};do sleep 1;curl 10.102.203.64:8080;done
3.外網訪問
修改service
新增’type: NodePort’和’nodePort: 30002’,通過NodePort方式外網訪問pod,映射端口爲30002,重新kubectl apply。(參考內網訪問)
apiVersion: v1
kind: Service
metadata:
name: web-svc
namespace: test02-namespace
spec:
type: NodePort
selector:
app: web-svc
ports:
- protocol: TCP
nodePort: 30002
port: 8080
targetPort: 80
外網訪問pod
#for i in {1…10};do sleep 1;curl 192.168.3.183:30002;done
九、日誌查看
使用kubectl logs命令可獲取pod日誌
1.查看最近的日誌
#kubectl logs web-svc-58956c55fc-bcpbx -n test02-namespace --tail=20
‘–tail=20’:查看命名空間test02-namespace下web-svc-58956c55fc-bcpbx最近20行的日誌,
2.查看前一個容器的日誌
#kubectl logs web-svc-58956c55fc-bcpbx -n test02-namespace --previous
3.通過標籤查看日誌
#kubectl logs -lapp=web
查看標籤爲‘app=web’的日誌;’-lapp=web’該日誌是標籤爲’app=web’的合集
十、刪除pod
1.通過刪除deployment刪除pod
通過deployment創建pod可以直接刪除deployment
#kubectl delete deployments kubia
2.通過刪除namespace刪除pod
①刪除namespace中所有資源
#kubectl delete all --all -n test01-namespace
②直接刪除namespace
#kubectl delete ns test01-namespace
總結:
直接刪除pod會重建一個新的不同名的pod;
直接刪除replicasets會重建同名replicasets,其下所有pod則會刪除重建且名字不同;
直接刪除deployments則其下的replicasets和pod將一起被刪除;