個人博客:點擊這里進入
本次測試的所有問題都必須在指定的cluster配置環境中完成。為盡量減少切換,系統已對問題進行分組,同一cluster內的所有問題將連續顯示。

開啟TAB補全
做題前先配置k8s自動補齊功能,否則無法TAB補全命令:
- 登陸管理節點
kubectl --help | grep bash,此步是為了找關鍵詞completion

sudo vim /etc/profile- 添加
source <(kubectl completion bash)

5.保存退出,source /etc/profile
1.4% k8s
- 設置配置環境 kubectl config use-context k8s
Context
- 為部署管道創建一個新的 ClusterRole 並將其綁定到范圍為特定 namespace 的特定 ServiceAccount
- 創建一個名字為 deployment-clusterrole 且僅允許創建以下資源類型的新ClusterRole:
- Deployment
- StatefulSet
- DaemonSet
- 在現有的 namespace app-team1 中創建有個名為 cicd-token 的新 ServiceAccount。
- 限 於 namespace app-team1 , 將 新 的 ClusterRole deployment-clusterrole 綁 定 到 新 的 ServiceAccount cicd-token。
解答:
1.kubectl create clusterrole deployment-clusterrole --verb=create --resource=Deployment,StatefulSet,DaemonSet
2.kubectl create serviceaccount cicd-token -n app-team1
3.kubectl create rolebinding xxx(隨便起名字) --clusterrole=deployment-clusterrole --serviceaccount=cicd-token:app-team1 -n app-team1
2.4% ek8s
- 設置配置環境 kubectl config use-context ek8s
- 將名為 ek8s-node-0 (vms25)的 node 設置為不可用,並重新調度該 node 上所有運行的 pods
解答:
kubectl drain vms25.rhce.cc --ignore-daemonsets

3.7% mk8s
- 設置配置環境 kubectl config use-context mk8s
- 現有的 kubernetes 集群正在運行的版本是 1.21.0。僅將主節點上的所有 kubernetes 控制平面 和節點組件升級到版本 1.21.1。
- 另外,在主節點上升級 kubelet 和 kubectl。
[start-plane type="4"]確保在升級前 drain 主節點,並在升級后 uncordon 主節點。請不要升級工作節點,etcd,container管理器,CNI 插件,DNS服務或任何其他插件。[/start-plane]--etcd-upgrade=false
kubeadm upgrade apply 1.21.1 --etcd-upgrade=false
解答:
1.登陸官網k8s.io,可以右上角更換語言,點擊Learn Kubernetes Basics
2.搜索upgrade

3.開始升級,步驟官方文檔中都有步驟,步驟如下:
kubectl config use-context mk8s
kubectl get nodes
ssh vms28(28為mk8s的控制平面節點)
sudo su - (需用root用戶執行下方命令)
apt-get update && \ apt-get install -y --allow-change-held-packages kubeadm=1.21.1-00 (安裝kubeadm包)
kubeadm upgrade apply v1.21.1 –etcd-upgrade=false(題中提示etcd不被升級,所以加后面的參數)
kubectl drain vms28.rhce.cc --ignore-daemonsets (升級kubelet和kubectl前騰空節點,官方文檔中流程都有,看着修改就好)
apt-get update && \ apt-get install -y --allow-change-held-packages kubelet=1.21.1-00 kubectl=1.21.1-00(安裝kubelet和kubectl包)
systemctl daemon-reload
systemctl restart kubelet
kubectl uncordon vms28.rhce.cc
4.7%
- 此項目無需更改配置環境
- 首 先 為 運 行 在 https://127.0.0.1:2379 上 的 現 有 etcd 實 例 創 建 快 照 並 將 快 照 保 存 到 /srv/data/etcd-snapshot.db。
- 為給定實例創建快照預計能在幾秒鍾內完成。如果該操作似乎掛起,則命令可能有問題。用 ctrl+c 來取消操作,然后重試。
- 然后還原位於/srv/data/etcd-snapshot-previous.db 的現有先前快照.
提供了一下 TLS 證書和密鑰,以通過 etcdctl 連接到服務器。 CA 證書:/opt/KUIN00601/ca.crt 客戶端證書: /opt/KUIN00601/etcd-client.crt 客戶端密鑰:/opt/KUIN00601/etcd-client.key
解答:
使用root賬戶操作
etcdctl –help 查看是否有snapshot命令,有是版本3無為版本2
若是2.則手動導入3
export ETCDCTL_API=3
不知道命令怎么寫可以etcdctl snapshot save --help
主要三個參數為:-–cacert,--cert,--key
1.保存etcd實例快照:
考試環境:
#etcdctl snapshot save -–cacert=”/opt/KUIN00601/ca.crt” --cert=” /opt/KUIN00601/etcd-client.crt” --key=”/opt/KUIN00601/etcd-client.key” -- /srv/data/etcd-snapshot.db
練習環境:
#etcdctl snapshot save /srv/data/etcd-snapshot.db
2.還原快照
考試環境:
#etcdctl snapshot restore –cacert=”/opt/KUIN00601/ca.crt” --cert=” /opt/KUIN00601/etcd-client.crt” --key=”/opt/KUIN00601/etcd-client.key” /srv/data/etcd-snapshot.db
練習環境:
#etcdctl snapshot restore /srv/data/etcd-snapshot.db
5.7% k8s
- 設置配置環境 kubectl config use-context k8s
- 在 internal 命名空間創建一個名為 allow-port-from-namespace 的確保新的 NetworkPolicy 允 許 namespace internal 中的 Pods 來連接到 namespace big-corp 中的端口 9200。
- 確保新的 NetworkPolicy:
- 不允許對沒有在監聽端口 9200 的 pods 訪問
- 不允許不來自 namespace internal 的 pods 的訪問
解答:
1.先創建題中的命名空間(Namespace)
kubectl configuse-context k8s
kubectl get namespace
kubectl create namespace internal
kubectl create namespace big-corp
kubectl label namespace big-corp name=big-corp
2.打開官網,搜索ingress或egress或networkpolicy,然后第一個網絡策略


3.復制上方yaml代碼,新建yaml文件,例如networkpolicy.yaml,名字隨意起
4.將復制的代碼按照題意改為下圖所示:

kubectl apply -f networkpolicy.yaml
kubectl get networkpolicies.networking.k8s.io -n internal

6.7% k8s√
- 設置配置環境 kubectl config use-context k8s
- 請重新配置現有的部署 front-end 以及添加名為 http 的端口規范來公開現有容器 nginx 的端 口 80/tcp。
- 創建一個名為 front-end-svc 的新服務,以公開容器端口 http。 配置此服務,以通過在排定的節點上的 NodePort 來公開各個 pods。
解答:
kubectl config use-context k8s
kubectl get deployments.apps
kubectl edit deployments.apps front-end (edit編輯時只能使用空格,不要TAB否則保存不了)

ports:
- name: http
containePort: 80
protocol: TCP
創建front-end-svc服務:
kubectl expose –-name=front-end-svc deployment front-end -–port=80 –-target-port=80 –-type=NodePort
7.7% k8s√
- 設置配置環境 kubectl config use-context k8s
- 如下創建一個新的 nginx ingress 資源:
- 名稱:pong
- namespace: ing-internal
- 使用服務端口 5678 在路徑/hello 上公開服務 hello
- 可以使用一下命令檢查服務 hello 的可用性,該命令返回 hello: curl -kL < INTERNAL_IP>/hello/
解答:
1.kubectl config use-context k8s
2.打開官方文檔,搜索ingress,選擇第一個結果即可,進入后復制yaml模板並新建一個yaml文件
3.vim ingress.yaml

4.kubectl apply -f 7-ing.yaml
5.kubectl get ing -n ing-internal
8.4% k8s√
- 設置配置環境 kubectl config use-context k8s
- 將 deployment 從 webserver 擴展至 6pods
解答:
kubectl config use-context k8s
kubectl get deploy
kubectl scale deployment webserver –-replicas=6
kubectl get deploy
9.4% k8s√
- 設置配置環境 kubectl config use-context k8s
- 按如下要求調度一個 pod:
- 名稱:nginx-kusc00401
- image: nginx
- Node selector: disk=ssd
解答:
kubectl run nginx-kusc00401 --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yaml > 9-pod.yaml
加入如下標紅代碼

kubectl apply -f 9-pod.yaml
kubectl get pods
10.4% k8s√
- 設置配置環境 kubectl config use-context k8s
- 檢查有多少個 worker nodes 已准備就緒(不包括被打上 Taint: NoSchedule 的節點),並將數 量寫入/opt/KUSC00402/kusc00402.txt
解答:
Kubectl get nodes
查看節點是否有污點
kubectl describe nodes [vms22.rhce.cc](http://vms22.rhce.cc) | grep Taint
kubectl describe nodes [vms23.rhce.cc](http://vms23.rhce.cc) | grep Taint
echo 1 > /opt/KUSC00402/kusc00402.txt

11.4% k8s√
- 設置配置環境 kubectl config use-context k8s
- 創建一個名字為kucc4的pod,在pod里面分別為以下每個images單獨運行一個app container (可能會有 1-4 個 images):
- nginx+redis+memcached+consul
解答:
kubectl run kucc4 1–image=nginx –1image-pull-policy=IfNotPresent –1dry-run=client -o yaml > 11-pod.yaml
vim 11-pod.yaml(將圖中標紅項復制3次並修改pod名字即可)

kubectl apply -f 11-pod.yaml
kubectl get pod
12.4% k8s√
- 設置配置環境 kubectl config use-context k8s
- 創建名為 app-data 的 persistent volume,容量為 1Gi,訪問模式為 ReadWriteMany。volume 類型為 hostPath,位於/srv/app-data
解答:
1.官方文檔中搜索persistent volume,第一個案例即可

2.vim 12-pv.yaml,按照題意修改

3.kubectl apply -f 12-pv.yaml
4.kubectl get pv
13.7% k8s√
- 設置配置環境 kubectl config use-context k8s
- 創建一個新的 PersistentVolumeClaim:
- 名稱:pvvolume
- class:csi-hostpath-sc
- 容量:10Mi
- 創建一個新的 pod,此 pod 將作為 volume 掛載到PersistentVolumeClaim:
- 名稱:web-server
- image: nginx
- 掛載路徑: /usr/share/nginx/html
- 配置新的 pod,以對 volume 具有 ReadWriteOnce 權限。
- 最后,使用 kubectl edit 或者 kubectl patch 將 PersistentVolumeClaim 的容量擴展為 70Mi,並 記錄此次更改。
解答:
kubectl config use-context k8s
繼續在上題中的官方文檔中找到下方案例:

vim 13-pvc.yaml,講案例復制,注意更改標紅項,其他項刪除(此步目的:創建新的 PersistentVolumeClaim)

kubectl apply -f 13-pvc.yaml
繼續在上題的官方文檔中下滑找到下方案例:

vim 13-pvc-pod.yaml,將案例復制(此步目的:創建一個新的 pod,此 pod並掛載到PersistentVolumeClaim)

kubectl apply -f 13-pvc-pod.yaml

kubectl edit pvc pvvolume –-record,將10Mi改為70Mi(--record目的為記錄此次更改,不加--record的話第三小題沒有分數)

14.5% k8s √
- 設置配置環境 kubectl config use-context k8s
- 監控 pod foo 的日志並:
- 提取與錯誤 unable-to-access-website 相對應的日志行
- 將這些日志行寫入到/opt/KUTR00101/foo
解答:
$ kubectl config use-context k8s
$ kubectl logs foo | grpe unable-to-access-website > /opt/KUTR00101/foo
15.7% k8s
- 設置配置環境 kubectl config use-context k8s
- 在不更改其現有容器的情況下,需要將一個現有的 pod 集成到 kubernetes 的內置日志記錄 體系結構中(例如 kubectl logs)。添加 streamimg sidecar 容器是實現此要求的一種好方法。
- 將一個 busybox sidecar 容器添加到現有的 pod legacy-app。新的 sidecar 容器必須運行一下命令:
/bin/sh -c tail -n+1 -f /var/log/legacy-app.log
- 使用名為 logs 的 volume mount 來讓文件/var/log/legacy-app.log 可用於 sidecar 容器。
不要更改現有容器。不要修改日志文件的路徑,兩個容器必須通過/var/log/legacy-app.log 來訪問該文件
解答:
kubectl config use-context k8s
kubectl get pod legacy-app -o yaml > 15-pod.yaml
vim 15-pod.yaml
1.添加pod及vomuleMount掛載點

2.添加volumes

3.修改掛載目錄及名稱

4.kubectl apply -f 15-pod.yaml
5.刪除legacy-app,否則再運行yaml時會提示legacy-app已存在
kubectl delete pod legacy-app -–force

16.5% k8s√
- 設置配置環境 kubectl config use-context k8s
- 通過 pod label name=cpu-user,找到運行時占用大量 CPU 的 pod,並將占用 CPU 最高的 pod 名稱寫入到文件/opt/KUTR000401/KUTR00401.txt(已存在)
解答:
kubectl top pods -l name=cpu-user
echo "占比最高的機器名" > /opt/KUTR000401/KUTR00401.txt
17.13% ek8s
- 設置配置環境 kubectl config use-context ek8s
- 名為wk8s-node-0(練習環境使用 vms26.rhce.cc)的 kubernetes worker node 處於 Not Ready狀態。調查發生這種情況的原因,並采取相應措施將 node 恢復為Ready狀態,確保所做的任何更改永久生效。
- 可使用以下命令通過ssh連接到故障node:
- ssh wk8s-node-0 (vms26.rhce.cc)
- 可使用以下命令在該node上獲取更高權限:
- sudo -i
解答:
kubectl get nodes
ssh vms26.rhce.cc
sudo -i
systemctl start kubelet ; systemctl enable kubectl
Exit退出
$kubectl get nodes
