本文由吴某人 吴某人の博客 发布!
本文由吴某人 吴某人の博客 发布!

<p>本次测试的所有问题都必须在指定的cluster配置环境中完成。为尽量减少切换,系统已对问题进行分组,同一cluster内的所有问题将连续显示。</p>
<img src="https://s2.loli.net/2022/02/17/ecP2IraJRGdDUKz.png" alt="file" />
<h2>开启TAB补全</h2>
<p>做题前先配置k8s自动补齐功能,否则无法TAB补全命令:</p>
<ol>
<li>登陆管理节点</li>
<li>kubectl --help | grep bash,此步是为了找关键词completion
<img src="https://s2.loli.net/2022/02/17/SokKF3NZmrta9QO.png" alt="file" /></li>
<li>sudo vim /etc/profile</li>
<li>添加source <(kubectl completion bash)
<img src="https://s2.loli.net/2022/02/17/KOgmhyZtC1o2T4P.png" alt="file" />
5.保存退出,source /etc/profile</li>
</ol>
<h2>1.4% k8s</h2>
<pre>- 设置配置环境 kubectl config use-context k8s
Context

  • 为部署管道创建一个新的 ClusterRole 并将其绑定到范围为特定 namespace 的特定 ServiceAccount</pre>
    <ul>
    <li>创建一个名字为 deployment-clusterrole 且仅允许创建以下资源类型的新ClusterRole:
    <ul>
    <li>Deployment</li>
    <li>StatefulSet</li>
    <li>DaemonSet </li>
    </ul></li>
    <li>在现有的 namespace app-team1 中创建有个名为 cicd-token 的新 ServiceAccount。 </li>
    <li>限 于 namespace app-team1 , 将 新 的 ClusterRole deployment-clusterrole 绑 定 到 新 的 ServiceAccount cicd-token。 </li>
    </ul>
    <h3>解答:</h3>
    <pre>1.kubectl create clusterrole deployment-clusterrole --verb=create --resource=Deployment,StatefulSet,DaemonSet
    2.kubectl create serviceaccount cicd-token -n app-team1
    3.kubectl create rolebinding xxx(随便起名字) --clusterrole=deployment-clusterrole --serviceaccount=cicd-token:app-team1 -n app-team1
    </pre>
    <h2>2.4% ek8s</h2>
    <pre>- 设置配置环境 kubectl config use-context ek8s
  • 将名为 ek8s-node-0 (vms25)的 node 设置为不可用,并重新调度该 node 上所有运行的 pods </pre>
    <h3>解答:</h3>
    kubectl drain vms25.rhce.cc --ignore-daemonsets
    <img src="https://s2.loli.net/2022/02/17/Ehn6KwV7oDc4Sbs.png" alt="file" />
    <h2>3.7% mk8s</h2>
    <pre>- 设置配置环境 kubectl config use-context mk8s
  • 现有的 kubernetes 集群正在运行的版本是 1.21.0。仅将主节点上的所有 kubernetes 控制平面 和节点组件升级到版本 1.21.1。
  • 另外,在主节点上升级 kubelet 和 kubectl。
    [start-plane type="4"]确保在升级前 drain 主节点,并在升级后 uncordon 主节点。请不要升级工作节点,etcd,container管理器,CNI 插件,DNS服务或任何其他插件。[/start-plane]--etcd-upgrade=false
    kubeadm upgrade apply 1.21.1 --etcd-upgrade=false
    </pre>
    <h3>解答:</h3>
    1.登陆官网k8s.io,可以右上角更换语言,点击Learn Kubernetes Basics
    2.搜索upgrade
    <img src="https://s2.loli.net/2022/02/17/RtyJhlKGDdg6UqN.png" alt="file" />

    3.开始升级,步骤官方文档中都有步骤,步骤如下:
    <pre>kubectl config use-context mk8s
    kubectl get nodes
    ssh vms28(28为mk8s的控制平面节点)
    sudo su - (需用root用户执行下方命令)
    </pre>
    apt-get update && \ apt-get install -y --allow-change-held-packages kubeadm=1.21.1-00 (安装kubeadm包)
    <pre>kubeadm upgrade apply v1.21.1 –etcd-upgrade=false(题中提示etcd不被升级,所以加后面的参数)
    kubectl drain vms28.rhce.cc --ignore-daemonsets (升级kubelet和kubectl前腾空节点,官方文档中流程都有,看着修改就好)
    </pre>
    apt-get update && \ apt-get install -y --allow-change-held-packages kubelet=1.21.1-00 kubectl=1.21.1-00(安装kubelet和kubectl包)
    <pre>systemctl daemon-reload
    systemctl restart kubelet
    kubectl uncordon vms28.rhce.cc
    </pre>
    <h2>4.7%</h2>
    <ul>
    <li>此项目无需更改配置环境</li>
    <li>首 先 为 运 行 在 https://127.0.0.1:2379 上 的 现 有 etcd 实 例 创 建 快 照 并 将 快 照 保 存 到 /srv/data/etcd-snapshot.db。</li>
    <li>为给定实例创建快照预计能在几秒钟内完成。如果该操作似乎挂起,则命令可能有问题。用 ctrl+c 来取消操作,然后重试。</li>
    <li>然后还原位于/srv/data/etcd-snapshot-previous.db 的现有先前快照.</li>
    </ul>
    提供了一下 TLS 证书和密钥,以通过 etcdctl 连接到服务器。 CA 证书:/opt/KUIN00601/ca.crt 客户端证书: /opt/KUIN00601/etcd-client.crt 客户端密钥:/opt/KUIN00601/etcd-client.key
    <h3>解答:</h3>
    <h4>使用root账户操作</h4>
    etcdctl –help 查看是否有snapshot命令,有是版本3无为版本2
    <h4>若是2.则手动导入3</h4>
    export ETCDCTL_API=3
    不知道命令怎么写可以etcdctl snapshot save --help
    主要三个参数为:-–cacert,--cert,--key,--endpoints
    <h4>1.保存etcd实例快照:</h4>
    考试环境:
    <pre>#etcdctl snapshot save -–cacert=”/opt/KUIN00601/ca.crt” --cert=” /opt/KUIN00601/etcd-client.crt” --key=”/opt/KUIN00601/etcd-client.key” --endpoints="https://127.0.0.1:2379"; -- /srv/data/etcd-snapshot.db</pre>
    练习环境:
    <pre>#etcdctl snapshot save --endpoints="https://127.0.0.1:2379"; /srv/data/etcd-snapshot.db</pre>
    <h4>2.还原快照</h4>
    考试环境:
    <pre>#etcdctl snapshot restore –cacert=”/opt/KUIN00601/ca.crt” --cert=” /opt/KUIN00601/etcd-client.crt” --key=”/opt/KUIN00601/etcd-client.key” /srv/data/etcd-snapshot.db</pre>
    练习环境:
    <pre>#etcdctl snapshot restore /srv/data/etcd-snapshot.db</pre>
    <h2>5.7% k8s</h2>
    <ul>
    <li>设置配置环境 kubectl config use-context k8s
    <ul>
    <li>在 internal 命名空间创建一个名为 allow-port-from-namespace 的确保新的 NetworkPolicy 允 许 namespace internal 中的 Pods 来连接到 namespace big-corp 中的端口 9200。 </li>
    <li>确保新的 NetworkPolicy:</li>
    <li>不允许对没有在监听端口 9200 的 pods 访问</li>
    <li>不允许不来自 namespace internal 的 pods 的访问</li>
    </ul></li>
    </ul>
    <h3>解答:</h3>
    1.先创建题中的命名空间(Namespace)
    <pre>kubectl configuse-context k8s
    kubectl get namespace
    kubectl create namespace internal
    kubectl create namespace big-corp
    kubectl label namespace big-corp name=big-corp
    </pre>
    2.打开官网,搜索ingress或egress或networkpolicy,然后第一个网络策略
    <img src="https://s2.loli.net/2022/02/17/AIL8mTv5fEOYZKz.png" alt="file" />
    <img src="https://s2.loli.net/2022/02/17/cE4WFh3qJL7oQnD.png" alt="file" />
    3.复制上方yaml代码,新建yaml文件,例如networkpolicy.yaml,名字随意起
    4.将复制的代码按照题意改为下图所示:
    <img src="https://s2.loli.net/2022/02/17/eub7g963qHIFJvL.png" alt="file" />
    <pre>kubectl apply -f networkpolicy.yaml
    kubectl get networkpolicies.networking.k8s.io -n internal
    </pre>
    <img src="https://s2.loli.net/2022/02/17/3LiAzDSYZPjbcOU.png" alt="file" />
    <h2>6.7% k8s√</h2>
    <ul>
    <li>设置配置环境 kubectl config use-context k8s </li>
    <li>请重新配置现有的部署 front-end 以及添加名为 http 的端口规范来公开现有容器 nginx 的端 口 80/tcp。 </li>
    <li>创建一个名为 front-end-svc 的新服务,以公开容器端口 http。 配置此服务,以通过在排定的节点上的 NodePort 来公开各个 pods。</li>
    </ul>
    <h3>解答:</h3>
    <pre>kubectl config use-context k8s
    kubectl get deployments.apps
    kubectl edit deployments.apps front-end (edit编辑时只能使用空格,不要TAB否则保存不了)
    </pre>
    <img src="https://s2.loli.net/2022/02/18/4Xlqp7GiE1NwtyB.png" alt="file" />
    <pre>ports:
  • name: http
    containePort: 80
    protocol: TCP

创建front-end-svc服务:
kubectl expose –-name=front-end-svc deployment front-end -–port=80 –-target-port=80 –-type=NodePort
</pre>
<h2>7.7% k8s√</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s</li>
<li>如下创建一个新的 nginx ingress 资源: </li>
<li>名称:pong </li>
<li>namespace: ing-internal </li>
<li>使用服务端口 5678 在路径/hello 上公开服务 hello </li>
<li>可以使用一下命令检查服务 hello 的可用性,该命令返回 hello: curl -kL < INTERNAL_IP>/hello/</li>
</ul>
<h3>解答:</h3>
<pre>1.kubectl config use-context k8s
2.打开官方文档,搜索ingress,选择第一个结果即可,进入后复制yaml模板并新建一个yaml文件
3.vim ingress.yaml
</pre>
<img src="https://ae05.alicdn.com/kf/Hf18fccf94ea54a3bad6b9f8612aa5bf7G.png" alt="file" />
<pre>4.kubectl apply -f 7-ing.yaml
5.kubectl get ing -n ing-internal
</pre>
<h2>8.4% k8s√</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s</li>
<li>将 deployment 从 webserver 扩展至 6pods</li>
</ul>
<h3>解答:</h3>
<pre>kubectl config use-context k8s
kubectl get deploy
kubectl scale deployment webserver –-replicas=6
kubectl get deploy
</pre>
<h2>9.4% k8s√</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s </li>
<li>按如下要求调度一个 pod:</li>
<li>名称:nginx-kusc00401 </li>
<li>image: nginx </li>
<li>Node selector: disk=ssd</li>
</ul>
<h3>解答:</h3>
<pre>kubectl run nginx-kusc00401 --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yaml > 9-pod.yaml
加入如下标红代码
</pre>
<img src="https://s2.loli.net/2022/02/18/chTHrLpswCZAQV9.png" alt="file" />
<pre>kubectl apply -f 9-pod.yaml
kubectl get pods
</pre>
<h2>10.4% k8s√</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s</li>
<li>检查有多少个 worker nodes 已准备就绪(不包括被打上 Taint: NoSchedule 的节点),并将数 量写入/opt/KUSC00402/kusc00402.txt</li>
</ul>
<h3>解答:</h3>
<pre>Kubectl get nodes
查看节点是否有污点
kubectl describe nodes vms22.rhce.cc | grep Taint
kubectl describe nodes vms23.rhce.cc | grep Taint
echo 1 > /opt/KUSC00402/kusc00402.txt
</pre>
<img src="https://s2.loli.net/2022/02/18/UsQowTXqFLBbktD.png" alt="file" />
<h2>11.4% k8s√</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s </li>
<li>创建一个名字为kucc4的pod,在pod里面分别为以下每个images单独运行一个app container (可能会有 1-4 个 images):</li>
<li>nginx+redis+memcached+consul</li>
</ul>
<h3>解答:</h3>
<pre>kubectl run kucc4 1–image=nginx –1image-pull-policy=IfNotPresent –1dry-run=client -o yaml > 11-pod.yaml
vim 11-pod.yaml(将图中标红项复制3次并修改pod名字即可)
</pre>
<img src="https://s2.loli.net/2022/02/18/oH9CVEuO1h6gtZm.png" alt="file" />
<pre>kubectl apply -f 11-pod.yaml
kubectl get pod
</pre>
<h2>12.4% k8s√</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s </li>
<li>创建名为 app-data 的 persistent volume,容量为 1Gi,访问模式为 ReadWriteMany。volume 类型为 hostPath,位于/srv/app-data</li>
</ul>
<h3>解答:</h3>
1.官方文档中搜索persistent volume,第一个案例即可
<img src="https://s2.loli.net/2022/02/18/C3oAlTf9vgiXc5U.png" alt="file" />
2.vim 12-pv.yaml,按照题意修改
<img src="https://s2.loli.net/2022/02/18/Kh2Pg35SZlJNpaC.png" alt="file" />
3.kubectl apply -f 12-pv.yaml
4.kubectl get pv
<h2>13.7% k8s√</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s</li>
<li>创建一个新的 PersistentVolumeClaim:
<ul>
<li>名称:pvvolume </li>
<li>class:csi-hostpath-sc</li>
<li>容量:10Mi</li>
</ul></li>
<li>创建一个新的 pod,此 pod 将作为 volume 挂载到PersistentVolumeClaim:
<ul>
<li>名称:web-server </li>
<li>image: nginx </li>
<li>挂载路径: /usr/share/nginx/html </li>
<li>配置新的 pod,以对 volume 具有 ReadWriteOnce 权限。 </li>
<li>最后,使用 kubectl edit 或者 kubectl patch 将 PersistentVolumeClaim 的容量扩展为 70Mi,并 记录此次更改。</li>
</ul></li>
</ul>
<h3>解答:</h3>
kubectl config use-context k8s
继续在上题中的官方文档中找到下方案例:
<img src="https://s2.loli.net/2022/02/18/fQNVU2iEuAIwMgO.png" alt="file" />
<h5>vim 13-pvc.yaml,讲案例复制,注意更改标红项,其他项删除(此步目的:创建新的 PersistentVolumeClaim)</h5>
<img src="https://s2.loli.net/2022/02/18/ZFaf4vGr1QN7o5L.png" alt="file" />
kubectl apply -f 13-pvc.yaml
继续在上题的官方文档中下滑找到下方案例:
<img src="https://s2.loli.net/2022/02/18/NOPu3XYefUvSD8z.png" alt="file" />
<h5>vim 13-pvc-pod.yaml,将案例复制(此步目的:创建一个新的 pod,此 pod并挂载到PersistentVolumeClaim)</h5>
<img src="https://s2.loli.net/2022/02/18/QTiKyeprAfu41na.png" alt="file" />
kubectl apply -f 13-pvc-pod.yaml
<img src="https://s2.loli.net/2022/02/18/XCK97M1rYeGDLTx.png" alt="file" />
<h5>kubectl edit pvc pvvolume –-record,将10Mi改为70Mi(--record目的为记录此次更改,不加--record的话第三小题没有分数)</h5>
<img src="https://s2.loli.net/2022/02/18/ZNHDVgbmF4fScKW.png" alt="file" />
<h2>14.5% k8s √</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s </li>
<li>监控 pod foo 的日志并:
<ul>
<li>提取与错误 unable-to-access-website 相对应的日志行 </li>
<li>将这些日志行写入到/opt/KUTR00101/foo</li>
</ul></li>
</ul>
<h3>解答:</h3>
<pre>$ kubectl config use-context k8s
$ kubectl logs foo | grpe unable-to-access-website > /opt/KUTR00101/foo
</pre>
<h2>15.7% k8s</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s
<ul>
<li>在不更改其现有容器的情况下,需要将一个现有的 pod 集成到 kubernetes 的内置日志记录 体系结构中(例如 kubectl logs)。添加 streamimg sidecar 容器是实现此要求的一种好方法。 </li>
<li>将一个 busybox sidecar 容器添加到现有的 pod legacy-app。新的 sidecar 容器必须运行一下命令:
/bin/sh -c tail -n+1 -f /var/log/legacy-app.log </li>
<li>使用名为 logs 的 volume mount 来让文件/var/log/legacy-app.log 可用于 sidecar 容器。
不要更改现有容器。不要修改日志文件的路径,两个容器必须通过/var/log/legacy-app.log 来访问该文件</li>
</ul></li>
</ul>
<h3>解答:</h3>
kubectl config use-context k8s
kubectl get pod legacy-app -o yaml > 15-pod.yaml
vim 15-pod.yaml
1.添加pod及vomuleMount挂载点
<img src="https://s2.loli.net/2022/02/18/jW4G1a65ZqtNz3B.png" alt="file" />
2.添加volumes
<img src="https://s2.loli.net/2022/02/18/CyXHYi2WrUGcNJB.png" alt="file" />
3.修改挂载目录及名称
<img src="https://s2.loli.net/2022/02/18/7wIxAoKgSQV4iqC.png" alt="file" />
4.kubectl apply -f 15-pod.yaml
5.删除legacy-app,否则再运行yaml时会提示legacy-app已存在
kubectl delete pod legacy-app -–force
<img src="https://s2.loli.net/2022/02/18/PfDqCSJ1syaYIp5.png" alt="file" />
<h2>16.5% k8s√</h2>
<ul>
<li>设置配置环境 kubectl config use-context k8s </li>
<li>通过 pod label name=cpu-user,找到运行时占用大量 CPU 的 pod,并将占用 CPU 最高的 pod 名称写入到文件/opt/KUTR000401/KUTR00401.txt(已存在)</li>
</ul>
<h3>解答:</h3>
kubectl top pods -l name=cpu-user
echo "占比最高的机器名" > /opt/KUTR000401/KUTR00401.txt
<h2>17.13% ek8s</h2>
<ul>
<li>设置配置环境 kubectl config use-context ek8s </li>
<li>名为wk8s-node-0(练习环境使用 vms26.rhce.cc)的 kubernetes worker node 处于 Not Ready状态。调查发生这种情况的原因,并采取相应措施将 node 恢复为Ready状态,确保所做的任何更改永久生效。</li>
<li>可使用以下命令通过ssh连接到故障node:
<ul>
<li>ssh wk8s-node-0 (vms26.rhce.cc) </li>
</ul></li>
<li>可使用以下命令在该node上获取更高权限:
<ul>
<li>sudo -i</li>
</ul></li>
</ul>
<h3>解答:</h3>
<pre>kubectl get nodes
ssh vms26.rhce.cc
sudo -i
systemctl start kubelet ; systemctl enable kubectl
Exit退出
$kubectl get nodes
</pre>


诺言
1 声望0 粉丝

记录生产环境中的大事小情。