目录
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.统计有污点的节点
设置配置环境 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
设置配置环境 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
将 k8s-node02 节点设置为不可用,然后重新调度该节点上的所有 Pod然后重新调度该节点上的所有 Pod
kubectl cordon k8s-node02
#腾空节点以准备维护
kubectl drain k8s-node02 --ignore-daemonsets --delete-emptydir-data --force
kubectl scale deployment hwcka-002 --replicas=6
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
创建多容器 nginx redis memcached consul
kubectl run hwcka-006 --image=nginx --dry-run=client -o yaml > 6.yaml
#修改
vim 6.yamlapiVersion: 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: consulkubectl apply -f 6.yaml
7.0创建deplpyment版本nginx
7.1修改镜像1.12.0,并记录这个更新
7.3回退到上个版本
kubectl create deployment hwcka-007 --image=nginx --dry-run=client -o yaml > 7.yamlkubectl 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
创建一个名为 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-clusterrolekubectl 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
创建一个名字为 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:
- Ingresskubectl apply -f 9.yaml
在命名空间 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-labelsvi 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
在 ing-internal 命名空间下创建一个 ingress,名字为 pong,代理的 service hi,端口为 5678,
配置路径/hi。
验证:访问 curl -kL
参考: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: 5678kubectl apply -f 10.yaml
创建一个 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.yamlkubectl get pv
创建一个名字为 pv-volume 的 pvc,指定 storageClass 为 csi-hostpath-sc,大小为 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-bogekubectl 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-volumekubectl apply -f 12-pod.yaml
kubectl edit pvc pv-volume --record
监控名为 foobar 的 Pod 的日志,并过滤出具有 unable-access-website 信息的行,然后将写入到/opt/KUTR00101/foobar
kubectl logs foobar |grep unable-access-website > /opt/KUTR00101/foobar
且镜像为 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
找出具有 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
一个名为 wk8s-node-0 的节点状态为 NotReady,让其他恢复至正常状态,并确认所有的更改开机
自动完成
ssh wk8s-node-0
systemctl restart kubelet.service
systemctl enable kubelet.service
现有的 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 --forceapt update
apt-cache madison kubeadmapt-mark unhold kubeadm
apt-get update
apt-get install -y kubeadm=1.25.0-00
apt-mark hold kubeadmsudo 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-00apt-mark hold kubelet kubectl
sudo systemctl daemon-reload
sudo systemctl restart kubelet
针对 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.dbsudo 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/etcdsudo mv /etc/kubernetes/manifests.bak /etc/kubernetes/manifests
kubectl describe nodes |grep -i taint