参考:
网站、视频
官网https://www.cncf.io/certification/cka/
大纲https://training.linuxfoundation.cn/certificates/1
k8s官网
命令查询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/09L3OhW6vO9DpCUOk3zaGg
https://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
灵活利用-h
kubectl 自动补全
https://kubernetes.io/zh/docs/reference/kubectl/cheatsheet/#kubectl-%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8
echo "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: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: busybox-log
name: busybox-log
spec:
containers:
- image: busybox
name: busybox-log
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
#修改yaml文件
$ vi busybox-log.yaml
spec:
containers:
- command:
- sh
- -c
- echo important information > /log/data/output.log; sleep 1d
image: busybox
name: log-pro
resources: {}
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /log/data
name: log
#增加一个容器
- command:
- sh
- -c
- tail -f /log/data/output.log
image: busybox
name: log-cus
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /log/data
name: log
dnsPolicy: ClusterFirst
restartPolicy: Always
volumes:
- name: log
emptyDir: {}
status: {}
kubectl -n cka apply -f busybox-log.yaml
打印
[root@zm001 cka]# kubectl -n cka exec -it busybox-log -- cat /log/data/output.log
Defaulted container "busybox-pro" out of: busybox-pro, log-cus
information
[root@zm001 cka]# kubectl -n cka exec -it busybox-log -c log-cus -- cat /log/data/output.log
information
Taints和Toleration
#因为master节点一般存在Taints :node-role.kubernetes.io/master=NoSchedule
tolerations:
- key: node-role.kubernetes.io/master
effect: 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 staticpod
staticPodPath: /etc/kubernetes/manifests
$ ls /etc/kubernetes/manifests
etcd.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-schedule
manual-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: v1
kind: Pod
metadata:
name: nginx-kusc00401
spec:
containers:
- image: nginx
name: nginx-kusc00401
nodeSelector:
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 <<EOF
kubectl config current-context
EOF
$ 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 kubelet
root 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.yaml
apiVersion: kubelet.config.k8s.io/v1beta1
authentication:
anonymous:
enabled: false
webhook:
cacheTTL: 0s
enabled: true
x509:
clientCAFile: /etc/kubernetes/pki/ca.crt
authorization:
mode: Webhook
webhook:
cacheAuthorizedTTL: 0s
cacheUnauthorizedTTL: 0s
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
clusterDomain: cluster.local
cpuManagerReconcilePeriod: 0s
evictionPressureTransitionPeriod: 0s
fileCheckFrequency: 0s
healthzBindAddress: 127.0.0.1
healthzPort: 10248
httpCheckFrequency: 0s
imageMinimumGCAge: 0s
kind: KubeletConfiguration
logging:
flushFrequency: 0
options:
json:
infoBufferSize: "0"
verbosity: 0
memorySwap: {}
nodeStatusReportFrequency: 0s
nodeStatusUpdateFrequency: 0s
rotateCertificates: true
runtimeRequestTimeout: 0s
shutdownGracePeriod: 0s
shutdownGracePeriodCriticalPods: 0s
staticPodPath: /etc/kubernetes/manifests
streamingConnectionIdleTimeout: 0s
syncFrequency: 0s
volumeStatsAggPeriod: 0s
查找staticpod线索
cgroupDriver: systemd
clusterDNS:
- 10.96.0.10
staticPodPath: /etc/kubernetes/manifests
#查找staticpod相关信息
[root@zm manifests]# cat /var/lib/kubelet/config.yaml | grep -i staticpod
staticPodPath: /etc/kubernetes/manifests
进入staticPodPath: /etc/kubernetes/manifests
[root@zm manifests]# ls /etc/kubernetes/manifests
etcd.yaml kube-apiserver.yaml kube-controller-manager.yaml kube-scheduler.yaml
[root@zm manifests]# kubectl get pod -A | grep dns
kube-system coredns-6d8c4cb4d-gdttk 1/1 Running 0 2d6h
kube-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 -A2
Validity
Not Before: Apr 15 02:56:59 2022 GMT
Not 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 并且没有定义 storageClassName
apiVersion: v1
kind: PersistentVolume
metadata:
name: safari-pv
labels:
type: local
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/Volumes/Data"
接下来在命名空间 project-tiger 中创建一个
名为 safari-pvc 的新 PersistentVolumeClaim。 它应该请求 2Gi 存储,
accessMode ReadWriteOnce 并且不应定义 storageClassName。 PVC 应该正确绑定到 PV。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: safari-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
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: null
labels:
app: safari
spec:
containers:
- image: httpd:2.4.41-alpine
name: httpd
resources: {}
volumeMounts:
- mountPath: /tmp/safari-data
name: data
volumes:
- name: data
persistentVolumeClaim:
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.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: fubar
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
ns: internal
ports:
- protocol: TCP
port: 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
九、存储管理
本地卷
emptyDir
hostPath
网络数据卷
NFS
iscsi
持久性存储
persistent volume
persistent volumeclaim
十、job
创建job
了解job中pod的重启策略
计划任务job
十一、网络模型
kubernetes跨机器通信原理
flannel网络
calico网络
cancl网络
网络策略
十二、kubernetes日志管理
Kubernetes日志收集方法介绍
ELK概述及部署
ELK日志管理
十三kubernetes监控
监控方案
使用prometheus监控
十四、Kubernetes应用部署HelmChart
Helm工具的架构和安装使用
Charts的概念和使用
十五、安全及配额管理
安全管理
API服务器认证及授权
Authorization(ABAC,RBAC)
Service Account
资源限制
LimitRange
ResourceQuota
Security Contexts
十六、DevOps
了解devops
gitlab配置
安装及配置Jenkins
使用gitlab+Jenkins+kubernetes建立CI/CD解决方案