2024-6月CKA-EXAM

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知识

#打快照
ETCDCTL_API=3 etcdctl --endpoints $ENDPOINT snapshot save snapshot.db 

#查看快照状态
ETCDCTL_API=3 etcdctl snapshot status snapshot.db -w table

#恢复快照
ETCDCTL_API=3 etcdctl snapshot restore snapshot.db --data-dir output-dir

#查看成员
ETCDCTLAPI=3 etcdctl member list -w table
kubectl config use-context xk8s #先选择集群很重要
sudo -i
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
ETCDCTL_API=3 etcdctl snapshot status /srv/data/etcd-snapshot.db
systemctl stop etcd
rm -rf /var/lib/etcd
ETCDCTL_API=3 etcdctl --data-dir=/var/lib/etcd snapshot restore /srv/data/etcd-snapshot-previous.db
chown -R etcd.etcd /var/lib/etcd
systemctl start etcd

 2. 节点维护和调度

设置 xnode1 节点为不可用,并重新调度该节点上所有运行的 pods 

drain(排空)

        当需要对节点进行维护或者从集群中移除时,可以使用drain命令将节点上的Pods驱逐,并阻止新的Pods调度到该节点上

cordon(封锁)
        当需要对节点进行维护,但不希望节点上的Pods自动迁移或者删除时,可以使用cordon命令对节点进行封锁。封锁节点后,节点上的Pods将不再自动调度到该节点上,但已经运行在节点上的Pods将继续运行直到被删除或迁移。

uncordon

 解除资源不可被调度(kubectl uncrodon nodexxx)
kubectl config use-context xk8s
kubectl drain xnode1 --ignore-daemonsets --delete-emptydir-data

 3.节点故障排查

名为 xnode3 的 kubernetes worker node 处于 Not Ready 状态
调查原因,并将 node 恢复为 Ready 状态,确保修复永久生效
提示:
可使用命令 ssh xnode3 连接到故障 node:
可使用 sudo -i 命令在该 node 上获取更高权限:

网络肯定是通的,防火墙不用管,只有kubelet没有启动所以.....

ssh xnode3
sudo -i
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 复制即可

vim pod.yaml

---
kind: Pod
apiVersion: v1
metadata:
  name: kucc4
spec:
  containers:
  - name: httpd
    image: httpd
    imagePullPolicy: IfNotPresent
  - name: redis
    image: redis
    imagePullPolicy: IfNotPresent
  - name: memcache
    image: memcache
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

kubectl apply -f pod.yaml

 5.根据标签选择节点调度pod

使用镜像 httpd 创建一个名为 web-kusc00401 的 Pod
将该 Pod 调度到有 disk=ssd 标签的节点上

nodeName 根据节点名字调度

nodeSelector  根据节点标签调度

---
kind: Pod
apiVersion: v1
metadata:
  name: web-kusc00401
spec:
  nodeSelector:
    disk: ssd
  containers:
  - name: httpd
    image: httpd
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

 6.查看节点指定的污点

检查有多少个 worker nodes 已准备就绪(不包括被打上 Taint: NoSchedule 的节点)
并将数量写入 /opt/KUSC00402/kusc00402.txt 

 kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:spec.taints | grep NoSchedule
echo xx >/opt/KUSC00402/kusc00402.txt

 7.查看节点的资源使用情况

查找所有标签为 name=cpu-user 的 pod
将占用 CPU 最高的 pod 名称写入到文件 /opt/KUTR00401/KUTR00401.txt

kubectl top pods -l name=cpu-user
echo xxx > xxxx/xxxx

 8.查看日志过滤信息

监控 pod foo 的日志:
提取包含 unable-to-access-website 错误日志,并写入到 /opt/KUTR00101/foo 

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 

[alice@client ~]$ kubectl config use-context yk8s
#----------------------------------------------
[alice@client yk8s]$ kubectl get pod front-end -o yaml >09.yaml
[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
[alice@client yk8s]$ vim 09.yaml
... ...
# pod.spec.containers[0]
  ports:
  - name: http
    protocol: TCP
    containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: web-front-endpoints
  name: front-end-svc
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: http
  selector:
    app: web-front-endpoints
  type: NodePort
[alice@client yk8s]$ kubectl replace --force -f 09.yaml

 10.Ingress

 在 namespace: ing-internal 上创建一个名为 pong 的 ingress 资源
在路径 /hi 上公开 hi 服务,hi 服务使用 5678 端口

 1.验证后端服务可用否

2.

[alice@client ~]$ kubectl config use-context yk8s
#----------------------------------------------
# 首先查看 ingressclass 名称,如果没有需要自己创建
[alice@client yk8s]$ kubectl get ingressclasses.networking.k8s.io 
NAME    CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       42d
# 自己创建 ingressclass 对象
[alice@client yk8s]$ kubectl -n ingress-nginx get pod ingress-nginx-controller-8698f58b48-dfqp4 -o yaml |grep controller-class
    - --controller-class=k8s.io/ingress-nginx
[alice@client yk8s]$ vim ingressclass.yaml
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: nginx
spec:
  controller: k8s.io/ingress-nginx
[alice@client yk8s]$ kubectl apply -f ingressclass.yaml
#----------------------------------------------
[alice@client yk8s]$ kubectl -n ing-internal create ingress pong --rule="/hi=hi:5678" --class=nginx --dry-run=client -o yaml >09.yaml
[alice@client yk8s]$ vim 09.yaml
---
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: pong
  namespace: ing-internal
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: hi
            port:
              number: 5678
        path: /hi
        pathType: Prefix
[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这个。

kubectl get pod legacy-app -o yaml >xxxx.yaml
vim xxxx.yaml

# pod.spec.volumes
  - name: logs
    emptyDir: {}
... ...
# pod.spec.container[0].volumeMounts:
    - name: logs
      mountPath: /var/log
... ...
# pod.spec.container
  - name: sidecar
    image: busybox
    command: ["/bin/sh"] 
    args: 
    - -c 
    - | 
      tail -n +1 -f /var/log/legacy-app.log
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: logs
      mountPath: /var/log


 kubectl replace --force -f xxxx.yaml

12.pvc pv 动态记录扩容

任务要求:

  1. 创建一个新的 PersistentVolumeClaim:
    卷名称: pvvolume
    卷容量: 10Mi
    存储类: csi-hostpath-sc
  2. 创建一个新的 Pod,将 PersistentVolumeClaim 作为 volume 挂载:
    Pod 名称: web-server
    Pod 镜像: httpd
    挂载路径: /var/www
    配置新的 Pod 对 volume 具有 ReadWriteOnce 权限
  3. 使用 kubectl edit 或者 kubectl patch 将 PVC 的容量扩展为 70Mi,并记录此次更改

edit 或者 patch 时需要加 --record 

kubectl config use-context yk8s
 vim 12.yaml
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: pvvolume
spec:
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi
  storageClassName: csi-hostpath-sc

---
kind: Pod
apiVersion: v1
metadata:
  name: web-server
spec:
  terminationGracePeriodSeconds: 0
  volumes:
  - name: website
    persistentVolumeClaim:
      claimName: pvvolume
  containers:
  - name: web-server
    image: httpd
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: website
      mountPath: /var/www
    ports:
    - protocol: TCP
      containerPort: 80
  restartPolicy: Always
kubectl apply -f 12.yaml --record
kubectl get pods web-server
kubectl get persistentvolumeclaims
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 授权

 注意授权的范围 是全局还是局部

kubectl config use-context yk8s

kubectl create clusterrole deployment-clusterrole --resource=deploy,ds,sts --verb=create --dry-run=client -o yaml >06.yaml
kubectl -n app-team1 create sa cicd-token --dry-run=client -o yaml >>06.yaml
kubectl -n app-team1 create rolebinding cicd-token-rolebind --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token --dry-run=client -o yaml >>06.yaml

[alice@client yk8s]$ vim 06.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: deployment-clusterrole
rules:
- apiGroups:
  - apps
  resources:
  - deployments
  - daemonsets
  - statefulsets
  verbs:
  - create

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: cicd-token
  namespace: app-team1

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: cicd-token-rolebind
  namespace: app-team1
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: deployment-clusterrole
subjects:
- kind: ServiceAccount
  name: cicd-token
  namespace: app-team1
[alice@client yk8s]$ kubectl apply -f 06.yaml

14.网络策略

任务要求:

创建一个名为 allow-port-from-namespace 的新 NetworkPolicy
该策略只允许来自同一名称空间 namespace: my-app 的 Pods 访问
该策略只允许访问监听了 9200 端口的 pods

 直接搜官网NetworkPolicy

需要注意的是 Ingress 还是 Egress

注意ns的标签需要去看下

---
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-port-from-namespace
  namespace: my-app
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: my-app
    ports:
    - port: 9200

 15.deploy扩容

将 deployment webserver 扩展至 6 Pods

kubectl scale deployment webserver --replicas=6
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

[alice@client ~]$ kubectl config use-context xk8s
[alice@client ~]$ ssh xk8s
[alice@xk8s ~]$ sudo -i
#----------------------------------------------
#1.升级管理节点的管理工具kubeadm
[root@xk8s ~]# kubeadm version
[root@xk8s ~]# yum list | grep kubeadm
[root@xk8s ~]# yum install kubeadm-1.2.x
#锁定节点
[root@xk8s ~]# kubectl drain xk8s --ignore-daemonsets=true
#升级 kubectl kubelet ,与kubeadm一样的版本即可
[root@xk8s ~]# yum install kubectl kubelet
#升级集群
[root@xk8s ~]# kubeadm upgrade plan --allow-release-candidate-upgrades
[root@xk8s ~]# kubeadm upgrade apply --etcd-upgrade=false v1.22.5
#重载服务
[root@xk8s ~]# systemctl daemon-reload
[root@xk8s ~]# systemctl restart kubelet







#如过是ubuntu系统使用以下方式
#---------------------------------------------
[root@xk8s ~]# apt-get install --allow-change-held-packages kubeadm
[root@xk8s ~]# kubeadm upgrade plan --allow-release-candidate-upgrades
[root@xk8s ~]# kubectl drain xk8s --ignore-daemonsets=true
[root@xk8s ~]# apt-get install kubelet kubectl
#---------------------------------------------
[root@xk8s ~]# systemctl daemon-reload
[root@xk8s ~]# systemctl restart kubelet
[root@xk8s ~]# kubeadm upgrade apply --etcd-upgrade=false v1.22.5
[root@xk8s ~]# kubectl uncordon xk8s

 升级工作节点

之前都一样与控制节点,升级node时不指定版本即可

 kubeadm upgrade node

17. 人肉pv

任务环境:yk8s

任务要求:

创建名为 app-data 的 persistent volume
容量为 1Gi
访问模式为 ReadWriteMany
volume 类型为 hostPath,位于 /srv/app-data

官网搜pv 注意 hostPath: path type: DirectoryOrCreate

[alice@client ~]$ kubectl config use-context yk8s
#----------------------------------------------
[alice@client yk8s]$ vim 13.yaml
---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: app-data
spec:
  volumeMode: Filesystem
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 1Gi
  hostPath:
    path: /srv/app-data
    type: DirectoryOrCreate
[alice@client yk8s]$ kubectl apply -f 13.yaml

 有些变化 

etcd 不是systemd管理 是一个静态pod启动的,只需把静态pod换个名称恢复完在换回去即可

浏览器下载当时下载完全来的及 ,提前下载可能也用不了

我50Mbps网速足够用,页面也不卡

需要记住kubernetes.io/zh-cn网址

浏览器上面有放大缩小按钮不然展示不完全 ,当时我冒汗了说实话

记住题目该找的网页,到时候找很烦人

CKA考试环境,私信发你

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

small white poplar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值