cka认证考题复习
1、新建命名空间,在该命名空间中创建一个pod
• 命名空间名称:cka
• pod名称:pod-01
• 镜像:nginx
命令行配置:
kubectl create namespace cka
kubectl run pod-01 --image=nginx --namespace=cka
yaml配置:
apiVersion: v1
kind: Pod
metadata:
name: pod-01
namespace:cka
spec:
containers:
- name: nginx
image: nginx
配置生效:
kubectl apply -f pod.yaml
Kueclt get namespace
https://kubernetes.io/zh/docs/concepts/workloads/pods/
2、创建一个deployment并暴露service
• 名称:aliang-666
• 镜像:nginx
命令行配置: kubectl create deployment aliang-666 --image=nginx kubectl expose deployment aliang-666 --port=80 --target-port=80 yaml配置: 1、先手动创建deployment apiVersion: apps/v1 kind: Deployment metadata: name: aliang-666 labels: app: nginx spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx ports: - containerPort: 80
2、创建Service,将应用80端口暴露,容器和pod都使用80端口暴露 apiVersion: v1 kind: Service metadata: name: aliang-666 spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80
https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/
3、列出命名空间下指定标签pod
• 命名空间名称:kube-system
• 标签:k8s-app=kube-dns
kubectl get nodes -l k8s-app=kube-dns -namespace=kube-system
kubectl get nodes -l k8s-app=kube-dns -n kube-system #-namespace命名空间可以简写为-ns或-n
kubectl get nodes --show-labels #查看标签
4、查看pod日志,并将日志中Error的行记录到指定文件
• pod名称:web
• 文件:/opt/web-log
kubectl logs web | grep -i Error >opt/web-log #-i命令可以忽略大小写
kubectl logs web #查看指定pod的日志
kubectl logs web --help #查看帮助信息,可以快速查看命令格式
5、查看指定标签使用cpu最高的pod,并记录到到指定文件
• 标签:app=web
• 文件:/opt/cpu
分析:查看资源使用情况,支持通过cpu和memory占用资源大小进行排序
kubectl top pods -l app=web --sort-by="cpu" >/opt/cpu
kubectl top pods -l app-web --sort-by="memory" >/tmp/larry #根据内存使用大小排序
6、在节点上配置kubelet托管启动一个pod
• 节点:k8s-node1
• pod名称:web
• 镜像:nginx
6.1、分析:观察配置文件有没有启用静态Pod,kubeadmin默认没有启用静态pod,需手动加上,然后重启kubelet进行生效。 ssh k8s-node1 #登录node1 ps -ef | grep kubelet #找到静态pod使用哪个yaml文件,修改后重启kubelet,--config=/var/lib/kubelet/config.yaml vi /var/lib/kubelet/config.yaml #增加以下这一行,并重启kubelet staticPodPath:/etc/kubernetes/manifests Systemctl restart kubelet
6.2、vi /etc/kubernetes/manifests/web.yaml apiVersion: v1 kind: Pod metadata: name: web namespace: labels: app: spec: spec: containers: - name: nginx image: nginx https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/
7、向pod中添加一个init容器,init容器创建一个空文件,如果该空文件没有被检测到,则pod退出
• pod名称:web
分析:在initContainers容器中创建1个空文件,用普通容器中的livenessProbe来做健康检查,另外需要注意k8s中容器是相互隔离的,我们可以使用数据卷共享的方式来共享文件,这也是容器间互相访问的一种方式。
apiVersion: v1 kind: Pod metadata: name: web labels: app: nginx spec: containers: - name: nginx image: nginx command: ['sh', '-c', 'echo The app is running! && sleep 3600'] volumeMounts: - mountPath: /opt name:data livenessProbe: exec: command: - cat - /opt/test restartPolicy:Always initContainers: - name: nginx image: nginx command: ['sh', '-c', "touch /tmp/test"] volumeMounts: - mountPath: /opt name: data volumes: - name: data emptyDir:{}
Kubectl describe pods web #检查是否正常 Kubectl get pods #查看pods信息 Kubectl delete -f pod.yaml #删除配置
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/
8、创建一个deployment 副本数 3,然后滚动更新镜像
版本,并记录这个更新记录,最后再回滚到上一个版本
• 名称:nginx
• 镜像版本:1.16
• 更新镜像版本:1.17
kubectl create deployment web --image=nginx kubectl scale deploy web --replicas=3 kubectl set image deploy web nginx=nginx:1.17 --recored kubectl rollout undo deployment web --to-revision=1 #回滚到上一个版本
辅助命令:
kubectl edit deploy web #直接编辑yaml文件增加副本数
kubectl rollout history deployment web #检查更新版本历史记录
kubect set image --help
kubectl rollout --help
Curl -I 192.168.1.10 #查看nginx版本。
9、给web deployment扩容副本数为3
Kubectl scale deployment web --replicas=3
10、创建一个pod,其中运行着nginx、redis、memcached、consul 4个容器
apiVersion: v1 kind: Pod metadata: name: web namespace: web labels: app: web spec: containers: - name: nginx image: nginx - name: redis image: redis - name: memcached image: memcached - name: consul image: consul kubectl apply -f pod.yaml kubectl get pods
11、把deployment输出json文件,再删除创建的Deployment
kubectl get deploy web -o json >/opt/test kubectl delete deployment web
12、生成一个deployment yaml文件保存到/opt/deploy.yaml
• 名称:web
• 标签:app_env_stage=dev
分析:先命令行创建yaml文件,然后手动修改标签名,并应用生效
kubectl create deployment web --image=nginx --dry-run=client - o yaml >/opt/deploy.yaml 按照要求修改标签:
vi /opt/deploy.yaml #编辑yaml文件,主要是修改标签
kubectl apply -f /opt/deploy.yaml #应用yaml文件 apiVersion: apps/v1 kind: Deployment metadata: labels: app: app_env_stage=dev name: web spec: replicas: 1 selector: matchLabels: app: app_env_stage=dev template: metadata: labels: app: app_env_stage=dev spec: containers: - image: nginx name: nginx
13、创建一个pod,分配到指定标签node上
• pod名称:web
• 镜像:nginx
• node标签:disk=ssd
分析:需要用到标签选择器,可以将特定的pod分配到指定的node上,一般在做功能测试,poc方案可行性分析的场景下,使用nodeSelector选择器,可以减低对生产业务环境的影响。
vi pod.yaml apiVersion: v1 kind: Pod metadata: name: web spec: containers: - name: web image: nginx nodeSelector: disk: ssd https://kubernetes.io/docs/concepts/configuration/assign-pod-node
14、确保在每个节点上运行一个pod,不考虑污点
• 名称:fluentd-elasticsearch
• 镜像:fluentd
分析:官网yaml配置,默认有污点配置,需要手动删除 ,每个节点都运行pod,可以快速联想到使用daemonset方式部署 Vi ds.yaml 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: #考试中提到没有污点,因此需要手动删除tolerations的以下配置【蓝色部分】,其他的标签根据题意进行修改
#污点简单来说,就是人为干预,使该pod上不运行特定的应用 tolerations: # 这些容忍度设置是为了让该守护进程集在控制平面节点上运行 # 如果你不希望自己的控制平面节点运行 Pod,可以删除它们 - key: node-role.kubernetes.io/control-plane operator: Exists effect: NoSchedule - key: node-role.kubernetes.io/master operator: Exists effect: NoSchedule containers: - name: fluentd-elasticsearch image: fluentd resources: limits: memory: 200Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log terminationGracePeriodSeconds: 30 volumes: - name: varlog hostPath: path: /var/log https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/
15、查看集群中状态为ready的node数量(不包含污点类型为NoSchedule的node),并将结果写到指定文件
kubectl get node | grep Ready | wc -l #统计进入Ready状态的node数量
kubectl get node | grep -ic Ready #查看状态为ready的node数量
kubectl describe node |grep Taint |grep -c NoSchedule >/opt/larry #查看状态为ready的node数量,不包含污点类型为NoSchedule的node
kubectl describe node $(kubectl get nodes|grep Ready|awk '{print $1}') |grep Taint|grep -vc NoSchedule > /opt/node.txt
16、设置成node不能调度,并使已被调度的pod重新调度
分析:其实是一个节点下线维护的常用操作,在日常的维护操作中经常会遇到,基础题 1、cordon 设置维护的节点不可调度 2、drain 驱逐节点上的pod,把当前节点运行的pod去掉,使pod在该节点不运行,类似程序下线过程 3、delete node 删除特定的node kubectl cordon k8s-node2 #节点下线后,会给节点打上标记SchedulingDisabeld kubectl drain k8s-node2 --ignore-daemonsets --force #daemonsets必须保证每个节点都有存在,因此不能删除 kubectl get node #查看node信息
17、给一个pod创建service,并可以通过ClusterIP访问
kubectl expose pod myapp --port=80 --target-port=80 --namee=myapp --type=NodePort
kubectl get pods -o wide
curl CLUSET-IP
18、任意名称创建deployment和service,然后使用busybox容器nslookup解析service
分析:先创建一个deployment和service,然后进行本地的busybox容器进行本地解析 kubectl create deployment nginx-dns --image=nginx #创建一个deployment kubectl expose deploy nginx-dns --port=80 -target-port=80 #创建一个service,容器和对外的端口都是80
kubectl run pod nginx-dns --namespace=myapp --image=nginx #创建一个pod,也可以通过编写yaml创建
kubectl run bs-dns --image=busybox:1.28.4 busybox sleep 36000#因为busybox没有守护进程,需要休眠时间
kubectl exec -it bs-dns -- ls #进入容器
kubectl get svc
kubectl exec -it bs-dns -- nslookup nginx-dns >/tmp/dns