真题演练
1. 创建一个符合要求的pod
从官网中搜索pod,然后找到一个标准的模板进行修改即可。
要求:(建一个pod要求名字、镜像这类的要求。)
apiVersion: v1
kind: Pod
metadata:
name: myapp2
labels:
app: myapp2
spec:
containers:
- name: nginx
image: nginx
2. 查看某个标签使用cpu最高的pod
注意需要是在--all-namespace
条件下的某个标签下的cpu最高的pod
这里的top会出现所有的pod,这个时候选择最前面的那个pod,即排名最靠前的名称写入文件即可。
终端的复制通过选中后右键可以得到,反应可能比较慢。
kubectl get pod --all-namespace
kubectl top pod -l xxx (这里是小写的L)
3. 创建secret,并且创建2个pod ,1个pod mount成文件,一个用环境变量
https://kubernetes.io/docs/concepts/configuration/secret/
从该链接中找到最简单的模板,根据要求创建secret
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: MWYyZDFlMmU2N2Rm
放入其中的值,需要进行base64加密。可以通过以下操作将一般的值进行加密:
echo -n 'nihaoa' | base64
建立一个pod,并且将secret mount成一个文件
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
建立一个pod,将secret作为环境变量使用
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
4. 给指定的deployment扩容(一分)
使用以下命令即可
kubectl scale deployment XXX --replicas=XXX
5. 按要求创建deployment,然后改image(要求record),然后再回滚回去,把最终的deployment spec弄出来 (继续记忆)
//新建一个deployment以供实验
kubectl create deployment redis --image=redis:3.2
//修改deployment的image版本
kubectl set image deployment redis redis=redis:latest --record
//查看redis的历史版本
kubectl rollout history deployment redis
//修改deployment的版本,退回到上一个版本
kubectl rollout undo deployment redis
//修改deployment的版本,退回到指定的版本
kubectl rollout undo deployment redis --to-revision=1
//输出deployment的spec信息拿出来。
kubectl get deployment redis -o=custom-columns=NAME:spec > aim.txt
6. 按照要求创建daemonsets
在官方文旦中找到具体的yaml文件模板
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
模板看起来有点复杂的,需要进行一些删减。
题目要求部署 NoSchedual 节点不能部署,因此删去 tolerations.
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: k8s.gcr.io/fluentd-elasticsearch:1.20
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
7. 在一个新的namespace创建pod
首先要新建一个namespcace,然后按照要求新建一个pod,在建立pod的时候,在后面加上参数来指定要建在哪个namespace中
这里千万不要偷懒使用deployment来代替pod,认为反正一样都会跑一个pod,deployment会有很多副作用的!!!例如命令不是题目中指定的名字,因为他会在后面自动加上一些后缀。
kubectl create namespace new
kubectl create -f pod.yaml -n new
也可以在 yaml 文件中 指定 namespaces
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: new
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
8. 创建static pod
首先,staticPod是固定在某个node上面,由kubelet管理生成的一种pod。具体生成方式是:kubelet扫描固定的文件,找到yaml文件统一进行生成
- 查找到staticPod的固定文件夹。结果为在--config=/var/lib/kubelet/config.yaml这个文件夹中
查看该文件的配置。找到systemctl status kubelet
- 在该文件夹中添加自己的yaml文件
第二种方法是:
- 找到kubelet的配置文件,同样先使用一下命令:
systemctl status kubelet
然后找到这个位置的配置文件:
进入到配置文件之后添加一行:
--manifest-url=/etc/kubernetes/manifest
- 重新启动kubelet
这样之后,在指定文件夹下面的yaml文件就都会以staticPod的形式运行起来。systemctl daemon-reload systemctl restart kubelet
9. 给定一个pod 拿到某行日志
//XXX表示pod名称
kubectl logs XXX
//grep后面可以加上搜索的关键字
kubectl logs|grep YYY
自己补充的(周):列出指定pod的日志中状态为Error的行,并记录在指定的文件上
kubectl logs <podname> | grep error > /opt/KUCC000xxx/KUCC000xxx.txt
10. 诊断集群健康问题
这里的controller不是用pod的形式一键部署的,而是以二进制的文件,以服务的形式在master中部署的,因此可以在这里使用systemctl模式。
在master的配置文件中添加:
--manifest-url=/etc/kubernetes/manifestm
systemctl daemon-reload
systemctl restart kubelet
这道题目这样做了之后,还是有一定的问题。
11. node设置成unscheduler,并且调度到新的node上面去
使用taint将node设置成unscheduler,在官网上面搜索taint,点进去第一个链接即可。
https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/#concepts
kubectl taint nodes node1 key=value:NoExecute
ubectl taint nodes node1 key:NoExecutee-
NoSchedule 与 NoExecute 的区别:NoSchedule 只会保证后面部署的pod不会部署当前节点,而不能驱除之前已经部署在该节点的pod。而 NoExecute 可以。
12. 解决node not ready
ssh进入该node,重启kubelet
systemctl start kubelet
13. 给定pod创建service
直接使用service expose即可
kubectl expose pod myapp --port=80 --target-port=8000 --name=myapp-service
14. 创建deployment,创建service,并且用nslookup 拿到service 和一个pod的解析的结果
要使用nslookup来拿到service,需要创建一个pod并且进入到该pod中使用该命令才可以
具体参见官网https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/
查看service
kubectl get service
创建一个pod
kubectl create -f https://k8s.io/examples/admin/dns/busybox.yaml
进入到pod中,使用nslookup,注意这边不要忘记后面是
servicename.namespace
kubectl exec -ti busybox -- nslookup kubernetes.default
获取要监控的pod的IP
kubectl describe pod XXX
使用nslookup对pod进行解析
kubectl exec -ti busybox -- nslookup 1-2-3-4.default.pod.cluster.local(IP)
15. 列某个namepsace 下某个service所代表的所有pod的名
//第一步,找到某个service下的labels
kubectl get service --show-labels
//第二步,可以按照po标签,根据-l标签来进行筛选
kubectl get pods -l run=nginx
//第三步,直接找到某个节点名,进行输出
kubectl get pods -l run=nginx -o=custom-columns=NAME:metadata.name > name.yaml
如果没有具体的labels,则通过:
kubectl describe service XXX |grep IP
//找到IP之后,通过IP手动对应找到具体的pod
kubectl get pod -o wide
16. init container
https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
首先,需要使用command命令,新建某个文件
并且一定要挂载文件才可以,不然两个不同的container无法确定文件目录。
其次,需要从container中使用livenessprobe来进行检测,检测新建的文件是否存在,如果存在则启动,不存在则不启动
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: nginx
volumeMounts:
- name: data1
mountPath: /data1
livenessProbe:
exec:
command:
- cat
- /data1/test2
initContainers:
- name: init-myservice
image: nginx
command:
- touch
- data1/tets1
volumeMounts:
- name: data1
mountPath: /data1
restartPolicy: Always
volumes:
- name: data1
emptyDir: {
}
17. 使用nodeselector进行筛选
https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
使用该链接中的模板即可
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
kubernetes.io/hostname: instance-1
加主节点的情况:damenset
tolerations:
- key: node-role.kubernetes.io/master
effect: NoSchedule
18. 创建一个符合要求的pv 大小 权限 路径
https://kubernetes.io/docs/concepts/storage/persistent-volumes/
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
hostPath:
path: "/etc/data"
19. 给etcd做个snapshot 3.0 版本 要加环境变量用etcdctl 带证书,并且需要指定端口的。
https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/
首先,进入到具体的节点上面去
这一步可以根据题目中的ssh的操作来进行
创建自己的snapshot
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:1111 --ca-file=/pki/ca.crt --cert-file=/pki/cert.crt --key-file=/pki/key.crt snapshot save 给的路径
将创建好的snapshot输出,如果题目中没有要求输出,则不需要做这一步,但是为了保证解题正确,可以自己输出一下来进行检验。
TCDCTL_API=3 etcdctl --write-out=table snapshot status snapshotdb >aim.txt
20. 列不含某个标签的node的数量
使用下面命令然后数一下
kubectl get node --show-labels
我考到的题目是查看node中ready的个数,即不被taints的个数,答案是2个,但是为了以防万一还是需要进行查看。
可以通过下述命令来进行查看。
kubectl desceibe node (node name) |grep Taints
21. 创建个带volume带pod,不可以是persistent的
https://kubernetes.io/docs/concepts/storage/volumes/
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: k8s.gcr.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /cache
name: cache-volume
volumes:
- name: cache-volume
emptyDir: {
}
22. 将pv按照名称排序
很简单,在kubectl的命令提示中查找即可。
kubectl get pv --sort-by=.spec.capacity.storage
a23. 在一个pod中添加4个容器
直接按照pod的模板参加即可
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
- name: myapp-container2
image: nginx
- name: consul
image: consul
- name: memcache
image: memcached
24. 把deployment输出成json文件,最后删除创建的deployment
kubectl get deploy -o json > json.json
25. 给定ca.crt,配置好kubelet,同时还要配置好ratation cerficate证书轮换
考试期间仅可查阅资料: https://kubernetes.io/docs/
自动补全:
source <(kubectl completion bash)