k8s-CKA-2022真题

目录

1.创建pod

2.创建deployment和service

3.设置节点不可用

4.修改deployment数量为6

5. 添加标签

6.创建多容器

7.deployment版本升级回退

8.创建用户和授权

9.创建NetworkPolicy,

9.1  创建02 NetworkPolicy

10.创建ingress

11.创建一个 pv

12.创建pvc

13.查看日志

14.添加一个名为 busybox

15.查找pod

16.检查集群状态

17.升级版本kubelet 和 kubectl

18.etcd 创建快照,恢复快照

19.统计有污点的节点


1.创建pod

设置配置环境 kubectl config use-context k8s

按如下要求调度一个 pod:
名称:nginx-kusc00401

image: nginx

Node selector: disk=ssd

kubectl config use-context k8s

kubectl run nginx-kusc00401 --image=nginx --dry-run=client -o yaml > 1.yaml

k8s-CKA-2022真题_第1张图片

kubectl apply -f 1.yaml

2.创建deployment和service

设置配置环境 kubectl config use-context k8s
请重新配置现有的部署 front-end 以及添加名为 http 的端口规范来公开现有容器 nginx 的端 口 80/tcp。
创建一个名为 front-end-svc 的新服务,以公开容器端口 http。 配置此服务,以通过在排定的节点上的 NodePort 来公开各个 pods。
 

kubectl config use-context k8s
kubectl get deployments.apps


kubectl edit deployments.apps front-end

# edit编辑时只能使用空格,不要TAB否则保存不了

# 添加如下配置,主要是在 name 为 nginx 的容器下

    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
kubectl expose deploy front-end --name=front-end-svc --port=80 --target-port= http --type=NodePort

3.设置节点不可用

将 k8s-node02 节点设置为不可用,然后重新调度该节点上的所有 Pod然后重新调度该节点上的所有 Pod

kubectl cordon k8s-node02

#腾空节点以准备维护
kubectl drain k8s-node02 --ignore-daemonsets --delete-emptydir-data --force

4.修改deployment数量为6

kubectl scale deployment hwcka-002 --replicas=6

5. 添加标签

nginx打标签 labels  key1=rw01  key2=rw02

kubectl run hwcka-005 --image=nginx --labels key1=rw01,key2=rw02 --dry-run=client -o yaml > 5.yaml

kubectl apply -f 5.yaml

6.创建多容器

创建多容器 nginx redis memcached consul

kubectl run hwcka-006 --image=nginx --dry-run=client -o yaml > 6.yaml

#修改
vim 6.yaml

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  name: hwcka-006
spec:
  containers:
  - image: nginx
    name: nginx
  - image: redis
    name: redis
  - image: memcached
    name: memcached
  - image: consul
    name: consul

kubectl apply -f 6.yaml

7.deployment版本升级回退

7.0创建deplpyment版本nginx
7.1修改镜像1.12.0,并记录这个更新
7.3回退到上个版本


kubectl create deployment hwcka-007 --image=nginx --dry-run=client -o yaml > 7.yaml

kubectl apply -f 7.yaml

kubectl edit deployments.apps hwcka-007 --record

kubectl rollout history deployment hwcka-007

kubectl rollout undo deployment hwcka-007 --to-revision=1

8.创建用户和授权

创建一个名为 rw-clusterrole 的 clusterrole
该 clusterrole 只允许创建 Deployment、Daemonset、Statefulset 的 create 操作;
在名字为 rw 的 namespace 下创建一个名为 cicd-token 的 serviceAccount,
并且将上一步创建 clusterrole 的权限绑定到该 serviceAccount
该 clusterrole 只允许创建 Deployment、Daemonset、Statefulset 的 create 操作;
在名字为 app-team1 的 namespace 下创建一个名为 cicd-token 的 serviceAccount,
并且将上一步创建 clusterrole 的权限绑定到该 serviceAccount

kubectl create clusterrole rw-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets --dry-run=client -o yaml > 8.yaml
kubectl apply -f 8.yaml
kubectl get clusterrole |grep rw-clusterrole

kubectl create ns rw

kubectl -n rw create  serviceaccount cicd-token

kubectl -n rw create rolebinding rw-clusterrole-rolebinding --clusterrole=rw-clusterrole --serviceaccount=rw:cicd-token --dry-run=client -o yaml > 8b.yaml

kubectl apply -f 8b.yaml

9.创建NetworkPolicy,

创建一个名字为 rw-port-from-namespace 的 NetworkPolicy,这个 NetworkPolicy 允许 rw命名空间下的 Pod 访问该命名空间下的 9000 端口。
并且不允许不是 rw 命令空间的下的 Pod 访问不允许访问没有监听 9000 端口的 Pod。

官网参考:网络策略 | Kubernetes

vim 9.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: rw-port-from-namespace
  namespace: rw
spec:
  ingress:
    - from:
        - podSelector: {}
      ports:
        - protocol: TCP
          port: 9000
  podSelector: {}
  policyTypes:
  - Ingress

kubectl apply -f 9.yaml

9.1  创建02 NetworkPolicy

在命名空间 fubar 中创建名为 allow-port-from-namespace 新的NetworkPolicy,

确保新的NetworkPolicy允许namespace  corp-net中的pods连接namespace  fubar中的pods的端口8080

进一步确保新的NetworkPolicy

不允许对没有在监听的端口8080的pods的访问

不允许非来自namespace corp-net中的pods的访问

查看ns标签
# kubectl get ns corp-net --show-labels

vi networkpolicy.yaml

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace
  namespace: fubar
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: corp-net

# 此处podSelector前不要加 - ,加了则表示furbar 中的pod都可以访问furbar的80端口
          podSelector:
            matchLabels: {}
      ports:
        - protocol: TCP
          port: 8080

# 应用yaml
# kubectl apply -f networkpolicy.yaml

10.创建ingress

在 ing-internal 命名空间下创建一个 ingress,名字为 pong,代理的 service hi,端口为 5678,

配置路径/hi。
验证:访问 curl -kL /hi 会返回 hi

参考:Ingress | Kubernetes

vim 10.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: pong
  namespace: ing-internal
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /hi
        pathType: Prefix
        backend:
          service:
            name: hi
            port:
              number: 5678

kubectl apply -f 10.yaml

11.创建一个 pv

创建一个 pv,名字为 app-config,大小为 2Gi,访问权限为 ReadWriteMany。

Volume 的类型为hostPath,路径为/srv/app-config

参考:https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/

vim 11.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: app-config
spec:
  capacity:
    storage: 2Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  hostPath:
     path: "/srv/app-config"


kubectl apply -f 11.yaml

kubectl get pv

12.创建pvc

创建一个名字为 pv-volume 的 pvc,指定 storageClass 为 csi-hostpath-sc,大小为 10Mi
然后创建一个 Pod,名字为 web-server,镜像为 nginx,并且挂载该 PVC 至/usr/share/nginx/html,挂
载的权限为 ReadWriteOnce。之后通过 kubectl edit 或者 kubectl path 将 pvc 改成 70Mi,并且记录修
改记录。

参考:持久卷 | Kubernetes

vim 12.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-volume
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi
  storageClassName: nfs-boge

kubectl apply -f 12.yaml

kubectl get pvc


vim 12-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: mypd
  volumes:
    - name: mypd
      persistentVolumeClaim:
        claimName: pv-volume

kubectl apply -f 12-pod.yaml


kubectl edit pvc pv-volume --record


13.查看日志

监控名为 foobar 的 Pod 的日志,并过滤出具有 unable-access-website 信息的行,然后将写入到/opt/KUTR00101/foobar

kubectl logs foobar |grep unable-access-website  > /opt/KUTR00101/foobar

14.添加一个名为 busybox

且镜像为 busybox 的 sidecar 到一个已经存在的名为 legacy-app 的 Pod
上,这个 sidecar 的启动命令为/bin/sh, -c, 'tail -n+1 -f /var/log/legacy-app.log'。
并且这个 sidecar 和原有的镜像挂载一个名为 logs 的 volume,挂载的目录为/var/log/

日志架构 | Kubernetes

#提取yaml

kubectl get pod legacy-app -o yaml > 14.yaml

k8s-CKA-2022真题_第2张图片

kubectl delete pod legacy-app

kubectl apply -f 14.yaml

kubectl get pod legacy-app

15.查找pod

找出具有 name=cpu-user 的 Pod,并过滤出使用 CPU 最高的 Pod,然后把它的名字写在已经存在的/opt/KUTR00401/KUTR00401.txt 文件里

(注意他没有说指定 namespace。所以需要使用-A 指定所以 namespace)

kubectl top po -A -l app=cpu-user --sort-by='cpu'

echo "kuboard-v3-658bfff6c5-f6m2n " > /opt/KUTR00401/KUTR00401.txt


16.检查集群状态

一个名为 wk8s-node-0 的节点状态为 NotReady,让其他恢复至正常状态,并确认所有的更改开机
自动完成

ssh wk8s-node-0

systemctl restart kubelet.service

systemctl enable kubelet.service


17.升级版本kubelet 和 kubectl

现有的 Kubernetes 集权正在运行的版本是 1.24.4,仅将主节点上的所有 kubernetes 控制面板和
组件升级到版本 1.25.0 另外,在主节点上升级 kubelet 和 kubectl

参考:升级 kubeadm 集群 | Kubernetes

kubectl cordon k8s-mast
kubectl drain k8s-mast --ignore-daemonsets --delete-emptydir-data --force

apt update
apt-cache madison kubeadm

apt-mark unhold kubeadm

apt-get update
apt-get install -y kubeadm=1.25.0-00
apt-mark hold kubeadm

sudo kubeadm upgrade apply v1.25.0 --etcd-upgrade=false

apt-mark unhold kubelet kubectl

apt-get update
apt-get install -y kubelet=1.25.0-00 kubectl=1.25.0-00

apt-mark hold kubelet kubectl

sudo systemctl daemon-reload
sudo systemctl restart kubelet

18.etcd 创建快照,恢复快照

针对 etcd 实例 https://127.0.0.1:2379 创建一个快照,
保存到/data/rwbak/etcd-snapshot-previous-20220908-1.db
在创建快照的过程中,如果卡住了,就键入 ctrl+c 终止,然后重试。
然后恢复一个已经存在的快照: /data/rwbak/etcd-snapshot-previous-20220908-2.db
执行 etcdctl 命令的证书存放在:
ca 证书:/etc/kubernetes/pki/etcd/ca.crt
客户端证书:/etc/kubernetes/pki/etcd/server.crt
客户端密钥:/etc/kubernetes/pki/etcd/server.key

参考:为 Kubernetes 运行 etcd 集群 | Kubernetes

#备份
sudo ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
 --cert=/etc/kubernetes/pki/etcd/server.crt \
 --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /data/rwbak/etcd-snapshot-previous-20220908-1.db

sudo mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak


sudo mv /var/lib/etcd /var/lib/etcd.bak

#恢复
sudo ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
 --cert=/etc/kubernetes/pki/etcd/server.crt \
 --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot restore /data/rwbak/etcd-snapshot-previous-20220908-2.db --data-dir=/var/lib/etcd

sudo mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests

19.统计有污点的节点

kubectl describe nodes |grep -i taint

你可能感兴趣的:(k8s,java,开发语言)