4.1. 权限控制RBAC

题目

设置答题配置环境:
kubectl config use-context k8s

Context:
为部署流水线创建一个新的 ClusterRole 并将其绑定到范围为特定的 namespace 的特定 ServiceAccount。

Task:
创建一个名为 deployment-clusterrole 且仅允许创建以下资源类型的新 ClusterRole:
Deployment
StatefulSet
DaemonSet
在现有的 namespace app-team1 中创建一个名为 cicd-token 的新 ServiceAccount。
限于 namespace app-team1 中,将新的 ClusterRole deployment-clusterrole 绑定到新的 ServiceAccount cicd-token。
# 设置答题环境
kubectl config use-context k8s
# 创建一个cluster role
kubectl create clusterrole deployment-clusterrole --verb=create  --source=Deployment,StatefulSet,DaemonSet
# 创建ServiceAccount
kubectl create serviceaccount cicd-token -n app-team1
# 绑定
kubectl create rolebinding cicd-token-binding  --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -n app-team1
# 检查
kubectl describe rolebinding cicd-token-binding -n app-team1
kubectl describe clusterrole deployment-clusterrole
kubectl describe serviceaccount cicd-token -n app-team1

4.2. node节点维护

题目

配置环境kubectl config use-context ek8s

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

官方参考地址:Kubectl Reference Docs
帮助命令: kubectl drain --help

解答:

# 切换答题环境
kubectl config use-context ek8s
# 设置节点不可调度
kubectl cordon ek8s-node-0
# 驱逐
kubectl drain ek8s-node-0 --force  --ignore-daemonsets  --delete-emptydir-data
# 查看ek8s-node-0机器上面pod情况
kubectl get pod -o wide -A | grep ek8s-node-0

4.3. k8s集群版本升级

4.4. ETCD数据备份与恢复

题目

首先为运行在https://127.0.0.1:2379 上的现有etcd实例创建快照并将快照保存到
/srv/data/etcd-snapshot.db。

注:为给定实例创建快照预计能在几秒钟内完成。如果该操作似乎挂起,则命令可能有问题。用
ctrl+c 来取消操作,然后重试。

然后还原位于/srv/data/etcd-snapshot-previous.db的现有先前快照。

提供了TLS 证书和密钥,以通过etcdctl 连接到服务器。
CA 证书:/opt/KUIN00601/ca.crt
客户端证书: /opt/KUIN00601/etcd-client.crt
客户端密钥:/opt/KUIN00601/etcd-client.key

官方参考地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/

解答

# 创建快照。
ETCDCTL_API=3 etcdctl --endpoints https://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
# 查看快照
etcdutl --write-out=table snapshot status /srv/data/etcd-snapshot.db
# 恢复快照
ETCDCTL_API=3 etcdctl --endpoints https://127.0.0.1:2379  --cacert=/opt/KUIN00601/ca.crt --cert=/opt/KUIN00601/etcd-client.crt --key=/opt/KUIN00601/etcd-client.key snapshot restore /srv/data/etcd-snapshot.db

4.5. 配置网格策略

题目1


题目一:设置配置环境: [candidate@node-1] $ kubectl config use-context hk8s

Task 在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。 确保新的 NetworkPolicy 允许 namespace echo 中的 Pods 连接到 namespace my-app 中的 Pods 的 9000 端口。 进一步确保新的 NetworkPolicy: – 不允许对没有在监听 端口 9000 的 Pods 的访问 – 不允许非来自 namespace echo 中的 Pods 的访问

# # 1.更换配置环境
kubectl config use-context hk8s
# 创建命名空间
kubectl create ns my-app
kubectl create ns echo
# 查看ns标签
kubectl get ns --show-labels
# 创建network policy
kubectl apply -f allow-port-from-namespace.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
    name: allow-port-from-namespace
    namespace: my-app
spec:
    podSelector:
      matchLabels: {}
policyTypes:
- Ingress
ingress:
- from:
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: echo
    ports:
    - protocol: TCP
      port: 9000

题目2

题目二:
设置配置环境kubectl config use-context k8s

创建一个名为allow-port-from-namespace2的新NetworkPolicy,以允许现有namespace my-app中的Pods连接到同一namespace中其他pods的端口9200。

确保新的NetworkPolicy:
-- 不允许对没有在监听端口9200的pods访问
-- 不允许不来自namespace my-app的pods的访问
#1.切换环境:
kubectl config use-context k8s
# 创建
kubectl apply -f allow-port-from-namespace2.yaml
# 查看
kubectl describe networkpolicy allow-port-from-namespace2 -n my-app
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
    name: allow-port-from-namespace2
    namespace: my-app
spec:
    podSelector:
        matchLabels: {}
policyTypes:
- Ingress
ingress:
- from:
    - namespaceSelector:
        matchLabels:
            kubernetes.io/metadata.name: my-app
  ports:
  - protocol: TCP
    port: 6379

4.6. service四层负载

题目1 .. code-block:: text

题目一:暴露服务service 设置配置环境: [candidate@node-1] $ kubectl config use-context k8s

Task 请重新配置现有的 deployment front-end 以及添加名为 http 的端口规范来公开现有容器 nginx 的端口 80/tcp。 创建一个名为 front-end-svc 的新 service,以公开容器端口 http。 配置此 service,以通过各个 Pod 所在的节点上的 NodePort 来公开他们。

kubectl config use-context k8s
kubectl get deployment front-end -o yaml > front-end.yaml
kubectl explain pod.spec.containers.ports
vim front-end.yaml
containerPort: 80
name: http
protocol: TCP

kubectl create expose deployment front-end --name=front-end-svc --port=80 --target-port=http --type=NodePort  -o yaml --dry-run=client > front-end-svc.yaml
vim front-end-svc.yaml
# 修改select
kubectl apply -f front-end-svc.yaml
kubectl get svc front-end-svc -o wide

4.7. ingress 7层负载

题目

官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/:
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s

Task
如下创建一个新的 nginx Ingress 资源:
名称: ping
Namespace: ing-internal
使用服务端口 5678 在路径 /hello 上公开服务  hello

可以使用以下命令检查服务  hello 的可用性,该命令应返回  hello:
curl -kL <INTERNAL_IP>/hello本次考试遇到问题:curl 请求没有反应;不记得是否有切换环境题目:IP/hi  端口:80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
    name: ping
    namespace: ing-internal
spec:
    ingressClassName: nginx
rules:
- http:
    paths:
    - path: /hello
        pathType: Prefix
        backend:
          service:
            name: hello
            port:
              number: 5678



apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/component: controller
  name: nginx
annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: k8s.io/ingress-nginx

4.8. deploy扩容

题目1

官方文档:https://kubernetes.io/zh-cn/docs/tasks/run-application/scale-stateful-set/
题目1:
将名为loadbalancer的deployment资源的Pod的副本数扩容为6个。
kubectl config use-context k8s
kubectl scale deployment loadbalancer --replicas=6
kubect get pod -o wide -A |grep loadbalancer

题目2:

官方文档:https://kubernetes.io/docs/reference/kubectl/quick-reference/#interacting-with-running-pods        https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#top题目2:
设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s

Task
通过  pod label name=cpu-loader,找到运行时占用大量  CPU 的 pod,
并将占用 CPU 最高的 pod 名称写入文件 /opt/KUTR000401/KUTR00401.txt(已存在)。
kubectl top pod -l name=cpu-loader --sort-by=cpu
echo xxxx > /opt/KUTR000401/KUTR00401.txt
cat /opt/KUTR000401/KUTR00401.txt

4.9. 调度pod到指定节点

题目1

官方文档:将pod分配给节点题目1:调度pod到指定节点
设置配置环境kubectl config use-context k8s

按如下要求创建并调度一个pod:
- 名称:nginx-kusc00401
- image: nginx
- Node selector: disk=ssd
kubectl get node -o wide
kubectl label node node1 disk=ssd

kubectl create pod nginx-kusc00401 --image=nginx  --node-selector=disk=ssd --dry-run=client -o yaml > nginx-kusc00401.yaml
kubectl apply -f nginx-kusc00401.yaml
kubectl get pod -o wide
kubectl describe pod nginx-kusc00401

题目2

题目:创建多容器的pod
设置配置环境kubectl config use-context k8s

创建一个名字为kucc4的pod,在pod里面分别为以下每个images单独运行一个app container
(可能会有1-4 个images):nginx+redis+memcached+consul
kubectl config use-context k8s
kubectl create pod kucc4  --image=nginx  --image=redis --image=memcached --image=consul --dry-run=client -o yaml > kucc4.yaml
kubectl apply -f kucc4.yaml
kubectl get pod -o wide
kubectl describe pod kucc4

题目3

设置配置环境kubectl config use-context k8s

监控pod foo的日志并:
- 提取与错误unable-to-access-website 相对应的日志行
- 将这些日志行写入到/opt/KUTR00101/foo
kubectl logs foo -f |grep unable-to-access-website > /opt/KUTR00101/foo

题目4

设置配置环境kubectl config use-context ek8s

名为wk8s-node-0的kubernetes worker node处于Not Ready状态。检查发生这种情况的原因,并采取相应措施将node 恢复为Ready 状态,确保所做的任何更改永久生效。
可使用以下命令通过ssh 连接到故障node:
ssh wk8s-node-0
可使用一下命令在该node上获取更高权限:
sudo -i
kubectl get node -o wide
ssh wk8s-node-0
sudo -i
# 查看节点状态
systemctl status kubelet
systemctl start kubelet

exit
exit
kubectl get node -o wide
kubectl describe node wk8s-node-0

4.10. 统计Ready状态节点数量

题目

题目:统计Ready状态节点数量
设置配置环境kubectl config use-context k8s

检查有多少个worker nodes 已准备就绪(不包括被打上Taint: NoSchedule 的节点),并将数量写入/opt/KUSC00402/kusc00402.txt。
# 切换环境
kubectl config use-context k8s
# 查看节点状态
kubectl get nodes -o wide | grep Ready | grep -v NoSchedule | wc -l > /opt/KUSC00402/kusc00402.txt
cat /opt/KUSC00402/kusc00402.txt
#

4.11. 按需创建pv和pvc

题目

官方文档:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/

题目1:按要求创建PV
设置配置环境kubectl config use-context k8s
创建名为app-data的persistent volume,容量为1Gi,访问模式为ReadWriteMany。volume,类型为hostPath,位于/srv/app-data。
# 切换环境
kubectl config use-context k8s
kubectl create pv app-data --capacity=1Gi --access-mode=ReadWriteMany --type=hostPath --path=srv/app-data --dry-run=client -o yaml > app-data.yaml
kubectl apply -f app-data.yaml
kubectl get pv app-data -o wide
kubectl describe pv app-data

题目2

设置配置环境kubectl config use-context k8s

创建一个新的PersistentVolumeClaim:
- 名称:pvvolume
- class:csi-hostpath-sc
- 容量:10Mi

创建一个新的pod,此pod 将作为volume挂载到PersistentVolumeClaim:
- 名称:web-server
- image: nginx
- 挂载路径: /usr/share/nginx/html
配置新的pod,以对volume具有ReadWriteOnce 权限。
最后,使用kubectl edit 或者kubectl patch 将PersistentVolumeClaim的容量扩展为70Mi,并记录此次更改。
kubectl create pvc pvvolume --storage-class=csi-hostpath-sc --capacity=10Mi --dry-run=client -o yaml > pvvolume.yaml
kubectl apply -f pvvolume.yaml
kubectl get pvc pvvolume -o wide
kubectl describe pvc pvvolume

kubectl create pod web-server --image=nginx  --volume=pvvolume --mount-path=/usr/share/nginx/html  --access-mode=ReadWriteOnce --dry-run=client -o yaml > web-server.yaml
kubectl apply -f web-server.yaml
kubectl get pod web-server -o wide
kubectl describe pod web-server

kubectl edit pvc pvvolume
kubectl get pvc pvvolume -o wide
kubectl describe pvc pvvolume

kubetl annotate pvc pvvolume  change-log ="edit to 70mi by xx "