1、CKA真题解析
kubectl自动补全及帮助信息
1、配置kubectl自动补全
apt install bash-completion
source <(kubectl completion bash)
2、kubectl explans 帮助信息
3、kubectl 命令 -h 帮助信息
4、官网
https://kubernetes.io/
1
2
3
4
5
6
7
8
9
10
11
第1题 RBAC 授权(强制记忆,3条命令)
考点:RBAC 授权模型的理解。
考题
参考链接
没必要参考网址,使用-h 帮助更方便。
kubectl create clusterrole -h
kubectl create serviceaccount -h
kubectl create rolebinding -h
https://kubernetes.io/docs/reference/access-authn-authz/rbac/#command-line-utilities
https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/
解答
考题答案
1、切换环境
kubectl config use-context kubernetes
2、配置
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets
kubectl create serviceaccount cicd-token -n app-team1
# 题目中写了“限于 namespace app-team1 中”,则创建 rolebinding。没有写的话,则创建 clusterrolebinding。
kubectl create rolebinding cicd-token-rolebinding --serviceaccount=app-team1:cicd-token --clusterrole=deployment-clusterrole -n app-team1
# rolebinding 后面的名字 cicd-token-rolebinding 随便起的,因为题目中没有要求,如果题目中有要求,就不能随便起了。
3、验证
#稍微验证下
kubectl describe rolebinding cicd-token-rolebinding -napp-team1
1
2
3
4
5
6
7
8
9
10
11
12
13
注意:我们可以用describle命令看下刚才新建的rolebinding来验证下:
答题技巧
#说明:
解题三步骤:
1.创建clusterrole
2.创建serviceaccount
3.将新的clusterrole绑定到新的serviceaccount :rolebinding
1.之前我们是通过yaml文件进行创建的,这次通过命令行进行创建;(直接强制记忆就好;)
2.从书签链接可以找到一些命令,但是尽量建议熟悉记忆上面3条命令,直接敲出来即可;(直接搜索`一些命令行工具`关键字即可)
此题注意事项:
一般来水,如下是对应绑定的:(但是也可以rolebinding和clusterrole对应)
role --> rolebinding 有ns之说
clusterrole --> clusterrolebinding 无ns之说
serviceaccount 有ns之说
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
第2题 统计使用 CPU 最高的 Pod(强制记忆,送分题)
考点:kubectl top -l 命令的使用
考题
参考链接
没必要参考网址,使用-h 帮助更方便。
kubectl top pod -h
https://kubernetes.io/docs/reference/kubectl/cheatsheet/#interacting-with-running-pods
解答
1、切换环境
kubectl config use-context kubernetes
2、配置
kubectl top pod -l name=cpu-utilizer --sort-by="cpu" -A #-A是所有namespace 不要忘记写哦,-l也要记得写哦。。。
echo "<podname>" > /opt/KUR00401.txt # 将第一个 Pod 名称写到文件
#写完后记得检查下那个保存结果的文件
3、验证
cat /opt/KUR00401.txt
1
2
3
4
5
6
7
8
9
10
11
答题技巧
metric-server已经准备好了,我们不用管;
1
第3题 网络策略(拷贝yaml)(注意yaml位置)
(考题知识点:kubernetes安全章节/网络策略)7’
考题
双重否定就是肯定,所以最后两句话的意思就是:
仅允许端口为 8080 的 pod 访问。
仅允许 my-app命名空间中的 pod 访问。
️ 码的,这个翻译起来真的有点别扭。。。。。
参考链接
解答
原课件答案
1、切换环境
kubectl config use-context hk8s
2、配置
#如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用。
给命名空间打标签:kubectl label namespace big-corp name=big-corp
编写一个 yaml 文件
vim networkpolicy.yaml
#注意 :set paste,防止 yaml 文件空格错序。
apiVersion: networking.kubernetes.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: my-app #被访问者的命名空间
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: big-corp #访问者的命名空间的标签
ports:
- protocol: TCP
port: 8080 #被访问者公开的端口
kubectl apply -f networkpolicy.yaml
3、验证
kubectl get networkpolicy -nmy-app
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
32
33
34
答题技巧
这个题也是争议比较大,这个题目翻译后比较模糊,先按照下面答案来做就行。这个题一直也没变过;直接从官方yaml拷贝过来,删除没用的,修改为题目要求的,就好;
1
官方yaml
apiVersion: networking.kubernetes.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
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
32
33
34
删除egress,ingress里的ipBlock,podSelector部分,修改spec.podSelector后面为空。
另一个版本
检查:
第4题 SVC 暴露应用(强制记忆)
考点:将现有的 deploy 暴露成 nodeport 的 service。
考题
参考链接
强制记忆即可。
解答
解题
1、切换环境
kubectl config use-context kubernetes
2、配置
kubectl edit deployment front-end
…
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- name: http #额额,这里要加一个-横杠的。。。
protocol: TCP #protocol不写也是可以的,因为默认就是TCP
containerPort: 80
…
kubectl expose deployment front-end --port=80 --target-port=80 --type=NodePort --name=front-end-svc #注意:这里--name(不要忘记了。。。。)svc类型:NodePort/ClusterIP; --port是svc的端口号,--target-port是deployment里pod的容器的端口号
#验证:(看下他们的SELECTOR标签是否一致)
kubectl get svc front-end-svc -owide
kubectl get deployment front-end -owide
curl 节点名/节点ip:NodePort
curl svcIP:port
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
答题技巧
无链接,理解记忆即可;
1
另一个版本(知道即可)
第5题 Ingress创建(拷贝yaml)(注意yaml位置)
考点:Ingress 的创建
考题
-k:跳过SSL证书检测
-L:跟随跳转,比如网站做了重定向,不加这个选项的话只会看到一个302的访问代码就结束了,加上的话会看到完整的跳转情况
参考链接
️ yaml路径:
参考资料:https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
解答
课件答案
1、切换环境
kubectl config use-context k8s
2、配置
vim ingress.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: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
#如果测试结果没有hello输出,则可以尝试删除annotations字段内容;
# 注意,如果等待5min后,这个还是出不来Ip时,可以看下那个hello服务类型是不是ClusterIP类型,如果不是,请修改为ClusterIp
3、验证
kubectl get ingress -ning-internal
curl -kL internal_IP/hello
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
答题技巧
1.直接从官方代码复制过来修改下即可;
2.如果测试结果没有hello输出,则可以尝试删除annotations字段内容;
3.注意,一般自己的学习环境是看不到这个ingress 的 IP 地址的,而考试环境是可以的;
1
2
3
官方yaml代码需要修改的地方
注意:ingress资源还要加上一个namesapce的。
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: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
另一版本
暂时忽略。。。
第6题 扩容 deployment 副本数量(强制记忆,送分题)
(考题知识点:kubernetes管理应用声明周期pod)4’
考题
参考链接
没必要参考网址,使用-h 帮助更方便。
kubectl scale deployment -h
https://kubernetes.io/zh-cn/docs/tasks/run-application/scale-stateful-set/
解题
1、切换环境
kubectl config use-context k8s
2、配置
kubectl scale deployment loadbalancer --replicas=5
3、验证
kubectl get po
kubectl get deployment
1
2
3
4
5
6
7
8
9
这里可以先检查下pod数量哈哈
第7题 调度 pod 到指定节点(强制记忆,送分题)
考点:nodeSelect 属性的使用
考题
参考链接
解答
参考资料:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/ 这个需要打开pod的链接。。。nodeSelector那里的链接不见了的。。。。
解题