CKA-EXAM

打印 上一主题 下一主题

主题 698|帖子 698|积分 2094

1.ETCD

   实行初始化指令 exam-init,完成以下操作
为运行在 https://127.0.0.1:2379 上的现有 etcd 实例创建快照,并将快照保存到 /srv/data/etcd-snapshot.db
然后还原位于 /srv/data/etcd-snapshot-previous.db 的快照备份文件
通过 etcdctl 连接到服务器使用的证书和秘钥
CA 证书: /opt/KUIN00601/ca.crt
客户端证书: /opt/KUIN00601/etcd-client.crt
客户端密钥: /opt/KUIN00601/etcd-client.key
   引用etcd知识
  1. #打快照
  2. ETCDCTL_API=3 etcdctl --endpoints $ENDPOINT snapshot save snapshot.db
  3. #查看快照状态
  4. ETCDCTL_API=3 etcdctl snapshot status snapshot.db -w table
  5. #恢复快照
  6. ETCDCTL_API=3 etcdctl snapshot restore snapshot.db --data-dir output-dir
  7. #查看成员
  8. ETCDCTLAPI=3 etcdctl member list -w table
复制代码
  1. kubectl config use-context xk8s #先选择集群很重要
  2. sudo -i
  3. ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 --cacert=/opt/KUIN00601/ca.crt --cert=/opt/KUIN00601/etcd-client.crt --key=/opt/KUIN00601/etcd-client.key snapshot save /srv/data/etcd-snapshot.db
  4. ETCDCTL_API=3 etcdctl snapshot status /srv/data/etcd-snapshot.db
  5. systemctl stop etcd
  6. rm -rf /var/lib/etcd
  7. ETCDCTL_API=3 etcdctl --data-dir=/var/lib/etcd snapshot restore /srv/data/etcd-snapshot-previous.db
  8. chown -R etcd.etcd /var/lib/etcd
  9. systemctl start etcd
复制代码
 2. 节点维护和调度

   设置 xnode1 节点为不可用,并重新调度该节点上所有运行的 pods 
  drain(排空)
          当需要对节点进行维护大概从集群中移除时,可以使用drain命令将节点上的Pods驱逐,并制止新的Pods调度到该节点上
  cordon(封锁)
        当需要对节点进行维护,但不渴望节点上的Pods自动迁徙大概删除时,可以使用cordon命令对节点进行封锁。封锁节点后,节点上的Pods将不再自动调度到该节点上,但已经运行在节点上的Pods将继承运行直到被删除或迁徙。
  uncordon
  1. 解除资源不可被调度(kubectl uncrodon nodexxx)
复制代码
  1. kubectl config use-context xk8s
  2. kubectl drain xnode1 --ignore-daemonsets --delete-emptydir-data
复制代码
 3.节点故障排查

   名为 xnode3 的 kubernetes worker node 处于 Not Ready 状态
调查原因,并将 node 规复为 Ready 状态,确保修复永久见效
提示:
可使用命令 ssh xnode3 连接到故障 node:
可使用 sudo -i 命令在该 node 上获取更高权限:
  网络肯定是通的,防火墙不用管,只有kubelet没有启动所以.....
  1. ssh xnode3
  2. sudo -i
  3. systemctl enable --now kubelet
复制代码
4.创建Pod根据给出的镜像

   创建一个名字为 kucc4 的 pod,在 pod 里面分别为以下每个 images 单独运行一个 app container
镜像: httpd、redis、memcache
  直接使用kubectl run kucc4 --image=httpd --dry-run=client -o yaml 复制即可
  1. vim pod.yaml
  2. ---
  3. kind: Pod
  4. apiVersion: v1
  5. metadata:
  6.   name: kucc4
  7. spec:
  8.   containers:
  9.   - name: httpd
  10.     image: httpd
  11.     imagePullPolicy: IfNotPresent
  12.   - name: redis
  13.     image: redis
  14.     imagePullPolicy: IfNotPresent
  15.   - name: memcache
  16.     image: memcache
  17.     imagePullPolicy: IfNotPresent
  18.   restartPolicy: Always
  19. kubectl apply -f pod.yaml
复制代码
 5.根据标签选择节点调度pod

   使用镜像 httpd 创建一个名为 web-kusc00401 的 Pod
将该 Pod 调度到有 disk=ssd 标签的节点上
  nodeName 根据节点名字调度
nodeSelector  根据节点标签调度
  1. ---
  2. kind: Pod
  3. apiVersion: v1
  4. metadata:
  5.   name: web-kusc00401
  6. spec:
  7.   nodeSelector:
  8.     disk: ssd
  9.   containers:
  10.   - name: httpd
  11.     image: httpd
  12.     imagePullPolicy: IfNotPresent
  13.   restartPolicy: Always
复制代码
 6.查察节点指定的污点

   检查有多少个 worker nodes 已预备就绪(不包括被打上 Taint: NoSchedule 的节点)
并将数目写入 /opt/KUSC00402/kusc00402.txt 
  1. kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:spec.taints | grep NoSchedule
  2. echo xx >/opt/KUSC00402/kusc00402.txt
复制代码
 7.查察节点的资源使用环境

      查找所有标签为 name=cpu-user 的 pod
将占用 CPU 最高的 pod 名称写入到文件 /opt/KUTR00401/KUTR00401.txt
   
  1. kubectl top pods -l name=cpu-user
  2. echo xxx > xxxx/xxxx
复制代码
 8.查察日志过滤信息

   监控 pod foo 的日志:
提取包罗 unable-to-access-website 错误日志,并写入到 /opt/KUTR00101/foo 
  1. kubectl logs foo | grep unable-to > /opt/KUTR00101/foo
复制代码
 9.创建svc,NodePort   写资源对象文件

   请重新配置现有的摆设 front-end
添加名为 http 的端口规范来公开现有容器 front-end 的端口 80/tcp
创建一个名为 front-end-svc 的新服务,以公开名为 http 端口
通过节点上的 NodePort 来发布 front-end-svc 服务
  搜service 
kubectl create svc --help  
末了直接kubectl replace --force -f 
  1. [alice@client ~]$ kubectl config use-context yk8s
  2. #----------------------------------------------
  3. [alice@client yk8s]$ kubectl get pod front-end -o yaml >09.yaml
  4. [alice@client yk8s]$ kubectl expose pod front-end --type=NodePort --name=front-end-svc --port=80 --protocol=TCP --target-port=http --dry-run=client -o yaml >>08.yaml
  5. [alice@client yk8s]$ vim 09.yaml
  6. ... ...
  7. # pod.spec.containers[0]
  8.   ports:
  9.   - name: http
  10.     protocol: TCP
  11.     containerPort: 80
  12. ---
  13. apiVersion: v1
  14. kind: Service
  15. metadata:
  16.   labels:
  17.     app: web-front-endpoints
  18.   name: front-end-svc
  19. spec:
  20.   ports:
  21.   - port: 80
  22.     protocol: TCP
  23.     targetPort: http
  24.   selector:
  25.     app: web-front-endpoints
  26.   type: NodePort
  27. [alice@client yk8s]$ kubectl replace --force -f 09.yaml
复制代码
 10.Ingress

    在 namespace: ing-internal 上创建一个名为 pong 的 ingress 资源
在路径 /hi 上公开 hi 服务,hi 服务使用 5678 端口
   1.验证后端服务可用否
2.
  1. [alice@client ~]$ kubectl config use-context yk8s
  2. #----------------------------------------------
  3. # 首先查看 ingressclass 名称,如果没有需要自己创建
  4. [alice@client yk8s]$ kubectl get ingressclasses.networking.k8s.io
  5. NAME    CONTROLLER             PARAMETERS   AGE
  6. nginx   k8s.io/ingress-nginx   <none>       42d
  7. # 自己创建 ingressclass 对象
  8. [alice@client yk8s]$ kubectl -n ingress-nginx get pod ingress-nginx-controller-8698f58b48-dfqp4 -o yaml |grep controller-class
  9.     - --controller-class=k8s.io/ingress-nginx
  10. [alice@client yk8s]$ vim ingressclass.yaml
  11. ---
  12. apiVersion: networking.k8s.io/v1
  13. kind: IngressClass
  14. metadata:
  15.   name: nginx
  16. spec:
  17.   controller: k8s.io/ingress-nginx
  18. [alice@client yk8s]$ kubectl apply -f ingressclass.yaml
  19. #----------------------------------------------
  20. [alice@client yk8s]$ kubectl -n ing-internal create ingress pong --rule="/hi=hi:5678" --class=nginx --dry-run=client -o yaml >09.yaml
  21. [alice@client yk8s]$ vim 09.yaml
  22. ---
  23. kind: Ingress
  24. apiVersion: networking.k8s.io/v1
  25. metadata:
  26.   name: pong
  27.   namespace: ing-internal
  28.   annotations:
  29.     nginx.ingress.kubernetes.io/rewrite-target: /
  30. spec:
  31.   ingressClassName: nginx
  32.   rules:
  33.   - http:
  34.       paths:
  35.       - backend:
  36.           service:
  37.             name: hi
  38.             port:
  39.               number: 5678
  40.         path: /hi
  41.         pathType: Prefix
  42. [alice@client yk8s]$ kubectl apply -f 09.yaml
复制代码
11.存储卷

   将一个 busybox sidecar 容器添加到现有的 Pod legacy-app
新的 sidecar 容器使用命令 /bin/sh -c tail -n +1 -f /var/log/legacy-app.log 提取日志
sidecar 容器可以通过 mount 名为 logs 的 volume 来访问日志文件 /var/log/legacy-app.log
注意:
不要更改现有容器,不要修改日志文件的路径
两个容器必须通过 /var/log/legacy-app.log 来访问该文件
   考到多容器pod 、command: ["/bin/sh"] - -c - | 命令、volume 、volumeMounts
这道题的意思是用 sidecar读取 legacy-app容器/var/log/legacy-app.log的日志,需要创建一个emptyDir 的volume 。sidecar和 legacy-app容器, legacy-app容器通过volumeMount 来将日志保存到emptyDir 的volume里,sidecar容器通过volumeMount 来将日志从emptyDir 的volume里读取出来。所以 sidecar,legacy-app两容器都要写volumeMount这个。
  1. kubectl get pod legacy-app -o yaml >xxxx.yaml
  2. vim xxxx.yaml
  3. # pod.spec.volumes
  4.   - name: logs
  5.     emptyDir: {}
  6. ... ...
  7. # pod.spec.container[0].volumeMounts:
  8.     - name: logs
  9.       mountPath: /var/log
  10. ... ...
  11. # pod.spec.container
  12.   - name: sidecar
  13.     image: busybox
  14.     command: ["/bin/sh"]
  15.     args:
  16.     - -c
  17.     - |
  18.       tail -n +1 -f /var/log/legacy-app.log
  19.     imagePullPolicy: IfNotPresent
  20.     volumeMounts:
  21.     - name: logs
  22.       mountPath: /var/log
  23. kubectl replace --force -f xxxx.yaml
复制代码
12.pvc pv 动态记录扩容

   任务要求:
     

  • 创建一个新的 PersistentVolumeClaim:
    卷名称: pvvolume
    卷容量: 10Mi
    存储类: csi-hostpath-sc
  • 创建一个新的 Pod,将 PersistentVolumeClaim 作为 volume 挂载:
    Pod 名称: web-server
    Pod 镜像: httpd
    挂载路径: /var/www
    配置新的 Pod 对 volume 具有 ReadWriteOnce 权限
  • 使用 kubectl edit 大概 kubectl patch 将 PVC 的容量扩展为 70Mi,并记录此次更改
    edit 大概 patch 时需要加 --record 
  1. kubectl config use-context yk8s
  2. vim 12.yaml
  3. ---
  4. kind: PersistentVolumeClaim
  5. apiVersion: v1
  6. metadata:
  7.   name: pvvolume
  8. spec:
  9.   volumeMode: Filesystem
  10.   accessModes:
  11.   - ReadWriteOnce
  12.   resources:
  13.     requests:
  14.       storage: 10Mi
  15.   storageClassName: csi-hostpath-sc
  16. ---
  17. kind: Pod
  18. apiVersion: v1
  19. metadata:
  20.   name: web-server
  21. spec:
  22.   terminationGracePeriodSeconds: 0
  23.   volumes:
  24.   - name: website
  25.     persistentVolumeClaim:
  26.       claimName: pvvolume
  27.   containers:
  28.   - name: web-server
  29.     image: httpd
  30.     imagePullPolicy: IfNotPresent
  31.     volumeMounts:
  32.     - name: website
  33.       mountPath: /var/www
  34.     ports:
  35.     - protocol: TCP
  36.       containerPort: 80
  37.   restartPolicy: Always
复制代码
  1. kubectl apply -f 12.yaml --record
  2. kubectl get pods web-server
  3. kubectl get persistentvolumeclaims
  4. kubectl patch pvc pvvolume -p '{"spec":{"resources":{"requests":{"storage":"70Mi"}}}}' --record
复制代码
13.角色

   创建一个名为 deployment-clusterrole 的 ClusterRole 角色
该角色具有新建 Deployment、StatefulSet、 DaemonSet 范例资源的权限
在现有 namespace: app-team1 中创建一个名为 cicd-token 的新 ServiceAccount
仅限于 namespace: app-team1 中使用新建的角色为 cicd-token 授权
   注意授权的范围 是全局还是局部
  1. kubectl config use-context yk8s
  2. kubectl create clusterrole deployment-clusterrole --resource=deploy,ds,sts --verb=create --dry-run=client -o yaml >06.yaml
  3. kubectl -n app-team1 create sa cicd-token --dry-run=client -o yaml >>06.yaml
  4. kubectl -n app-team1 create rolebinding cicd-token-rolebind --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token --dry-run=client -o yaml >>06.yaml
  5. [alice@client yk8s]$ vim 06.yaml
  6. ---
  7. apiVersion: rbac.authorization.k8s.io/v1
  8. kind: ClusterRole
  9. metadata:
  10.   name: deployment-clusterrole
  11. rules:
  12. - apiGroups:
  13.   - apps
  14.   resources:
  15.   - deployments
  16.   - daemonsets
  17.   - statefulsets
  18.   verbs:
  19.   - create
  20. ---
  21. apiVersion: v1
  22. kind: ServiceAccount
  23. metadata:
  24.   name: cicd-token
  25.   namespace: app-team1
  26. ---
  27. apiVersion: rbac.authorization.k8s.io/v1
  28. kind: RoleBinding
  29. metadata:
  30.   name: cicd-token-rolebind
  31.   namespace: app-team1
  32. roleRef:
  33.   apiGroup: rbac.authorization.k8s.io
  34.   kind: ClusterRole
  35.   name: deployment-clusterrole
  36. subjects:
  37. - kind: ServiceAccount
  38.   name: cicd-token
  39.   namespace: app-team1
  40. [alice@client yk8s]$ kubectl apply -f 06.yaml
复制代码
14.网络策略

   任务要求:
     创建一个名为 allow-port-from-namespace 的新 NetworkPolicy
该策略只答应来自同一名称空间 namespace: my-app 的 Pods 访问
该策略只答应访问监听了 9200 端口的 pods
       直接搜官网NetworkPolicy
  需要注意的是 Ingress 还是 Egress
  注意ns的标签需要去看下
  1. ---
  2. kind: NetworkPolicy
  3. apiVersion: networking.k8s.io/v1
  4. metadata:
  5.   name: allow-port-from-namespace
  6.   namespace: my-app
  7. spec:
  8.   podSelector: {}
  9.   policyTypes:
  10.   - Ingress
  11.   ingress:
  12.   - from:
  13.     - namespaceSelector:
  14.         matchLabels:
  15.           kubernetes.io/metadata.name: my-app
  16.     ports:
  17.     - port: 9200
复制代码
 15.deploy扩容

   将 deployment webserver 扩展至 6 Pods
  1. kubectl scale deployment webserver --replicas=6
  2. kubectl get deployments.apps webserver
复制代码
16.升级k8s版本

关键字搜索:upgrade
   任务环境:xk8s
  任务要求:
     现有的 xk8s 集群正在运行的版本是 1.22.3,在主节点上升级 kubelet 和 kubectl
仅将主节点上的所有 kubernetes 控制平面和节点组件升级到版本 1.22.5
确保在升级前 drain 主节点,并在升级后 uncordon 主节点
请不要升级工作节点,etcd,container 管理器,CNI 插件,DNS 服务或任何其他插件 
      
  

  • 锁定节点
                  drain
  

  • 升级管理工具
                  ssh 到主节点
                  kubeadm=xx.xx.xx
  

  • 升级系统 
                  kubeadm upgrade plan
  

  • 升级服务
                  升级软件包 kubelet  kubectl
                  重启服务 daemon-reload ;restart kubelet              
  

  •  排除锁定
                  uncordon
  1. [alice@client ~]$ kubectl config use-context xk8s
  2. [alice@client ~]$ ssh xk8s
  3. [alice@xk8s ~]$ sudo -i
  4. #----------------------------------------------
  5. #1.升级管理节点的管理工具kubeadm
  6. [root@xk8s ~]# kubeadm version
  7. [root@xk8s ~]# yum list | grep kubeadm
  8. [root@xk8s ~]# yum install kubeadm-1.2.x
  9. #锁定节点
  10. [root@xk8s ~]# kubectl drain xk8s --ignore-daemonsets=true
  11. #升级 kubectl kubelet ,与kubeadm一样的版本即可
  12. [root@xk8s ~]# yum install kubectl kubelet
  13. #升级集群
  14. [root@xk8s ~]# kubeadm upgrade plan --allow-release-candidate-upgrades
  15. [root@xk8s ~]# kubeadm upgrade apply --etcd-upgrade=false v1.22.5
  16. #重载服务
  17. [root@xk8s ~]# systemctl daemon-reload
  18. [root@xk8s ~]# systemctl restart kubelet
  19. #如过是ubuntu系统使用以下方式
  20. #---------------------------------------------
  21. [root@xk8s ~]# apt-get install --allow-change-held-packages kubeadm
  22. [root@xk8s ~]# kubeadm upgrade plan --allow-release-candidate-upgrades
  23. [root@xk8s ~]# kubectl drain xk8s --ignore-daemonsets=true
  24. [root@xk8s ~]# apt-get install kubelet kubectl
  25. #---------------------------------------------
  26. [root@xk8s ~]# systemctl daemon-reload
  27. [root@xk8s ~]# systemctl restart kubelet
  28. [root@xk8s ~]# kubeadm upgrade apply --etcd-upgrade=false v1.22.5
  29. [root@xk8s ~]# kubectl uncordon xk8s
复制代码
 升级工作节点

之前都一样与控制节点,升级node时不指定版本即可
  1. kubeadm upgrade node
复制代码
17. 人肉pv

任务环境:yk8s
任务要求:
   创建名为 app-data 的 persistent volume
容量为 1Gi
访问模式为 ReadWriteMany
volume 范例为 hostPath,位于 /srv/app-data
  官网搜pv 注意 hostPath: path type: DirectoryOrCreate
  1. [alice@client ~]$ kubectl config use-context yk8s
  2. #----------------------------------------------
  3. [alice@client yk8s]$ vim 13.yaml
  4. ---
  5. kind: PersistentVolume
  6. apiVersion: v1
  7. metadata:
  8.   name: app-data
  9. spec:
  10.   volumeMode: Filesystem
  11.   accessModes:
  12.   - ReadWriteMany
  13.   capacity:
  14.     storage: 1Gi
  15.   hostPath:
  16.     path: /srv/app-data
  17.     type: DirectoryOrCreate
  18. [alice@client yk8s]$ kubectl apply -f 13.yaml
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表