CKA题库练习

开启TAB补全

做题前先配置k8s自动补齐功能,否则无法TAB补全命令:

  1. 登陆管理节点
  2. kubectl --help | grep bash,此步是为了找关键词completion
    k8s-cka考试题库_vim_02
  3. sudo vim /etc/profile
  4. 添加source <(kubectl completion bash)
    k8s-cka考试题库_nginx_03
    5.保存退出,source /etc/profile

创建ClusterRole

  • 创建一个名字为deployment-clusterrole且仅允许创建以下资源类型的新ClusterRole:
    • Deployment
    • StatefulSet
    • DaemonSet
  • 在现有的 namespace app-team1 中创建有个名为 cicd-token 的新 ServiceAccount
  • 限 于 namespace app-team1 , 将 新 的 ClusterRole deployment-clusterrole 绑 定 到 新 的 ServiceAccount cicd-token。
1
2
3
kubectl create clusterrole deployment-clusterrole --verb=create --resource=Deployment,StatefulSet,DaemonSet
kubectl create serviceaccount cicd-token -n app-team1
kubectl create rolebinding xxx(随便起名字) --clusterrole=deployment-clusterrole --serviceaccount=cicd-token:app-team1 -n app-team1

设置节点不可用,并重新调度pod

将名为 ek8s-node-0 (vms25)的 node 设置为不可用,并重新调度该 node 上所有运行的 pods

1
2
kubectl cordon ek8s-node-0 (vms25)    # 设置节点是不可调度状态
kubectl drain ek8s-node-0 (vms25) --delete-emptydir-data --ignore-daemonsets --force

此三个命令都会使node停止被调度,后期创建的pod不会继续被调度到该节点上,但操作的暴力程度不一

1.cordon 停止调度
影响最小,只会将node调为SchedulingDisabled
之后再发创建pod,不会被调度到该节点
旧有的pod不会受到影响,仍正常对外提供服务

恢复调度
kubectl uncordon node_name

2.drain 驱逐节点
首先,驱逐node上的pod,其他节点重新创建
接着,将节点调为 SchedulingDisabled

–force
当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时候
就需要用–force来强制执行 (例如:kube-proxy)

–ignore-daemonsets
无视DaemonSet管理下的Pod

–delete-local-data
如果有mount local volumn的pod,会强制杀掉该pod并把料清除掉
另外如果跟本身的配置讯息有冲突时,drain就不会执行

恢复调度
kubectl uncordon node_name

  1. 封锁节点,先让节点变的不可调度

    kubectl cordon

  2. 对节点执行维护操作之前(例如:内核升级,硬件维护等),您可以使用 kubectl drain 安全驱逐节点上面所有的 pod。

安全驱逐的方式将会允许 pod 里面的容器遵循指定的 PodDisruptionBudgets 执行优雅的中止
注: 默认情况下,kubectl drain 会忽略那些不能杀死的系统类型的 pod,如果您想了解更多详细的内容,请参考kubectl drain

kubectl drain 返回成功表明所有的 pod (除了前面排除的那些)已经被安全驱逐(遵循期望优雅的中止期,并且没有违反任何应用程序级别的中断预算)。

然后,通过对物理机断电或者在云平台上删除节点所在的虚拟机,都能安全的将节点移除。

kubectl uncordon 恢复调度pod

1
2
3
4
5
6
7
8
9
# 确定要排空的节点的名称
kubectl get nodes
# 查看获取pod名字
kubectl get po
# 命令node节点开始释放所有pod,并且不接收新的pod进程
kubectl drain [node-name] --force --ignore-daemonsets --delete-local-data
# 这时候把需要做的事情做一下。比如上面说的更改docker文件daemon.json或者说node节点故障需要进行的处理操作
# 然后恢复node,恢复接收新的pod进程
kubectl uncordon [node-name]

3.delete 删除节点
首先,驱逐node上的pod,其他节点重新创建
然后,从master节点删除该node,master对其不可见,失去对其控制,master不可对其恢复

恢复调度,需进入node节点,重启kubelet
基于node的自注册功能,节点重新恢复使用
systemctl restart kubelet

delete是一个比较粗暴的命令,它会将被删node上的pod直接驱逐,由其他node创建(针对replicaset),然后将被删节点从master管理范围内移除,master对其失去管理控制,若想使node重归麾下,必须在node节点重启kubelet

升级集群

现有的 Kubernetes 集群正在运行版本 1.24.2。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.24.3。

确保在升级之前 drain master 节点,并在升级后 uncordon master 节点。

可以使用一下命令,通过 ssh 连接到 master 节点:

ssh master01

可以使用一下命令,在该 master 节点上获取更高权限:

sudo -i

另外,在主节点上升级 kubelet 和 kubectl。

请不要升级工作节点,etcd,container 管理区,CNI 插件,DNS 服务或任何其他插件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 停止调度主节点,并驱逐(腾空)主节点。
kubectl cordon master01
kubectl drain master01 --ignore-daemonsets
# 通过 ssh 的方式到 master01 节点,并且获取到 root 权限
ssh master01
sudo -i
# 查找并下载要升级的 kubeadm 安装包
apt-get update
apt-cache show kubeadm|grep 1.24.3
apt-get install kubeadm=1.24.3-00
# 检查 kubeadm 升级后的版本
kubeadm version
# 此命令检查你的集群是否可被升级,并取回你要升级的目标版本。 命令也会显示一个包含组件配置版本状态的表格。
kubeadm upgrade plan
# 升级 kubeadm ,排除 etcd 升级
kubeadm upgrade apply v1.24.3 --etcd-upgrade=false
# 升级 kubelet
apt-get install kubelet=1.24.3-00
kubelet --version
# 升级 kubectl
apt-get install kubectl=1.24.3-00
kubectl version
# 退出升级
# 退出 root,退回到 candidate@master01
exit
# 退出 master01,退回到 candidate@node01
exit
# 不要输入 exit 多了,否则会退出考试环境的。
# 恢复 master01 调度并检查状态
kubectl uncordon master01
kubectl get node

etcd备份还原

首先,创建运行在https://127.0.0.1:2379现有etcd实例的快照,将快照保存到文件路径 /data/backup/etcd-snapshot.db
接下来,恢复现有的,以前的快照位于 /data/backup/etcd-snapshot-previous. db
etcd实例正在运行etcd版本3.1.10
提供以下TLS证书/密钥用于使用etcdctl连接到服务器
CA证书: /opt/KUCM00302/ca.crt
客户证书: /opt/KUCM00302/etcd-client.crt
客户端密钥:/opt/KU CM 00302/etc d-client. key

备份

1
2
3
4
5
#参数说明
#ETCDCTL_API=3 表示选择 etcdctl version3
#--endpoints 默认只有一个localhost:2379,http和https都可以
#配置了--endpoints,则必须配置 --cert,--key,--cacert
ETCDCTL_API=3 etcdctl --endpoints=127.0.0.1:2379 --cert=/opt/KUCM00302/etcd-client.crt --key=/opt/KUCM00302/etcd-client.key --cacert=/opt/KUCM00302/ca.crt snapshot save /data/backup/etcd-snapshot.db

还原

1
ETCDCTL_API=3 etcdctl --endpoints=http://127.0.0.1:2379 snapshot restore /data/backup/etcd-snapshot.db

NetworkPolicy 网络策略

  • 设置配置环境 kubectl config use-context k8s
  • 在 internal 命名空间创建一个名为 allow-port-from-namespace 的 NetworkPolicy。
  • 允 许 namespace internal 中的 Pods 来连接到 namespace big-corp 中的端口 9200。
  • 确保新的 NetworkPolicy:
    • 不允许对没有在监听端口 9200 的 pods 访问
    • 不允许不来自 namespace internal 的 pods 的访问

参考:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 这是一个 NetworkPolicy 的示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
# 指定 NetworkPolicy 的名称和命名空间
name: allow-port-from-namespace
namespace: internal
spec:
# 选择匹配标签为 role: db 的 Pod
podSelector: {} # 选择所有 Pods
# 指定策略类型为 Ingress
policyTypes:
- Ingress
# 定义 Ingress 规则
ingress:
- from:
# 从指定命名空间 big-corp 中的所有 Pods 允许流入
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: big-corp
# 允许端口 9200 的 TCP 流量
ports:
- protocol: TCP
port: 9200