[toc]
kubernetes 操作记录三
存储卷
emptyDir
| |
| apiVersion: v1 |
| kind: Pod |
| metadata: |
| name: pod-demo |
| namespace: default |
| labels: |
| app: myapp |
| tier: frontend |
| annotations: |
| ssjinyao.com/create-by: "cluster admin" |
| spec: |
| containers: |
| - name: myapp |
| image: ikubernetes/myapp:v1 |
| imagePullPolicy: IfNotPresent |
| ports: |
| - name: http |
| containerPort: 80 |
| volumeMounts: |
| - name: html |
| mountPath: /data/www/html |
| command: ["/bin/sh"] |
| args: ["-c" , "httpd -h /data/www/html && sleep 300000"] |
| - name: busybox |
| image: busybox:latest |
| imagePullPolicy: IfNotPresent |
| volumeMounts: |
| - name: html |
| mountPath: /data/ |
| command: ["/bin/sh"] |
| args: [ "-c", "while sleep 2 ; do echo $(date) >> /data/index.html; done"] |
| volumes: |
| - name: html |
| emptyDir: {} |
| |
| / |
| / |
| Fri May 17 06:59:59 UTC 2019 |
| |
| / |
| /data/web/html/index.html |
| / |
| Fri May 17 06:59:59 UTC 2019 |
| |
| Fri May 17 07:33:24 UTC 2019 |
| Fri May 17 07:33:26 UTC 2019 |
| Fri May 17 07:33:28 UTC 2019 |
| Fri May 17 07:33:30 UTC 2019 |
| Fri May 17 07:33:32 UTC 2019 |
| Fri May 17 07:33:34 UTC 2019 |
| Fri May 17 07:33:36 UTC 2019 |
| Fri May 17 07:33:38 UTC 2019 |
| Fri May 17 07:33:40 UTC 2019 |
| Fri May 17 07:33:42 UTC 2019 |
| Fri May 17 07:33:44 UTC 2019 |
hostPath挂载使用
| |
| apiVersion: v1 |
| kind: Pod |
| metadata: |
| name: pod-vol-hostpath |
| namespace: default |
| spec: |
| containers: |
| - name: myapp |
| image: ikubernets/myapp:v1 |
| volumeMounts: |
| - name: html |
| mountPath: /usr/share/nginx/html/ |
| volumes: |
| - name: html |
| hostPath: |
| path: /data/pod/volume1 |
| type: DirectoryOrCreate |
| |
node1,node2,node3 分别创建以下目录
可以看出当前运行在node1节点上
nfs 卷挂载使用
选择一台服务器,安装并开启nfs 服务
| |
| |
| |
| /data/volumes 10.1.87.83/24(rw,no_root_squash) |
| |
注: 其它节点也需要安装 nfs-utils 不然pod驱动不了
在node02上手动测试挂载
在kubernetes 集群中使用nfs volumes
| apiVersion: v1 |
| kind: Pod |
| metadata: |
| name: pod-vol-nfs |
| namespace: default |
| spec: |
| containers: |
| - name: myapp |
| image: ikubernetes/myapp:v1 |
| volumeMounts: |
| - name: html |
| mountPath: /usr/share/nginx/html/ |
| volumes: |
| - name: html |
| nfs: |
| path: /data/volumes |
| server: node03 |
| |
在nfs服务器上写入数据
尝试访问
| |
| <h1>nfs.ssjinyao.com</h1> |
pv, pvc 的使用
nfs 服务器上创建多个目录
| |
| |
| /data/volumes/v1 10.1.87.83/24(rw,no_root_squash) |
| /data/volumes/v2 10.1.87.83/24(rw,no_root_squash) |
| /data/volumes/v3 10.1.87.83/24(rw,no_root_squash) |
| /data/volumes/v4 10.1.87.83/24(rw,no_root_squash) |
| /data/volumes/v5 10.1.87.83/24(rw,no_root_squash) |
| |
| exporting 10.1.87.83/24:/data/volumes/v5 |
| exporting 10.1.87.83/24:/data/volumes/v4 |
| exporting 10.1.87.83/24:/data/volumes/v3 |
| exporting 10.1.87.83/24:/data/volumes/v2 |
| exporting 10.1.87.83/24:/data/volumes/v1 |
| |
| |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv01 |
| labels: |
| name: pv001 |
| spec: |
| nfs: |
| path: /data/volumes/v1 |
| server: node03 |
| accessModes: ["ReadWriteMany","ReadWriteOnce"] |
| capacity: |
| storage: 5Gi |
| --- |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv02 |
| labels: |
| name: pv002 |
| spec: |
| nfs: |
| path: /data/volumes/v2 |
| server: node03 |
| accessModes: ["ReadWriteOnce"] |
| capacity: |
| storage: 10Gi |
| --- |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv03 |
| labels: |
| name: pv003 |
| spec: |
| nfs: |
| path: /data/volumes/v3 |
| server: node03 |
| accessModes: ["ReadWriteMany","ReadWriteOnce"] |
| capacity: |
| storage: 20Gi |
| --- |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv04 |
| labels: |
| name: pv004 |
| spec: |
| nfs: |
| path: /data/volumes/v4 |
| server: node03 |
| accessModes: ["ReadWriteMany","ReadWriteOnce"] |
| capacity: |
| storage: 10Gi |
| --- |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv05 |
| labels: |
| name: pv005 |
| spec: |
| nfs: |
| path: /data/volumes/v5 |
| server: node03 |
| accessModes: ["ReadWriteMany","ReadWriteOnce"] |
| capacity: |
| storage: 10Gi |
| --- |
| |
| NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE |
| pv01 5Gi RWO,RWX Retain Available 74s |
| pv02 10Gi RWO Retain Available 74s |
| pv03 20Gi RWO,RWX Retain Available 74s |
| pv04 10Gi RWO,RWX Retain Available 74s |
| pv05 10Gi RWO,RWX Retain Available 74s |
pvc 绑定 pv
| |
| apiVersion: v1 |
| kind: PersistentVolumeClaim |
| metadata: |
| name: mypvc |
| namespace: default |
| spec: |
| accessModes: ["ReadWriteMany"] |
| resources: |
| requests: |
| storage: 11Gi |
| --- |
| apiVersion: v1 |
| kind: Pod |
| metadata: |
| name: pod-vol-pvc |
| namespace: default |
| spec: |
| containers: |
| - name: myapp |
| image: ikubernetes/myapp:v1 |
| volumeMounts: |
| - name: html |
| mountPath: /usr/share/nginx/html/ |
| volumes: |
| - name: html |
| persistentVolumeClaim: |
| claimName: mypvc |
| |
| |
| NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE |
| pv01 5Gi RWO,RWX Retain Available 40m |
| pv02 10Gi RWO Retain Available 40m |
| pv03 20Gi RWO,RWX Retain Bound default/mypvc 40m |
| pv04 10Gi RWO,RWX Retain Available 40m |
| pv05 10Gi RWO,RWX Retain Available 40m |
| |
| NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE |
| mypvc Bound pv03 20Gi RWO,RWX 8s |
configmap 的使用
| |
| configmap/nginx-config created |
| |
| NAME DATA AGE |
| nginx-config 2 25s |
| |
| Name: nginx-config |
| Namespace: default |
| Labels: <none> |
| Annotations: <none> |
| |
| Data |
| ==== |
| nginx_port: |
| ---- |
| 80 |
| server_name: |
| ---- |
| myapp.ssjinyao.com |
| Events: <none> |
| |
| |
| |
| server { |
| server_name myapp.ssjinyao.com; |
| listen 80; |
| root /data/web/html/; |
| |
| } |
| |
| |
| NAME DATA AGE |
| nginx-config 2 4m4s |
| nginx-www 1 3s |
| |
| apiVersion: v1 |
| data: |
| www.conf: "server {\n\tserver_name myapp.ssjinyao.com;\n listen 80;\n root |
| /data/web/html/;\n\n}\n" |
| kind: ConfigMap |
| metadata: |
| creationTimestamp: "2019-05-20T08:17:37Z" |
| name: nginx-www |
| namespace: default |
| resourceVersion: "3462936" |
| selfLink: /api/v1/namespaces/default/configmaps/nginx-www |
| uid: ba1625a7-7ad7-11e9-8902-525400c45563 |
Pod 引用 configmap ,环境变量方式
| |
| apiVersion: v1 |
| kind: Pod |
| metadata: |
| name: pod-cm-1 |
| namespace: default |
| labels: |
| app: myapp |
| tier: frontend |
| annotations: |
| ssjinyao.com/create-by: "cluster admin" |
| spec: |
| containers: |
| - name: myapp |
| image: ikubernetes/myapp:v1 |
| ports: |
| - name: http |
| containerPort: 80 |
| env: |
| - name: NGINX_SERVER_PORT |
| valueFrom: |
| configMapKeyRef: |
| name: nginx-config |
| key: nginx_port |
| - name: NGINX_SERVER_NAME |
| valueFrom: |
| configMapKeyRef: |
| name: nginx-config |
| key: server_name |
| |
| pod/pod-cm-1 created |
| |
| / |
| NGINX_SERVER_PORT=80 |
| NGINX_SERVER_NAME=myapp.ssjinyao.com |
当环境变量获取时,容器的变量不是实时更新的
| |
| configmap/nginx-config edited |
| |
| |
| |
| Name: nginx-config |
| Namespace: default |
| Labels: <none> |
| Annotations: <none> |
| |
| Data |
| ==== |
| nginx_port: |
| ---- |
| 8080 |
| server_name: |
| ---- |
| myapp.ssjinyao.com |
| Events: <none> |
| |
| |
| / |
| NGINX_SERVER_PORT=80 |
| NGINX_SERVER_NAME=myapp.ssjinyao.com |
存储卷挂载方式
| |
| apiVersion: v1 |
| kind: Pod |
| metadata: |
| name: pod-cm-2 |
| namespace: default |
| labels: |
| app: myapp |
| tier: frontend |
| annotations: |
| ssjinyao.com/create-by: "cluster admin" |
| spec: |
| containers: |
| - name: myapp |
| image: ikubernetes/myapp:v1 |
| ports: |
| - name: http |
| containerPort: 80 |
| volumeMounts: |
| - name: nginxconf |
| mountPath: /etc/nginx/config.d/ |
| readOnly: true |
| volumes: |
| - name: nginxconf |
| configMap: |
| name: nginx-config |
| |
| pod/pod-cm-2 created |
| |
| / |
| conf.d/ config.d/ |
| / |
| /etc/nginx/config.d |
| nginx_port server_name |
| /etc/nginx/config.d |
| 8080/etc/nginx/config.d |
| /etc/nginx/config.d |
| myapp.ssjinyao.com/etc/nginx/config.d |
| |
| configmap/nginx-config edited |
| |
| |
| |
| Edit cancelled, no changes made. |
| [root@bj-zb-vm-ops-test5 configmap] |
| / |
| /etc/nginx/config.d |
| 8088/etc/nginx/config.d |
案例,配置文件焙进镜像
| |
| |
| apiVersion: v1 |
| kind: Pod |
| metadata: |
| name: pod-cm-3 |
| namespace: default |
| labels: |
| app: myapp |
| tier: frontend |
| annotations: |
| ssjinyao.com/create-by: "cluster admin" |
| spec: |
| containers: |
| - name: myapp |
| image: ikubernetes/myapp:v1 |
| ports: |
| - name: http |
| containerPort: 80 |
| volumeMounts: |
| - name: nginxconf |
| mountPath: /etc/nginx/conf.d/ |
| readOnly: true |
| volumes: |
| - name: nginxconf |
| configMap: |
| name: nginx-www |
| |
| / |
| /etc/nginx/conf.d |
| server { |
| server_name myapp.ssjinyao.com; |
| listen 80; |
| root /data/web/html/; |
| |
| } |
| |
| configmap/nginx-www edited |
| |
| |
| / |
| /etc/nginx/conf.d |
| server { |
| server_name myapp.ssjinyao.com; |
| listen 8080; |
| root /data/web/html/; |
| |
| } |
| |
| |
| |
| 10.244.1.158 myapp.ssjinyao.com |
| |
| <h1> Nginx Server Configured by CM </h1> |
secret 的使用
configmap 都是明文存数据的,私钥和证书要放在secret中,密码要写成dns secret 而非configamp
| |
| secret/mysql-root-password created |
| |
| NAME TYPE DATA AGE |
| default-token-2sgn5 kubernetes.io/service-account-token 3 24d |
| mysql-root-password Opaque 1 45s |
| tomcat-ingress-secret kubernetes.io/tls 2 4d |
| |
| Name: mysql-root-password |
| Namespace: default |
| Labels: <none> |
| Annotations: <none> |
| |
| Type: Opaque |
| |
| Data |
| ==== |
| passwod: 7 bytes |
| |
| |
| Name: nginx-www |
| Namespace: default |
| Labels: <none> |
| Annotations: <none> |
| |
| Data |
| ==== |
| www.conf: |
| ---- |
| server { |
| server_name myapp.ssjinyao.com; |
| listen 8080; |
| root /data/web/html/; |
| |
| } |
| |
| Events: <none> |
| |
| |
| |
| |
| apiVersion: v1 |
| data: |
| passwod: SEBuZGloMw== |
| kind: Secret |
| metadata: |
| creationTimestamp: "2019-05-20T09:20:53Z" |
| name: mysql-root-password |
| namespace: default |
| resourceVersion: "3469600" |
| selfLink: /api/v1/namespaces/default/secrets/mysql-root-password |
| uid: 90cd9aaa-7ae0-11e9-8902-525400c45563 |
| type: Opaque」 |
可以看出数据还是有的,因此安全没有那好,也没有加密码的意义
可以直接用 base64 -d 进行解密
| # echo SEBuZGloMw== | base64 -d |
| H@ndih3 |
| |
| apiVersion: v1 |
| kind: Pod |
| metadata: |
| name: pod-secret-1 |
| namespace: default |
| labels: |
| app: myapp |
| tier: frontend |
| annotations: |
| ssjinyao.com/create-by: "cluster admin" |
| spec: |
| containers: |
| - name: myapp |
| image: ikubernetes/myapp:v1 |
| ports: |
| - name: http |
| containerPort: 80 |
| env: |
| - name: MYSQL_ROOT_PASSWORD |
| valueFrom: |
| secretKeyRef: |
| name: mysql-root-password |
| key: passwod |
| |
| MYSQL_ROOT_PASSWORD=H@ndih3 |
statefulset 的使用
nfs服务器还是在node3 上,配置信息如下
| |
| /data/volumes/v1 10.1.87.83/24(rw,no_root_squash) |
| /data/volumes/v2 10.1.87.83/24(rw,no_root_squash) |
| /data/volumes/v3 10.1.87.83/24(rw,no_root_squash) |
| /data/volumes/v4 10.1.87.83/24(rw,no_root_squash) |
| /data/volumes/v5 10.1.87.83/24(rw,no_root_squash) |
注:确保三台node服务器都安装了 nfs-utils
pv改动及创建
| |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv01 |
| labels: |
| name: pv001 |
| spec: |
| nfs: |
| path: /data/volumes/v1 |
| server: node03 |
| accessModes: ["ReadWriteMany","ReadWriteOnce"] |
| capacity: |
| storage: 5Gi |
| --- |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv02 |
| labels: |
| name: pv002 |
| spec: |
| nfs: |
| path: /data/volumes/v2 |
| server: node03 |
| accessModes: ["ReadWriteOnce"] |
| capacity: |
| storage: 5Gi |
| --- |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv03 |
| labels: |
| name: pv003 |
| spec: |
| nfs: |
| path: /data/volumes/v3 |
| server: node03 |
| accessModes: ["ReadWriteMany","ReadWriteOnce"] |
| capacity: |
| storage: 5Gi |
| --- |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv04 |
| labels: |
| name: pv004 |
| spec: |
| nfs: |
| path: /data/volumes/v4 |
| server: node03 |
| accessModes: ["ReadWriteMany","ReadWriteOnce"] |
| capacity: |
| storage: 10Gi |
| --- |
| apiVersion: v1 |
| kind: PersistentVolume |
| metadata: |
| name: pv05 |
| labels: |
| name: pv005 |
| spec: |
| nfs: |
| path: /data/volumes/v5 |
| server: node03 |
| accessModes: ["ReadWriteMany","ReadWriteOnce"] |
| capacity: |
| storage: 10Gi |
| --- |
| |
| |
| apiVersion: v1 |
| kind: Service |
| metadata: |
| name: myapp |
| labels: |
| app: myapp |
| spec: |
| ports: |
| - port: 80 |
| name: web |
| clusterIP: None |
| selector: |
| app: myapp-pod |
| --- |
| apiVersion: apps/v1 |
| kind: StatefulSet |
| metadata: |
| name: myapp |
| spec: |
| serviceName: myapp |
| replicas: 3 |
| selector: |
| matchLabels: |
| app: myapp-pod |
| template: |
| metadata: |
| labels: |
| app: myapp-pod |
| spec: |
| containers: |
| - name: myapp |
| image: ikubernetes/myapp:v1 |
| ports: |
| - containerPort: 80 |
| name: web |
| volumeMounts: |
| - name: myappdata |
| mountPath: /usr/share/nginx/html |
| volumeClaimTemplates: |
| - metadata: |
| name: myappdata |
| spec: |
| accessModes: ["ReadWriteOnce"] |
| resources: |
| requests: |
| storage: 5Gi |
| |
| NAME READY STATUS RESTARTS AGE |
| client 1/1 Running 0 23d |
| myapp-0 1/1 Running 0 7m10s |
| myapp-1 1/1 Running 0 7m5s |
| myapp-2 1/1 Running 0 7m1s |
| |
| NAME READY AGE |
| myapp 3/3 7m32s |
| |
| NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE |
| pv01 5Gi RWO,RWX Retain Bound default/myappdata-myapp-1 8m12s |
| pv02 5Gi RWO Retain Bound default/myappdata-myapp-0 8m12s |
| pv03 5Gi RWO,RWX Retain Bound default/myappdata-myapp-2 8m12s |
| pv04 10Gi RWO,RWX Retain Available 8m12s |
| pv05 10Gi RWO,RWX Retain Available 8m12s |
| |
| / |
| nslookup: can't resolve '(null)': Name does not resolve |
| |
| Name: myapp-0.myapp.default.svc.cluster.local |
| Address 1: 10.244.1.162 myapp-0.myapp.default.svc.cluster.local |
| / |
| nslookup: can't resolve '(null)': Name does not resolve |
| |
| Name: myapp-1.myapp.default.svc.cluster.local |
| Address 1: 10.244.2.192 myapp-1.myapp.default.svc.cluster.local |
| / |
| nslookup: can't resolve '(null)': Name does not resolve |
| |
| Name: myapp-2.myapp.default.svc.cluster.local |
| Address 1: 10.244.3.172 myapp-2.myapp.default.svc.cluster.local |
pod 数量扩展
| |
| statefulset.apps/myapp scaled |
| |
| statefulset.apps/myapp patched |
| |
| statefulset.apps/myapp patched |
| |
| statefulset.apps/myapp image updated |
| |
| NAME READY AGE CONTAINERS IMAGES |
| myapp 2/2 53m myapp ikubernetes/myapp:v2 |