k8s资源例题

发布时间 2023-03-29 22:17:08作者: 这是个佚名

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