手把手带你过CNCF CKA考试 (第一章)
随着云原生和golang的日渐发展,CKA的普及度也越来越高了.现在市面上均是收费题库.并没有太多整体的复习资料,本人于2021年5月刚刚通过CKA考试.本文将分享我的考试心得及复习资料
先说心得
- 每道题请务必看是否需要执行kubectl config use-context k8s来加载环境变量,只有少部分的题不需要加载环境变量(因为可能用的是上一题的环境).环境变量名称大部分是 hk8s mk8s等等.环境变量会直接导致你答案的准确性.
- 不会的题可以点击左下侧按钮记性 flag 标记等全部完成后再回来做题(再次提醒如果是这种情况也要务必记得重新加载本题的环境变量)
- 故障排查问题/集群升级问题 需要进入对应节点 提权至root权限后进行配置,等本题操作完成后,务必记得退出到student(本地)的控制台再进行下一题,(需要退出两次,第一次是退出到非root账户,第二次是退出对应节点ssh)
- 考试时允许开启最多一个tab页面来查阅文档,可以提前在收藏夹里把一些重点文档保存下来方便查阅(.io的搜索系统有时候不好用需要多请求几次)
考试大纲
下面我来按照考试大纲分享一下最新的2021年五月的考题及重点难点.
25% - Cluster Architecture, Installation & Configuration
• Manage role based access control (RBAC)
• Use Kubeadm to install a basic cluster
• Manage a highly-available Kubernetes cluster
• Provision underlying infrastructure to deploy a Kubernetes cluster
• Perform a version upgrade on a Kubernetes cluster using Kubeadm
• Implement etcd backup and restore
• RBAC的管理 参考文档
Rolebinding不能跨namespace, ClusterRolebinding可以跨namespace,考察RBAC,要求创建指定namespace下的serviceAccount,并创建Role/ClusterRole,绑定serviceAccount。要求指定的sa对指定namespace有创建pod的权限(如果是对整个集群的话,需要用ClusterRoleBinding)
# 创建一个namespace
kubectl create namespace app-team1
# 创建一个serviceaccount 到 app-team1 这个namespace下面 名称是cicd-token
kubectl -n app-team1 create serviceaccount cicd-token
# 创建一个跨集群的绑定关系
kubectl -n app-team1 create rolebinding cicd-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
# 查看这个绑定关系
kubectl -n app-team1 describe rolebindings.rbac.authorization.k8s.io cicd-token-binding
• 使用Kubeadm 安装基础集群 参考文档
现在基本上都是可以通过yum/apt等直接安装kubeadm,考试应该是debian 所以使用apt-get 安装kubeadm工具.安装完后直接执行kubeadm init即可
• 管理高可用的k8s集群 参考文档
考试一般都会提供你k8s环境 你直接use 环境变量即可引用相关内容,在这里不做过多介绍.部署一个高可用的集群优先要保证各个节点的etcd都在运行后参考文档链接即可完成部署.
• 部署一个k8s集群 参考文档
创建阿里云ecs实例
- 使用最小2C2G的debian或者Ubuntu
- 关闭swap,没记错的话阿里云已经帮助关闭了swap file.
- 通过上面的模板可以自行创建多个实例.
-
- 通过iptables 查看流量
-
- 可以通过此脚本安装 docker-install
- 安装 kubeadm, kubelet, and kubectl
你也可以通过下面的命令来安装
#!/bin/bash
# Disable Swap
sudo swapoff -a
# Bridge Network
sudo modprobe br_netfilter
sudo cat <<'EOF' | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
# Install Docker
sudo curl -fsSL https://get.docker.com -o /home/ubuntu/get-docker.sh
sudo sh /home/ubuntu/get-docker.sh
# Install Kube tools
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<'EOF' | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Optionally, add sudo kubeadm config images pull
to the end of the script to pre-pull images required for setting up a Kubernetes cluster.
$ sudo kubeadm config images pull
[config/images] Pulled k8s.gcr.io/kube-apiserver:v1.19.2
[config/images] Pulled k8s.gcr.io/kube-controller-manager:v1.19.2
[config/images] Pulled k8s.gcr.io/kube-scheduler:v1.19.2
[config/images] Pulled k8s.gcr.io/kube-proxy:v1.19.2
[config/images] Pulled k8s.gcr.io/pause:3.2
[config/images] Pulled k8s.gcr.io/etcd:3.4.13-0
[config/images] Pulled k8s.gcr.io/coredns:1.7.0
• 使用kubeadm 升级集群
升级集群以及维护节点必备的2个前置动作就是先通过cordon命令把预操作的节点状态置成"停止调度"(SchedulingDisabled)以及通过drain命令将跑在上面的pod调度到其他node上后,再进行对node的其他运维操作.
apt-get install kubeadm
kubeadm version
kubeadm upgrade plan
kubeadm upgrade apply v1.19.0
kubectl config use-context mk8s
kubectl get node
kubectl cordon mk8s-master-1
kubectl drain mk8s-master-1 --delete-local-data --ignore-daemonsets --force
ssh mk8s-master-1
sudo -i
apt-get install -y kubeadm=1.19.0-00
kubeadm version
kubeadm upgrade plan
kubeadm upgrade apply v1.19.0 --etcd-upgrade=false
apt-get install kubelet=1.19.0-00 kubectl=1.19.0-00
kubelet version
kubelet version
systemctl status kubelete
systemctl daemon-reload
exit
exit
kubectl get node # 确认只升级了master节点到1.19.0
• 熟练掌握etcd的备份和还原 参考文档
先输出ETCDCTL_API=3的环境变量,
熟练掌握各种子命令
- --endpoints etcd连接地址
- --cacert ca公钥
- --cert 客户端证书
- --key 客户端私钥
- save 保存 restore恢复
export ETCDCTL_API=3 # 设置API版本v3
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