k8s资源例题
k8s资源例题
1.基于角色的访问控制-RBAC
创建一个名为 deployment-clusterrole 的 clusterrole,该 clusterrole 只允许对 Deployment、Daemonset、Statefulset 具有 create 权限,在现有的 namespace app-team1 中创建一个名为 cicd-token 的新 ServiceAccount。 限于 namespace app-team1 中,将新的 ClusterRole deployment-clusterrole 绑定到新的 ServiceAccount cicd-token。(若未指定限于namespace,则使用clusterrolebinding)
[root@k8s-master-node1 ~]# kubectl create ns app-team1
[root@k8s-master-node1 ~]# kubectl create clusterrole deployment-clusterrole --verb=create --resource=Deployment,Daemonset,Statefulset
[root@k8s-master-node1 ~]# kubectl create sa cicd-token -n app-team1
[root@k8s-master-node1 ~]# kubectl create rolebinding rb-cicd-token --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -n app-team1
[root@k8s-master-node1 ~]# kubectl describe rolebinding -n app-team1 rb-cicd-token
Name: rb-cicd-token
Labels: <none>
Annotations: <none>
Role:
Kind: ClusterRole
Name: deployment-clusterrole
Subjects:
Kind Name Namespace
---- ---- ---------
ServiceAccount cicd-token app-team1
2.节点维护-指定 node 节点不可用
将node-1节点设置为不可用,然后重新调度该节点上的所有pod
[root@k8s-master-node1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master-node1 Ready control-plane,master,worker 25h v1.22.1
k8s-worker-node1 Ready worker 25h v1.22.1
[root@k8s-master-node1 ~]# kubectl drain k8s-worker-node1 --delete-emptydir-data --ignore-daemonsets --force
[root@k8s-master-node1 ~]# kubectl uncordon k8s-worker-node1 #重新添加节点为可调度
3.K8s 版本升级(如何离线主机,并升级控制面板和升级节点)
现有的 Kubernetes 集群正在运行版本 1.23.1。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.23.2。
# 将节点标记为不可调度并驱逐所有负载,准备节点的维护:
root@cka-master1:~# kubectl cordon cka-master1
root@cka-master1:~# kubectl drain cka-master1 --delete-emptydir-data --ignore-daemonsets --force
# 升级控制平面节点
# 升级 kubeadm
root@cka-master1:~# apt-get update
# 找到题目要求升级到的指定版本
root@cka-master1:~# apt-cache madison kubeadm | grep 1.23.2
kubeadm | 1.23.2-00 | http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages
root@cka-master1:~# apt-get install kubeadm=1.23.2-00
# 验证下载操作正常,并且 kubeadm 版本正确:
root@cka-master1:~# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.2", GitCommit:"9d142434e3af351a628bffee3939e64c681afa4d", GitTreeState:"clean", BuildDate:"2022-01-19T17:34:34Z", GoVersion:"go1.17.5", Compiler:"gc", Platform:"linux/amd64"}
# 验证升级计划:此命令检查你的集群是否可被升级,并取回你要升级的目标版本。 命令也会显示一个包含组件配置版本状态的表格。
root@cka-master1:~# kubeadm upgrade plan
# 排除 etcd,升级其他的
root@cka-master1:~# kubeadm upgrade apply v1.23.2 --etcd-upgrade=false
# 升级 kubelet 和 kubectl
root@cka-master1:~# apt-get install kubelet=1.23.2-00 kubectl=1.23.2-00
4.ETCD 数据备份恢复
将etcd数据库备份到root目录下为etcd.db,并将root目录下的etcd-snapshot-previous.db恢复
[root@k8s-master-node1 ~]# etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /root/etcd.db
[root@k8s-master-node1 ~]# etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key restore /root/etcd-snapshot-previous.db
5.网络策略 NetworkPolicy
在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。确保新的 NetworkPolicy 允许 namespace echo 中的 Pods 连接到 namespace my-app 中的Pods 的 9000 端口。
进一步确保新的NetworkPolicy:
- 不允许对没有在监听端口 9000 的 Pods 的访问
- 不允许非来自 namespace echo 中的 Pods 的访问
[root@k8s-master-node1 ~]# kubectl create ns my-app
namespace/my-app created
[root@k8s-master-node1 ~]# kubectl create ns echo
namespace/echo created
[root@k8s-master-node1 ~]# kubectl label ns echo ns=echo #该标签为独特的标签
namespace/echo labeled
[root@k8s-master-node1 ~]# vi networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: my-app #被访问的命名空间
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
ns: echo #访问者命令空间的标签
ports:
- protocol: TCP
port: 9000
[root@k8s-master-node1 ~]# kubectl apply -f networkpolicy.yaml
networkpolicy.networking.k8s.io/allow-port-from-namespace created
6.七层代理 ingress
如下创建一个新的 nginx lngress资源:
- 名称:pong
- Namespace:ing-internal
- 使用服务端口 5678 在路径 /hello 上公开服务 hello
[root@k8s-master-node1 ~]# vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: test
port:
number: 5678
7.Deployment 管理 Pod 扩缩容
将 loadbalancer 的 deployment 管理的 Pod 的副本数扩容成 6 个
# 扩容 deployment 副本数
[root@k8s-master-node1 ~]# kubectl scale deployment loadbalancer --replicas=6
8.Sidecar 代理
使用 busybox lmage 来将名为 sidecar 的 sidecar 容器添加到现有的 Pod legacy-app 上,新的 sidecar 容器必须运行以下命令: /bin/sh -c tail -n+1 -f /var/log/legacy-app.log,使用 volume 挂载 /var/log/ 目录,确保 sidecar 能访问 /var/log/legacy-app.log 文件。
# 首先将题目中现有的 pod legacy-app 的 yaml 导出
root@cka-master1:~# kubectl get pods legacy-app -o yaml > sidecar.yaml
# 删除一些导出的内容,结果如下
root@cka-master1:~# vim sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
namespace: default
spec:
containers:
- args:
- /bin/sh
- -c
- "i=0; while true; do\n echo \"$(date) INFO $i\" >> /var/log/legacy-app.log;\n
\ i=$((i+1));\n sleep 1;\ndone \n"
image: busybox
imagePullPolicy: Always
name: count
# 在 sidecar.yaml 中添加 sidecar 容器和 volume
root@cka-master1:~# vim sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
namespace: default
spec:
containers:
- args:
- /bin/sh
- -c
- "i=0; while true; do\n echo \"$(date) INFO $i\" >> /var/log/legacy-app.log;\n
\ i=$((i+1));\n sleep 1;\ndone \n"
image: busybox
imagePullPolicy: IfNotPresent
name: count
volumeMounts:
- name: logs
mountPath: /var/log
- name: sidecar
image: busybox
imagePullPolicy: IfNotPresent
args: [/bin/sh, -c, 'tail -n+1 -f /var/log/legacy-app.log']
volumeMounts:
- name: logs
mountPath: /var/log
volumes:
- name: logs
emptyDir: {}
# 先删除原有的 pod 才能更新
root@cka-master1:~# kubectl delete -f sidecar.yaml
# 如果删除很慢的话,就强制删除
root@cka-master1:~# kubectl delete -f sidecar.yaml --force --grace-period=0
root@cka-master1:~# kubectl apply -f sidecar.yaml
pod/legacy-app created
root@cka-master1:~# kubectl get pods legacy-app
NAME READY STATUS RESTARTS AGE
legacy-app 2/2 Running 0 3s
# 查看 sidecar 容器日志
root@cka-master1:~# kubectl logs legacy-app -c sidecar
9.查看 Pod 的 cpu
找出标签是 app=gitlab 的 Pod,并过滤出使用 CPU 最高的 Pod
[root@k8s-master-node1 ~]# kubectl top pods -l app=gitlab --sort-by=cpu -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
devops gitlab-54b6f68589-p75j6 206m 5441Mi
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· .NET Core 中如何实现缓存的预热?
· 三行代码完成国际化适配,妙~啊~
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?