目录
1.创建pod
2.创建deployment和service
3.设置节点不可用
4.修改deployment数量为6
5. 添加标签
6.创建多容器
7.deployment版本升级回退
8.创建用户和授权
9.创建NetworkPolicy,
9.1 创建02 NetworkPolicy
10.创建ingress
11.创建一个 pv
12.创建pvc
13.查看日志
14.添加一个名为 busybox
15.查找pod
16.检查集群状态
17.升级版本kubelet 和 kubectl
18.etcd 创建快照,恢复快照
19.统计有污点的节点
1.创建pod
设置配置环境 kubectl config use-context k8s
按如下要求调度一个 pod:
 名称:nginx-kusc00401
image: nginx
Node selector: disk=ssd
kubectl config use-context k8s
kubectl run nginx-kusc00401 --image=nginx --dry-run=client -o yaml > 1.yaml

kubectl apply -f 1.yaml
2.创建deployment和service
设置配置环境 kubectl config use-context k8s
 请重新配置现有的部署 front-end 以及添加名为 http 的端口规范来公开现有容器 nginx 的端 口 80/tcp。
 创建一个名为 front-end-svc 的新服务,以公开容器端口 http。 配置此服务,以通过在排定的节点上的 NodePort 来公开各个 pods。
  
kubectl config use-context k8s
 kubectl get deployments.apps
kubectl edit deployments.apps front-end
# edit编辑时只能使用空格,不要TAB否则保存不了
# 添加如下配置,主要是在 name 为 nginx 的容器下
spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
kubectl expose deploy front-end --name=front-end-svc --port=80 --target-port=http --type=NodePort
3.设置节点不可用
将 k8s-node02 节点设置为不可用,然后重新调度该节点上的所有 Pod然后重新调度该节点上的所有 Pod
kubectl cordon k8s-node02
#腾空节点以准备维护
 kubectl drain k8s-node02 --ignore-daemonsets --delete-emptydir-data --force
4.修改deployment数量为6
kubectl scale deployment hwcka-002 --replicas=6
5. 添加标签
nginx打标签 labels key1=rw01 key2=rw02
kubectl run hwcka-005 --image=nginx --labels key1=rw01,key2=rw02 --dry-run=client -o yaml > 5.yaml
kubectl apply -f 5.yaml
6.创建多容器
创建多容器 nginx redis memcached consul
kubectl run hwcka-006 --image=nginx --dry-run=client -o yaml > 6.yaml
#修改
 vim 6.yaml
apiVersion: v1
 kind: Pod
 metadata:
   creationTimestamp: null
   name: hwcka-006
 spec:
   containers:
   - image: nginx
     name: nginx
   - image: redis
     name: redis
   - image: memcached
     name: memcached
   - image: consul
     name: consul
kubectl apply -f 6.yaml
7.deployment版本升级回退
7.0创建deplpyment版本nginx
 7.1修改镜像1.12.0,并记录这个更新
 7.3回退到上个版本
kubectl create deployment hwcka-007 --image=nginx --dry-run=client -o yaml > 7.yaml
kubectl apply -f 7.yaml
kubectl edit deployments.apps hwcka-007 --record
kubectl rollout history deployment hwcka-007
kubectl rollout undo deployment hwcka-007 --to-revision=1
8.创建用户和授权
创建一个名为 rw-clusterrole 的 clusterrole
 该 clusterrole 只允许创建 Deployment、Daemonset、Statefulset 的 create 操作;
 在名字为 rw 的 namespace 下创建一个名为 cicd-token 的 serviceAccount,
 并且将上一步创建 clusterrole 的权限绑定到该 serviceAccount
 该 clusterrole 只允许创建 Deployment、Daemonset、Statefulset 的 create 操作;
 在名字为 app-team1 的 namespace 下创建一个名为 cicd-token 的 serviceAccount,
 并且将上一步创建 clusterrole 的权限绑定到该 serviceAccount
kubectl create clusterrole rw-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets --dry-run=client -o yaml > 8.yaml
 kubectl apply -f 8.yaml
 kubectl get clusterrole |grep rw-clusterrole
kubectl create ns rw
kubectl -n rw create serviceaccount cicd-token
kubectl -n rw create rolebinding rw-clusterrole-rolebinding --clusterrole=rw-clusterrole --serviceaccount=rw:cicd-token --dry-run=client -o yaml > 8b.yaml
kubectl apply -f 8b.yaml
9.创建NetworkPolicy,
创建一个名字为 rw-port-from-namespace 的 NetworkPolicy,这个 NetworkPolicy 允许 rw命名空间下的 Pod 访问该命名空间下的 9000 端口。
 并且不允许不是 rw 命令空间的下的 Pod 访问不允许访问没有监听 9000 端口的 Pod。
官网参考:网络策略 | Kubernetes
vim 9.yaml
 apiVersion: networking.k8s.io/v1
 kind: NetworkPolicy
 metadata:
   name: rw-port-from-namespace
   namespace: rw
 spec:
   ingress:
     - from:
         - podSelector: {}
       ports:
         - protocol: TCP
           port: 9000
   podSelector: {}
   policyTypes:
   - Ingress
kubectl apply -f 9.yaml
9.1 创建02 NetworkPolicy
在命名空间 fubar 中创建名为 allow-port-from-namespace 新的NetworkPolicy,
确保新的NetworkPolicy允许namespace corp-net中的pods连接namespace fubar中的pods的端口8080
进一步确保新的NetworkPolicy
不允许对没有在监听的端口8080的pods的访问
不允许非来自namespace corp-net中的pods的访问
查看ns标签
 # kubectl get ns corp-net --show-labels
vi networkpolicy.yaml
apiVersion: networking.k8s.io/v1
 kind: NetworkPolicy
 metadata:
   name: allow-port-from-namespace
   namespace: fubar
 spec:
   podSelector: {}
   policyTypes:
   - Ingress
   ingress:
     - from:
         - namespaceSelector:
             matchLabels:
               kubernetes.io/metadata.name: corp-net
# 此处podSelector前不要加 - ,加了则表示furbar 中的pod都可以访问furbar的80端口
           podSelector:
             matchLabels: {}
       ports:
         - protocol: TCP
           port: 8080
# 应用yaml
 # kubectl apply -f networkpolicy.yaml
10.创建ingress
在 ing-internal 命名空间下创建一个 ingress,名字为 pong,代理的 service hi,端口为 5678,
配置路径/hi。
 验证:访问 curl -kL <INTERNAL_IP>/hi 会返回 hi
参考:Ingress | Kubernetes
vim 10.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: /hi
         pathType: Prefix
         backend:
           service:
             name: hi
             port:
               number: 5678
kubectl apply -f 10.yaml
11.创建一个 pv
创建一个 pv,名字为 app-config,大小为 2Gi,访问权限为 ReadWriteMany。
Volume 的类型为hostPath,路径为/srv/app-config
参考:https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
vim 11.yaml
apiVersion: v1
 kind: PersistentVolume
 metadata:
   name: app-config
 spec:
   capacity:
     storage: 2Gi
   volumeMode: Filesystem
   accessModes:
     - ReadWriteMany
   persistentVolumeReclaimPolicy: Recycle
   hostPath:
      path: "/srv/app-config"
kubectl apply -f 11.yaml
kubectl get pv
12.创建pvc
创建一个名字为 pv-volume 的 pvc,指定 storageClass 为 nfs-boge,大小为 10Mi
 然后创建一个 Pod,名字为 web-server,镜像为 nginx,并且挂载该 PVC 至/usr/share/nginx/html,挂
 载的权限为 ReadWriteOnce。之后通过 kubectl edit 或者 kubectl path 将 pvc 改成 70Mi,并且记录修
 改记录。
参考:持久卷 | Kubernetes
vim 12.yaml
 apiVersion: v1
 kind: PersistentVolumeClaim
 metadata:
   name: pv-volume
 spec:
   accessModes:
     - ReadWriteOnce
   resources:
     requests:
       storage: 10Mi
   storageClassName: nfs-boge
kubectl apply -f 12.yaml
kubectl get pvc
 vim 12-pod.yaml
 apiVersion: v1
 kind: Pod
 metadata:
   name: web-server
 spec:
   containers:
     - name: nginx
       image: nginx
       volumeMounts:
       - mountPath: "/usr/share/nginx/html"
         name: mypd
   volumes:
     - name: mypd
       persistentVolumeClaim:
         claimName: pv-volume
kubectl apply -f 12-pod.yaml
kubectl edit pvc pv-volume --record
13.查看日志
监控名为 foobar 的 Pod 的日志,并过滤出具有 unable-access-website 信息的行,然后将写入到/opt/KUTR00101/foobar
kubectl logs foobar |grep unable-access-website > /opt/KUTR00101/foobar
14.添加一个名为 busybox
且镜像为 busybox 的 sidecar 到一个已经存在的名为 legacy-app 的 Pod
 上,这个 sidecar 的启动命令为/bin/sh, -c, 'tail -n+1 -f /var/log/legacy-app.log'。
 并且这个 sidecar 和原有的镜像挂载一个名为 logs 的 volume,挂载的目录为/var/log/
日志架构 | Kubernetes
#提取yaml
kubectl get pod legacy-app -o yaml > 14.yaml

kubectl delete pod legacy-app
kubectl apply -f 14.yaml
kubectl get pod legacy-app
15.查找pod
找出具有 name=cpu-user 的 Pod,并过滤出使用 CPU 最高的 Pod,然后把它的名字写在已经存在的/opt/KUTR00401/KUTR00401.txt 文件里
(注意他没有说指定 namespace。所以需要使用-A 指定所以 namespace)
kubectl top po -A -l app=cpu-user --sort-by='cpu'
echo "kuboard-v3-658bfff6c5-f6m2n " > /opt/KUTR00401/KUTR00401.txt
16.检查集群状态
一个名为 wk8s-node-0 的节点状态为 NotReady,让其他恢复至正常状态,并确认所有的更改开机
 自动完成
ssh wk8s-node-0
systemctl restart kubelet.service
systemctl enable kubelet.service
17.升级版本kubelet 和 kubectl
现有的 Kubernetes 集权正在运行的版本是 1.24.4,仅将主节点上的所有 kubernetes 控制面板和
 组件升级到版本 1.25.0 另外,在主节点上升级 kubelet 和 kubectl
参考:升级 kubeadm 集群 | Kubernetes
kubectl cordon k8s-mast
 kubectl drain k8s-mast --ignore-daemonsets --delete-emptydir-data --force
apt update
 apt-cache madison kubeadm
apt-mark unhold kubeadm
apt-get update
 apt-get install -y kubeadm=1.25.0-00
 apt-mark hold kubeadm
sudo kubeadm upgrade apply v1.25.0 --etcd-upgrade=false
apt-mark unhold kubelet kubectl
apt-get update
 apt-get install -y kubelet=1.25.0-00 kubectl=1.25.0-00
apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
 sudo systemctl restart kubelet
18.etcd 创建快照,恢复快照
针对 etcd 实例 https://127.0.0.1:2379 创建一个快照,
 保存到/data/rwbak/etcd-snapshot-previous-20220908-1.db
 在创建快照的过程中,如果卡住了,就键入 ctrl+c 终止,然后重试。
 然后恢复一个已经存在的快照: /data/rwbak/etcd-snapshot-previous-20220908-2.db
 执行 etcdctl 命令的证书存放在:
 ca 证书:/etc/kubernetes/pki/etcd/ca.crt
 客户端证书:/etc/kubernetes/pki/etcd/server.crt
 客户端密钥:/etc/kubernetes/pki/etcd/server.key
参考:为 Kubernetes 运行 etcd 集群 | Kubernetes
#备份
 sudo ETCDCTL_API=3 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 /data/rwbak/etcd-snapshot-previous-20220908-1.db
sudo mv /etc/kubernetes/manifests /etc/kubernetes/manifests.bak
sudo mv /var/lib/etcd /var/lib/etcd.bak
#恢复
 sudo ETCDCTL_API=3 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 restore /data/rwbak/etcd-snapshot-previous-20220908-2.db --data-dir=/var/lib/etcd
sudo mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests
19.统计有污点的节点
#偷懒写法
kubectl describe nodes |grep -i taint
#有NoSchedule 就是有污点的

#写全的写法
kubectl describe node | grep Taint | grep NoSchedule









