参考:
网站、视频
官网https://www.cncf.io/certification/cka/大纲https://training.linuxfoundation.cn/certificates/1k8s官网命令查询https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands学习指南https://github.com/David-VTUK/CKA-StudyGuide网络策略专项https://github.com/ahmetb/kubernetes-network-policy-recipes模拟考试https://killer.sh视频:极客时间:《深入剖析Kubernetes》阿里:《云原生技术公开课》B站:培训视频
网友笔记、指南
《Kubernetes CKA 证书备考笔记》https://mp.weixin.qq.com/s/09L3OhW6vO9DpCUOk3zaGghttps://github.com/kabary/kubernetes-cka/wiki/CKA-Killer-20-Questions《CKA备考》https://www.yuque.com/enjoy-ayk9k/tag9bz/lazqbg《CKA考试题目》https://www.yuque.com/zunlong/yty1dh/oruzdy高阶:《云原生学习笔记》https://www.yuque.com/baxiaoshi/tyado3
考试情况简介
报名费:2498。黑色星期五有活动。
17道题,上机。有一次补考机会
大纲:
CKA认证考试包括这些一般领域及其在考试中的权重:集群架构,安装和配置:25%工作负载和调度:15%服务和网络:20%存储:10%故障排除:30%详细内容:集群架构,安装和配置:25%• 管理基于角色的访问控制(RBAC)• 使用Kubeadm安装基本集群• 管理高可用性的Kubernetes集群• 设置基础架构以部署Kubernetes集群• 使用Kubeadm在Kubernetes集群上执行版本升级• 实施etcd备份和还原工作负载和调度:15%• 了解部署以及如何执行滚动更新和回滚• 使用ConfigMaps和Secrets配置应用程序• 了解如何扩展应用程序• 了解用于创建健壮的、自修复的应用程序部署的原语• 了解资源限制如何影响Pod调度• 了解清单管理和通用模板工具服务和网络:20%• 了解集群节点上的主机网络配置• 理解Pods之间的连通性• 了解ClusterIP、NodePort、LoadBalancer服务类型和端点• 了解如何使用入口控制器和入口资源• 了解如何配置和使用CoreDNS• 选择适当的容器网络接口插件存储:10%• 了解存储类、持久卷• 了解卷模式、访问模式和卷回收策略• 理解持久容量声明原语• 了解如何配置具有持久性存储的应用程序故障排除:30%• 评估集群和节点日志• 了解如何监视应用程序• 管理容器标准输出和标准错误日志• 解决应用程序故障• 对群集组件故障进行故障排除• 排除网络故障
技巧和效率
与考点相关的官方文档可以提前加入收藏夹。考试时直接根据考点快速查看,相当于建了个索引,能极大提高检索效率。尽量从官网复制yaml文件,或用--dry-run=client,而不是手打,能大大提高效率,也避免敲错浪费时间。善用 --dry-run=client -o yaml 避免手动敲太多#kubectl create deployment --image=xxx --dry-run=client -o yaml灵活利用-hkubectl 自动补全https://kubernetes.io/zh/docs/reference/kubectl/cheatsheet/#kubectl-%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8echo "source <(kubectl completion bash)" >> ~/.bashrc; source ~/.bashrc每道题开始前要切换 context 和 namespace;必要的 alias考试系统的 Ctrl+C 、Ctrl+V的替代键为Ctrl+Insert、Shift+Insert。实际考试时可灵活利用
简单
#切换环境?$ kubectl config use-context k8s#查看 具有指定标签的Pod 的资源情况$ kubectl top po -A -l name=cpu-user#将ek8s-node-1节点设置为不可用,然后重新调度该节点上的所有Pod$ kubectl cordon $node-name$ kubectl drain $node-name --delete-emptydir-data --ignore-daemonsets --force# --ignore-daemonsets:无视DaemonSet管理下的Pod# -force:强制执行统计这个集群中没有污染的就绪节点,并输出到文件 /root/cka/readyNode.txt# Ready 状态的数量$ kubectl get node | grep -w Ready | wc -l# 查看含有 Taint 的数量,需要排除掉这些$ kubectl describe node | grep Taints | grep -i NoSchedule | wc -l
练习题
工作负载和调度
Pod内多容器、空目录
创建一个pod名称日志,容器名称 log-pro 使用image busybox,在 /log/data/output.log 输出重要信息。然后另一个容器名称 log-cus 使用 image busybox,在 /log/data/output.log 加载 output.log 并打印它。 请注意,此日志文件只能在 pod 内共享
$ kubectl run busybox-log --image=busybox --dry-run=client -o yaml > busybox-log.yaml$ cat busybox-log.yaml#自动生成的yaml文件apiVersion: v1kind: Podmetadata:creationTimestamp: nulllabels:run: busybox-logname: busybox-logspec:containers:- image: busyboxname: busybox-logresources: {}dnsPolicy: ClusterFirstrestartPolicy: Alwaysstatus: {}
#修改yaml文件$ vi busybox-log.yamlspec:containers:- command:- sh- -c- echo important information > /log/data/output.log; sleep 1dimage: busyboxname: log-proresources: {}imagePullPolicy: IfNotPresentvolumeMounts:- mountPath: /log/dataname: log#增加一个容器- command:- sh- -c- tail -f /log/data/output.logimage: busyboxname: log-cusimagePullPolicy: IfNotPresentvolumeMounts:- mountPath: /log/dataname: logdnsPolicy: ClusterFirstrestartPolicy: Alwaysvolumes:- name: logemptyDir: {}status: {}
kubectl -n cka apply -f busybox-log.yaml
打印
[root@zm001 cka]# kubectl -n cka exec -it busybox-log -- cat /log/data/output.logDefaulted container "busybox-pro" out of: busybox-pro, log-cusinformation[root@zm001 cka]# kubectl -n cka exec -it busybox-log -c log-cus -- cat /log/data/output.loginformation
Taints和Toleration
#因为master节点一般存在Taints :node-role.kubernetes.io/master=NoScheduletolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedule
排序
kubectl get pod -A --sort-by '.metadata.creationTimestamp'
手动调度Pod
暂时停止 kube-scheduler,这意味着可以在之后再次启动它;
创建一个pod,手动调度该 Pod;
再次启动 kube-scheduler,确保自动调度。
#kube-scheduler属于static pod,因此需要用到kubelet#查询kube-scheduler相关文件所在的位置$ cat /var/lib/kubelet/config.yaml | grep -i staticpodstaticPodPath: /etc/kubernetes/manifests$ ls /etc/kubernetes/manifestsetcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml#暂时将文件挪走,并重启kubelet$ mv /etc/kubernetes/manifests/kube-scheduler.yaml /etc/kubernetes$ systemctl restart kubelet
#创建pod$ kubectl run manual-schedule --image httpd:2.4-alpine$ kubectl get pod | grep manual-schedulemanual-schedule 0/1 Pending 0 16s#编辑$ kubectl edit pod manual-schedule#添加字段nodeName,指定节点名,从而手动调度nodeName: cka#检查是否变为running
#恢复scheduler$ mv /etc/kubernetes/kube-scheduler.yaml /etc/kubernetes/manifests$ systemctl restart kubelet#检查是否运行$ kubectl get pod -A | grep kube-scheduler#创建$ kubectl run manual-schedule2 --image httpd:2.4-alpine
其他:
查看指定日志 并输出kubectl logs foobar | grep unable-access-website >> /opt/KUTR00101/foobar
nodeSelector:调度到指定节点
按如下要求调度一个 pod:
● 名称:nginx-kusc00401
● Image: nginx
● Node slector: disk=ssd
kubectl run --image=nginx nginx-kusc00401 -o yaml --dry-run=client > 9.yml$ vim 9.yml//修改为如下,并添加红色字体部分apiVersion: v1kind: Podmetadata:name: nginx-kusc00401spec:containers:- image: nginxname: nginx-kusc00401nodeSelector:disk: ssd$ kubectl apply -f 9.yml
集群架构,安装和配置
集群master节点升级

现有的Kubernetes集权正在运行的版本是1.18.8,仅将主节点上的所有kubernetes控制面板和组件升级到版本1.19.0。另外,在主节点上升级kubelet和kubectl,确定在升级前drain主节点,升级后uncordon主节点,请不要升级工作节点。
查看master节点所在机器$ kubectl get nodes切换到master节点$ ssh k8s-master将节点标记为不可调度状态$ kubectl cordon k8s-master驱逐节点上面的pod$ kubectl drain k8s-master --delete-local-data --ignore-daemonsets --force升级组件$ apt-get install kubeadm=1.19.0-00 kubelet=1.19.0-00 kubectl=1.19.0-00重启kubelet服务$ systemctl restart kubelet升级集群$ kubeadm upgrade apply 1.19.0 --etcd-upgrade=false将节点标记为可调度状态$ kubectl uncordon k8s-master
查看集群信息
#显示多个集群$ kubectl config get-contexts -o name#将当前集群名,输出到可执行脚本/opt/course/1/context_default_kubectl.sh中$ cat > /opt/course/1/context_default_kubectl.sh <<EOFkubectl config current-contextEOF$ chmod +x /opt/course/1/context_default_kubectl.sh#得到当前集群名。不使用kubectl命令。$ cat ~/.kube/config | grep current-context | awk '{print $2}'
检查 master 组件 kubelet、kube-apiserver、kube-scheduler、kube-controller-manager 和 etcd 如何在 master 节点上启动/安装。还要找出 DNS 应用的名称以及它是如何在主节点上启动/安装的。
思路:当前比较的组件都是以static pod的形式运行的,而 static pod 都是由 Kubelet 管理的,所以从 kubelet 处入手。
[root@zm cka]# ps -ef | grep -w kubeletroot 17281 1 1 Apr15 ?01:00:00 /usr/bin/kubelet--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf--kubeconfig=/etc/kubernetes/kubelet.conf--config=/var/lib/kubelet/config.yaml--network-plugin=cni--pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.6
定位到—kubeconfig=/etc/kubernetes/kubelet.conf
[root@zm cka]# cat /var/lib/kubelet/config.yamlapiVersion: kubelet.config.k8s.io/v1beta1authentication:anonymous:enabled: falsewebhook:cacheTTL: 0senabled: truex509:clientCAFile: /etc/kubernetes/pki/ca.crtauthorization:mode: Webhookwebhook:cacheAuthorizedTTL: 0scacheUnauthorizedTTL: 0scgroupDriver: systemdclusterDNS:- 10.96.0.10clusterDomain: cluster.localcpuManagerReconcilePeriod: 0sevictionPressureTransitionPeriod: 0sfileCheckFrequency: 0shealthzBindAddress: 127.0.0.1healthzPort: 10248httpCheckFrequency: 0simageMinimumGCAge: 0skind: KubeletConfigurationlogging:flushFrequency: 0options:json:infoBufferSize: "0"verbosity: 0memorySwap: {}nodeStatusReportFrequency: 0snodeStatusUpdateFrequency: 0srotateCertificates: trueruntimeRequestTimeout: 0sshutdownGracePeriod: 0sshutdownGracePeriodCriticalPods: 0sstaticPodPath: /etc/kubernetes/manifestsstreamingConnectionIdleTimeout: 0ssyncFrequency: 0svolumeStatsAggPeriod: 0s
查找staticpod线索
cgroupDriver: systemdclusterDNS:- 10.96.0.10staticPodPath: /etc/kubernetes/manifests#查找staticpod相关信息[root@zm manifests]# cat /var/lib/kubelet/config.yaml | grep -i staticpodstaticPodPath: /etc/kubernetes/manifests
进入staticPodPath: /etc/kubernetes/manifests
[root@zm manifests]# ls /etc/kubernetes/manifestsetcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml
[root@zm manifests]# kubectl get pod -A | grep dnskube-system coredns-6d8c4cb4d-gdttk 1/1 Running 0 2d6hkube-system coredns-6d8c4cb4d-wr27t 1/1 Running 0 2d6h
集群备份和恢复
对在 cluster3-master1 上运行的 etcd 进行备份,并将其保存在主节点上的 /tmp/etcd-backup.db。
#操作 etcd 需要 endpoints、cacert、cert、key。Kubernetes的所有组件与 etcd 的数据交互都是通过 api-server 完成的,我只需要找到 api-server 的运行命令就行#查找apiserver启动参数 中的相关路径$ ps -ef | grep kube-apiserver$ kubectl get pod -n kube-system kube-apiserver-cka -o jsonpath='{.spec.containers[].command}'[root@zm ~]# kubectl get pod -n kube-system kube-apiserver-zm -o jsonpath='{.spec.containers[].command}'["kube-apiserver","--advertise-address=172.23.178.70","--allow-privileged=true","--authorization-mode=Node,RBAC","--client-ca-file=/etc/kubernetes/pki/ca.crt","--enable-admission-plugins=NodeRestriction","--enable-bootstrap-token-auth=true","--etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt","--etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt","--etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key","--etcd-servers=https://127.0.0.1:2379","--kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt","--kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key","--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname","--proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt","--proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key","--requestheader-allowed-names=front-proxy-client","--requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt","--requestheader-extra-headers-prefix=X-Remote-Extra-","--requestheader-group-headers=X-Remote-Group","--requestheader-username-headers=X-Remote-User","--secure-port=6443","--service-account-issuer=https://kubernetes.default.svc.cluster.local","--service-account-key-file=/etc/kubernetes/pki/sa.pub","--service-account-signing-key-file=/etc/kubernetes/pki/sa.key","--service-cluster-ip-range=10.96.0.0/12","--tls-cert-file=/etc/kubernetes/pki/apiserver.crt","--tls-private-key-file=/etc/kubernetes/pki/apiserver.key"]
#备份到/tmp/etcd-backup.db#替换-cacert,-cert=<> --key=<>$ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \--cacert=<> --cert=<> --key=<> \snapshot save /tmp/etcd-backup.db#恢复到/var/lib/etcd-backup#替换-cacert,-cert=<> --key=<>$ ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \--cacert=<> \--cert=<>\--key=<> snapshot restore /tmp/etcd-backup.db \--data-dir /var/lib/etcd-backup
查看证书有效期
$ ps -ef | grep kube-apiserver#查看文件路径和文件名--tls-cert-file=/etc/kubernetes/pki/apiserver.crt#替换$ openssl x509 -noout -text -in /etc/kubernetes/pki/apiserver.crt | grep -i valid -A2[root@zm ~]# openssl x509 -noout -text -in /etc/kubernetes/pki/apiserver.crt | grep -i valid -A2ValidityNot Before: Apr 15 02:56:59 2022 GMTNot After : Apr 15 02:56:59 2023 GMT
RBAC
https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/#role-and-clusterole
kubectl create serviceaccout xxx -n <name_space>kubectl create clusterrole xxx --resource="deployment,statefulSet,daemonSet" --verb="create"kubectl create rolebinding xxx --clusterrole=xxx--serviceaccount="<name_space>:xxx" -n <name_space>
存储
创建PV,PVC并挂载
https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
创建一个名为 safari-pv 的新 PersistentVolume。它应该具有 2Gi 的容量、accessMode ReadWriteOnce、hostPath /Volumes/Data 并且没有定义 storageClassNameapiVersion: v1kind: PersistentVolumemetadata:name: safari-pvlabels:type: localspec:capacity:storage: 2GiaccessModes:- ReadWriteOncehostPath:path: "/Volumes/Data"接下来在命名空间 project-tiger 中创建一个名为 safari-pvc 的新 PersistentVolumeClaim。 它应该请求 2Gi 存储,accessMode ReadWriteOnce 并且不应定义 storageClassName。 PVC 应该正确绑定到 PV。apiVersion: v1kind: PersistentVolumeClaimmetadata:name: safari-pvcspec:accessModes:- ReadWriteOnceresources:requests:storage: 2Gi最后在命名空间 project-tiger 中创建一个新的 Deployment safari,它将该卷挂载到 /tmp/safari-data。该 Deployment 的 Pod 应该是镜像 httpd:2.4.41-alpine。$ kubectl create deployment safari --image httpd:2.4.41-alpine --dry-run=client -o yaml编辑:。。。前面部分省略template:metadata:creationTimestamp: nulllabels:app: safarispec:containers:- image: httpd:2.4.41-alpinename: httpdresources: {}volumeMounts:- mountPath: /tmp/safari-dataname: datavolumes:- name: datapersistentVolumeClaim:claimName: safari-pvc
故障排除
服务和网络
网络策略 NetworkPolicy
https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/
在现有的 namspace fubar 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy
确保新的 NetworkPolicy 允许 namespace internal 中的 Pods 连接到 namespace fubar 中的 Pods 端口 9200
kubectl label ns internal ns=internal[student@node-1]$ vim 5.yamlapiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: allow-port-from-namespacenamespace: fubarspec:podSelector: {}policyTypes:- Ingressingress:- from:- namespaceSelector:matchLabels:ns: internalports:- protocol: TCPport: 9200
Ingress
https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
如下创建一个新的 nginx Ingress 资源:
● 名称:pong
● Namespace: ing-internal
● 使用服务端口 5678 在路径/hello 上公开 service hello
[student@node-1]$ kubectl get ingressclass//检查是否有 ingressclass,如果有,记录名字[student@node-1]$ kubectl create ingress pong -n ing-internal --rule='/hello=hello:5678' --class=nginx//检查如果有 ingressclass,则指定,否则忽略--class=nginx
附:
灵雀云CKA线上培训课程大纲
30课时
一、kubernetes框架了解kubernetes的框架了解kubernetes各个组件的含义二、kubernetes安装etcd管理etcd快照管理kubeadmin安装多集群之间切换了解什么是命名空间命名空间管理三、pod及节点管理创建查询及删除pod了解pod重启策略在pod中运行指定命令pod中变量的设置在pod中执行命令pod的调度策略通过label手动指定pod运行的节点初始化容器 (init container)静态pod (static pod)节点cordon及uncordon管理四、密码管理使用secret管理密码以卷的方式引用密码以变量的方式引用密码使用configmap管理密码五、deployment理解deployment的作用通过命令行的方式快速deployment通过YAML方式创建deployment使用deployment对镜像版本进行升级及回滚使用deployment管理pod副本数弹性伸缩滚动升级自动弹性伸缩六、健康性检查pod的默认检查策略通过liveness对pod健康性检查使用readiness对pod健康性检查健康性检查在各种环境中的应用七、daemonset八、服务发现理解service的工作原理服务的类型: clusterIP, NodePort, LoadBalancer,ingress服务的发现环境变量DNS九、存储管理本地卷emptyDirhostPath网络数据卷NFSiscsi持久性存储persistent volumepersistent volumeclaim十、job创建job了解job中pod的重启策略计划任务job十一、网络模型kubernetes跨机器通信原理flannel网络calico网络cancl网络网络策略十二、kubernetes日志管理Kubernetes日志收集方法介绍ELK概述及部署ELK日志管理十三kubernetes监控监控方案使用prometheus监控十四、Kubernetes应用部署HelmChartHelm工具的架构和安装使用Charts的概念和使用十五、安全及配额管理安全管理API服务器认证及授权Authorization(ABAC,RBAC)Service Account资源限制LimitRangeResourceQuotaSecurity Contexts十六、DevOps了解devopsgitlab配置安装及配置Jenkins使用gitlab+Jenkins+kubernetes建立CI/CD解决方案
