实验环境及架构大致如图所示:
我的实验环境
练习参考文档:
https://kubernetes.io/docs/home/
习题部分
1.题目大意:使用name排序出所有的pv,把输出内容存储到/opt/result.txt中,使用 kubectl own 对输出进行排序,并且不再进一步操作它。
解析如下:
kubectl get pv -A --sort-by=.metadata.name > /opt/result.txt
2.题目大意:监控kube-system空间下,etcd pod的日志,提取pod相应的行 ‘error’ 写入到 /logs/etcd_error.txt 中。
解析如下:
kubectl logs etcd-ip-10-0-1-211 -n kube-system | grep error -i > /logs/etcd_error.txt
3.创建一个名为kucc的pod,其中内部运行着nginx+redis+memcached+consul这4个容器。
解析如下:
apiVersion: v1
kind: Pod
metadata:
name: kucc
spec:
containers:
- name: nginx
image: nginx
- name: redis
image: redis
- name: memcached
image: mencached
- name: consul
image: consul
4.确保在kubectl集群的每个节点上运行一个Nginx Pod。其中Nginx Pod 必须使用Nginx镜像。不要覆盖当前环境中的任何traints。使用Daemonset来完成这个任务,Daemonset的名字使用ds。
解析如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: nginx
5.确保在kubectl集群的每个节点上运行一个Nginx Pod。其中Nginx Pod必须使用Nginx镜像。不要覆盖当前环境中的任何traints。使用Daemonset来完成这个任务,Daemonset的名字使用ds。
解析如下: 这里把tolerations部分注释掉了,因为题目中写的是不要覆盖当前环境中任何taints(不接受污点),意思就是说不要在master上去调度启动,反之(接受污点),也就是说要在master节点上调度启动,那就需要把注释的内容放开。因为我的环境上,默认master节点是有污点,不允许调度的,默认都是启动在k8snode1和k8snode2上
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ds
namespace: raytest
spec:
selector:
matchLabels:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
#tolerations:
#- key: node-role.kubernetes.io/master
# operator: Exists
# effect: NoSchedule
containers:
- name: nginx
image: nginx
6.添加一个initcontainer到lum(/etc/data)这个initcontainer应该创建一个名为 /workdir/calm.txt 的空文件,如果 /workdir/calm.txt 没有被检测到,这个Pod应该退出。
apiVersion: v1
kind: Pod
metadata:
name: initcon
spec:
volumes:
- name: workdir
hostPath:
path: /etc/data
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /workdir
name: workdir
initContainers:
- name: init-nginx
image: busybox
command: ['sh', '-c', 'touch /workdir/calm.txt']
volumeMounts:
- mountPath: /workdir
name: workdir
7.创建deployment名字为nginx-app容器采用1.11.9版本的nginx,这个deployment包含3个副本,接下来通过滚动升级的方式更新镜像版本为1.12.0,并记录这个更新,最后,回滚这个更新到之前的1.11.9版本。
nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.11.9
执行命令,更改镜像版本为1.12.0
kubectl set image deployment/nginx-app nginx=nginx:1.12.0 --record
查询更新状态
kubectl rollout status deployment.v1.apps/nginx-app
查看更新历史
kubectl rollout history deployment.v1.apps/nginx-app
回滚版本
kubectl rollout undo deployment.v1.apps/nginx-app
可以再次调用查看命令验证nginx版本是否回滚为1.11.9
8.创建和配置service,名字为front-end-service。可以通过NodePort/ClusterIp来访问,并且路由到front-end的pod上
先创建一个pod:
front-end.yaml
apiVersion: v1
kind: Pod
metadata:
name: front-end
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx:1.11.9
kubectl apply -f front-end.yaml
第一种方式:
kubectl expose pod front-end --name=front-end-service --port=80 --type=NodePort
第二种方式:
front-end-service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: my-nginx
ports:
- port: 80
targetPort: 80
kubectl apply -f front-end-service.yaml
我这边自动生成的端口为31038,通过curl
9.创建一个pod,名字为jenkins,镜像使用jenkins。在新的namespace website-frontend上创建。
kubectl create ns website-frontend
jenkins-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: jenkins
namespace: website-frontend
spec:
containers:
- name: jenkins
image: jenkins
kubectl apply -f jenkins-pod.yaml
10.创建deployment的spec文件:使用redis镜像,7个副本,label为app_enb_stage=dev,deployment名字为kual00201,保存这个spec文件到 /opt/KUAL00201/deploy_spec.yaml完成后,清理(删除)在此任务期间生成的任何新的k8s API对象。
第一种方式:
kubectl run kual00201 --image=redis --labels=app_env_stage=dev --dry-run -oyaml > /opt/KUAL00201/deploy_spec.yaml
第二种方式:
redis-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: kual00201
labels:
app_enb_stage: dev
spec:
replicas: 7
selector:
matchLabels:
app_enb_stage: dev
template:
metadata:
labels:
app_enb_stage: dev
spec:
containers:
- name: redis
image: redis
kubectl apply -f redis-deployment.yaml --dry-run > deploy_spec.yaml
11.创建一个文件 /opt/kucc.txt,这个文件列出所有的service为foo,在namespace为production的pod这个文件的格式是每行一个Pod的名字
kubectl get svc -n production --show-labels | grep foo
kubectl get pods -l k8s-app=kube-dns -n production -o=custom-columns=NAME:metadata.name > kucc.txt
12.创建一个secret,名字为super-secret包含用户名(username) bob,创建pod1挂载该secret,路径为 /secret,创建pod2,使用环境变量引用该secret,该变量的环境变量名为ABC
super-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: super-secret
type: Opaque
data:
username: Ym9i
pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod1
spec:
containers:
- name: pod1
image: redis
volumeMounts:
- name: mt
mountPath: "/secret"
readOnly: true
volumes:
- name: mt
secret:
secretName: super-secret
pod2.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: pod2
image: redis
env:
- name: ABC
valueFrom:
secretKeyRef:
name: super-secret
key: username
13.在新的ns中创建pv,指定pv名字和挂在路径,镜像等
kubectl create ns ns
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv0003
spec:
capacity:
storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
hostPath:
path: "~/raytest/cka/data"
14.为给定的deploy website副本扩容到6
kubectl scale deployment website --replicas=6
15.查看给定集群ready的node个数(不包含NoSchedule)
kubectl get nodes
查看单个
kubectl describe node $nodename | grep Taint 如果有NoSchedule
或者是查看全部
kubectl describe nodes | grep Taint 如果有NoSchedule
16.找出指定ns中使用cpu最高的pod名,并写出到指定文件中
kubectl top pod -l xxx -n default