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  #检查是否正常 K
ubectl 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

 

posted @ 2023-09-18 22:34  dream_fly_info  阅读(133)  评论(0编辑  收藏  举报