Kubernetes基础(2)---使用k3s学习
运行有状态的应用
创建MySQL数据库
官方模板
首先从官网拿案例
- 配置环境变量
apiVersion: v1 kind: Pod metadata: name: envar-demo labels: purpose: demonstrate-envars spec: containers: - name: envar-demo-container image: gcr.io/google-samples/node-hello:1.0 env: - name: DEMO_GREETING value: "Hello from the environment" - name: DEMO_FAREWELL value: "Such a sweet sorrow"
简单修改一下
apiVersion: v1 kind: Pod metadata: name: mysql-pod labels: app: mysql spec: containers: - name: mysql image: mysql:5.7
设置密码
然后开始配置密码,数据持久化,端口
在MySQL镜像里可以看到设置密码的变量,
apiVersion: v1 kind: Pod metadata: name: mysql-pod labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: "123456"
数据在容器中很容易丢失,无法保存,这里可以用挂载卷来实现保存到主机里
- 挂载卷
- 将数据存储在容器中,一旦容器被删除,数据也会被删除。
- 将数据存储到卷(Volume)中,删除容器时,卷不会被删除。
hostPath卷
hostPath 卷将主机节点上的文件或目录挂载到 Pod 中。
官方已经介绍的很清楚了,我们这里需要注意的是hostPath 卷指定 type。
官方给了7个type,我们一般用的前5个
hostPath的type值:
DirectoryOrCreate |
目录不存在则自动创建。 |
Directory |
挂载已存在目录。不存在会报错。 |
FileOrCreate |
文件不存在则自动创建。 不会自动创建文件的父目录,必须确保文件路径已经存在。 |
File |
挂载已存在的文件。不存在会报错。 |
Socket |
挂载 UNIX 套接字。例如挂载/var/run/docker.sock进程 |
把官方示例中我们需要的部分添加进来并修改
容器内的目录可以根据mysql的docker介绍
apiVersion: v1 kind: Pod metadata: name: mysql-pod labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: "123456" volumeMounts: - mountPath: /var/lib/mysql #容器中的目录 name: data-volume volumes: - name: data-volume hostPath: # directory location on host path: /home/mysql/data # this field is optional type: DirectoryOrCreate
注意:hostPath 仅用于在单节点集群上进行开发和测试,不适用于多节点集群;
例如,当Pod被重新创建时,可能会被调度到与原先不同的节点上,导致新的Pod没有数据。
在多节点集群使用本地存储,可以使用local
卷。
启动容器
[root@k8s mysql]# kubectl apply -f mysql-pod.yaml pod/mysql-pod created [root@k8s mysql]# kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mysql-pod 1/1 Running 0 2m41s 10.42.2.37 k8s2 <none> <none> [root@k8s mysql]# cd /home/mysql/data -bash: cd: /home/mysql/data: 没有那个文件或目录
发现没有该目录,因为他创建到k8s2的主机里了
去k8s2主机查看,发现文件创建成功
[root@k8s2 ~]# cd /home/mysql/data [root@k8s2 data]# ls auto.cnf client-cert.pem ibdata1 ibtmp1 private_key.pem server-key.pem ca-key.pem client-key.pem ib_logfile0 mysql public_key.pem sys ca.pem ib_buffer_pool ib_logfile1 performance_schema server-cert.pem
可以进入容器使用mysql
[root@k8s ~]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-pod 1/1 Running 1 (2m54s ago) 2d8h [root@k8s ~]# kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mysql-pod 1/1 Running 1 (2m59s ago) 2d8h 10.42.2.39 k8s2 <none> <none> [root@k8s ~]# kubectl exec mysql-pod -it -- /bin/bash root@mysql-pod:/# ls bin dev entrypoint.sh home lib64 mnt proc run srv tmp var boot docker-entrypoint-initdb.d etc lib media opt root sbin sys usr root@mysql-pod:/# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.36 MySQL Community Server (GPL) Copyright (c) 2000, 2021, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec) mysql> exit; Bye root@mysql-pod:/# exit exit [root@k8s ~]#