1 K8s Storage
https://kubernetes.io/docs/concepts/storage/
1.1 Volume
(1)定义一个pod,其中包含两个container
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| apiVersion: v1 kind: Pod metadata: name: volume-pod spec: containers: - name: nginx-container image: nginx ports: - containerPort: 80 volumeMounts: - name: volume-pod mountPath: /nginx-volume - name: busybox-container image: busybox command: ['sh', '-c', 'echo The app is running! && sleep 3600'] volumeMounts: - name: volume-pod mountPath: /busybox-volume volumes: - name: volume-pod hostPath: path: /tmp/volume-pod
|
(2)根据文件创建Pod并查看运行情况
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| kubectl apply -f volume-pod.yaml
kubectl get pods -o wide kubectl describe pod volume-pod
docker ps | grep volume-pod
ls /tmp/volume-pod
docker exec -it containerid sh ls /busybox-volume ls /nginx-volume
docker exec -it containerid cat /etc/hosts
|
1.2 PV PVC Pod介绍
1.2.1 PersistentVolume-PV
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistent-volumes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: v1 kind: PersistentVolume metadata: name: my-pv spec: capacity: storage: 5Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Recycle storageClassName: slow mountOptions: - hard - nfsvers=4.1 nfs: path: /tmp server: 172.17.0.2
|
1.2.2 PersistentVolumeClaim-PVC
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| apiVersion: v1 kind: PersistentVolumeClaim metadata: name: myclaim spec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 8Gi storageClassName: slow selector: matchLabels: release: "stable" matchExpressions: - {key: environment, operator: In, values: [dev]}
|
1.2.3 Pod使用PVC
https://kubernetes.io/docs/concepts/storage/persistent-volumes/#claims-as-volumes
(1)前提是PV和PVC已经绑定在一起,也就是PV能够满足PVC的要求
(2)同时PV和PVC的storageClassName要一样
(3)PersistentVolumeController会发现两者有关系,然后将PV的名字添加在PVC中,这样就建立了绑定关系
1.3 PV PVC Pod实战
需求:Nginx持久化存储,步骤:1.共享存储使用NFS,比如选择在master节点 。2.创建PV和PV。3.Nginx Pod中使用PVC
NFC简介:NFS(network file system)网络文件系统,是FreeBSD支持的文件系统中的一种,允许网络中的计算机之间通过TCP/IP网络共享资源
- Master节点搭建NFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| yum install -y nfs-utils
mkdir -p /nfs/data/ mkdir -p /nfs/data/nginx
chmod -R 777 /nfs/data
: vi /etc/exports /nfs/data *(rw,no_root_squash,sync)
exportfs -r
exportfs
systemctl restart rpcbind && systemctl enable rpcbind systemctl restart nfs && systemctl enable nfs
rpcinfo -p localhost
showmount -e master-ip
|
- 定义PV,PVC和Pod文件
nginx-pv-pvc-demo.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| apiVersion: v1 kind: PersistentVolume metadata: name: nginx-pv spec: accessModes: - ReadWriteMany capacity: storage: 2Gi nfs: path: /nfs/data/nginx server: 192.168.0.51 ---
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nginx-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 2Gi ---
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx ports: - containerPort: 80 volumeMounts: - name: nginx-persistent-storage mountPath: /usr/share/nginx/html volumes: - name: nginx-persistent-storage persistentVolumeClaim: claimName: nginx-pvc
|
- 创建资源并测试
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| kubectl apply -f nginx-pv-pvc-demo.yaml
kubectl get pv,pvc kubectl get pods -o wide kubectl describe pod nginx kubectl describe pv nginx-pv kubectl describe pvc nginx-pvc
echo "hello jack pv pvc pod." > jack.html
kubectl get pods -o wide docker exec -it containerid sh ls /usr/share/nginx/html cat /usr/share/nginx/html/jack.html
kubectl get pods -o wide curl nginx_pod_ip/jack.html
kubectl delete pod nginx-pod curl nginx-new-pod-ip/jack.html
|
手动创建PV是比较麻烦的,可以交给StorageClass操作。
2 Resouce
https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#example-1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| --- apiVersion: v1 kind: Pod metadata: name: frontend spec: containers: - name: app image: images.my-company.example/app:v4 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" - name: log-aggregator image: images.my-company.example/log-aggregator:v6 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m"
|
3 Dashboard
https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/
(1)创建dashboard.yaml文件,记得把image替换成阿里云的,以及配置成NodePort访问形式.
(2)定义访问dashboard需要的account文件并运行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard
|
(3)创建访问dashboard需要的token
1
| kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
|
(4)访问K8s_ip:30018,输入token

4 Controller进阶
https://kubernetes.io/docs/concepts/workloads/controllers/
4.1 Job
https://kubernetes.io/docs/concepts/workloads/controllers/job/
对于RS,RC之类的控制器,能够保持Pod按照预期数目持久地运行下去,它们针对的是持久性的任 务,比如web服务。而有些操作其实不需要持久,比如压缩文件,希望任务完成之后,Pod就结束运行,不需要保持在系统中,此时就需要用到Job。所以可以这样理解,Job是对RS、RC等持久性控制器的补充。负责批量处理短暂的一次性任务,仅执行一次,并保证处理的一个或者多个Pod成功结束。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| apiVersion: batch/v1 kind: Job metadata: name: job-demo spec: template: metadata: name: job-demo spec: restartPolicy: Never containers: - name: counter image: busybox command: - "bin/sh" - "-c" - "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
|
4.2 CronJob
https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/
相当于定时任务
4.3 StatefulSet
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/
之前接触的Pod的管理对象比如RC、Deployment、DaemonSet和Job都是面向无状态的服务,但是现实中有很多服务是有状态的,比如MySQL集群、MongoDB集群、ZK集群等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx ---
apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: nginx ports: - containerPort: 80 name: web
|
4.4 DaemonSet
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/
1 2 3 4
| kubectl get pods kube-proxy-9jgb6 -n kube-system -o yaml | grep kind
|