使用Helm 安装MySQL,缺省方式下发现pod一直处于pending状态,确认之后发现未创建足够PV所导致的问题。
master $ kubectl get pods
NAME READY STATUS RESTARTS AGE
amber-ibex-mysql-5cd6bd76bb-hz8mh 0/1 Pending 0 74s
master $
master $ kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:53:57Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.0", GitCommit:"641856db18352033a0d96dbc99153fa3b27298e5", GitTreeState:"clean", BuildDate:"2019-03-25T15:45:25Z", GoVersion:"go1.12.1", Compiler:"gc", Platform:"linux/amd64"}
master $
master $ helm version
Client: &version.Version{SemVer:"v2.8.2", GitCommit:"a80231648a1473929271764b920a8e346f6de844", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.8.2", GitCommit:"a80231648a1473929271764b920a8e346f6de844", GitTreeState:"clean"}
master $
master $ kubectl get pv
No resources found.
master $ kubectl get pvc
No resources found.
master $ helm install stable/mysql
NAME: amber-ibex
LAST DEPLOYED: Wed Dec 4 08:07:55 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Secret
NAME TYPE DATA AGE
amber-ibex-mysql Opaque 2 0s
==> v1/ConfigMap
NAME DATA AGE
amber-ibex-mysql-test 1 0s
==> v1/PersistentVolumeClaim
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
amber-ibex-mysql Pending 0s
==> v1/Service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
amber-ibex-mysql ClusterIP 10.109.73.123 3306/TCP 0s
==> v1/Deployment
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
amber-ibex-mysql 1 1 1 0 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
amber-ibex-mysql-5cd6bd76bb-hz8mh 0/1 Pending 0 0s
NOTES:
MySQL can be accessed via port 3306 on the following DNS name from within your cluster:
amber-ibex-mysql.default.svc.cluster.local
To get your root password run:
MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default amber-ibex-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
To connect to your database:
1. Run an Ubuntu pod that you can use as a client:
kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il
2. Install the mysql client:
$ apt-get update && apt-get install mysql-client -y
3. Connect using the mysql cli, then provide your password:
$ mysql -h amber-ibex-mysql -p
To connect to your database directly from outside the K8s cluster:
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
# Execute the following command to route the connection:
kubectl port-forward svc/amber-ibex-mysql 3306
mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
master $
master $ helm ls
NAME REVISION UPDATED STATUS CHART NAMESPACE
amber-ibex 1 Wed Dec 4 08:07:55 2019 DEPLOYED mysql-1.4.0 default
master $
master $ kubectl get pods
NAME READY STATUS RESTARTS AGE
amber-ibex-mysql-5cd6bd76bb-hz8mh 0/1 Pending 0 74s
master $
继续确认pod的详细信息
master $ kubectl describe pods amber-ibex-mysql-5cd6bd76bb-hz8mh
Name: amber-ibex-mysql-5cd6bd76bb-hz8mh
Namespace: default
Priority: 0
PriorityClassName:
Node:
Labels: app=amber-ibex-mysql
pod-template-hash=5cd6bd76bb
release=amber-ibex
Annotations:
Status: Pending
IP:
Controlled By: ReplicaSet/amber-ibex-mysql-5cd6bd76bb
Init Containers:
remove-lost-found:
Image: busybox:1.29.3
Port:
Host Port:
Command:
rm
-fr
/var/lib/mysql/lost+found
Requests:
cpu: 10m
memory: 10Mi
Environment:
Mounts:
/var/lib/mysql from data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-dkmsx (ro)
Containers:
amber-ibex-mysql:
Image: mysql:5.7.14
Port: 3306/TCP
Host Port: 0/TCP
Requests:
cpu: 100m
memory: 256Mi
Liveness: exec [sh -c mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}] delay=30s timeout=5s period=10s #success=1 #failure=3
Readiness: exec [sh -c mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}] delay=5s timeout=1s period=10s #success=1 #failure=3
Environment:
MYSQL_ROOT_PASSWORD: Optional: false
MYSQL_PASSWORD: Optional: true
MYSQL_USER:
MYSQL_DATABASE:
Mounts:
/var/lib/mysql from data (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-dkmsx (ro)
Conditions:
Type Status
PodScheduled False
Volumes:
data:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: amber-ibex-mysql
ReadOnly: false
default-token-dkmsx:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-dkmsx
Optional: false
QoS Class: Burstable
Node-Selectors:
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 38s (x3 over 107s) default-scheduler pod has unbound immediate PersistentVolumeClaims
master $
确认pvc,发现原因
master $ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
amber-ibex-mysql Pending 3m23s
master $
进一步确认describe信息,发现没有pv
master $ kubectl describe pvc amber-ibex-mysql
Name: amber-ibex-mysql
Namespace: default
StorageClass:
Status: Pending
Volume:
Labels: app=amber-ibex-mysql
chart=mysql-1.4.0
heritage=Tiller
release=amber-ibex
Annotations:
Finalizers: [kubernetes.io/pvc-protection]
Capacity:
Access Modes:
VolumeMode: Filesystem
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal FailedBinding 6s (x18 over 3m59s) persistentvolume-controller no persistent volumes available for this claim and no storage class is set
Mounted By: amber-ibex-mysql-5cd6bd76bb-hz8mh
master $
使用helm inspect命令确认pvc相关的需求
master $ helm inspect stable/mysql
apiVersion: v1
appVersion: 5.7.27
description: Fast, reliable, scalable, and easy to use open-source relational database
system.
engine: gotpl
home: https://www.mysql.com/
icon: https://www.mysql.com/common/logos/logo-mysql-170x115.png
keywords:
- mysql
- database
- sql
...省略
## Persist data to a persistent volume
persistence:
enabled: true
## database data Persistent Volume Storage Class
## If defined, storageClassName:
## If set to "-", storageClassName: "", which disables dynamic provisioning
## If undefined (the default) or set to null, no storageClassName spec is
## set, choosing the default provisioner. (gp2 on AWS, standard on
## GKE, AWS & OpenStack)
##
# storageClass: "-"
accessMode: ReadWriteOnce
size: 8Gi
annotations: {}
...省略
master $
可以看到需要一个大小为8G的pv,使用如下yaml文件创建所需的pv
master $ cat mysql-pv-volume.yaml
kind: PersistentVolume
apiVersion: v1
metadata:
name: pv-volume-mysql
labels:
type: local
spec:
capacity:
storage: 8Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/mysql/data"
master $ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
amber-ibex-mysql Pending 22m
master $ kubectl get pv
No resources found.
master $ kubectl create -f mysql-pv-volume.yaml
persistentvolume/pv-volume-mysql created
master $
确认pv和pvc可以看到pv状态从Available到Bound的变化过程
master $ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-volume-mysql 8Gi RWO Retain Available 4s
master $ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
amber-ibex-mysql Bound pv-volume-mysql 8Gi RWO 23m
master $ kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-volume-mysql 8Gi RWO Retain Bound default/amber-ibex-mysql 16s
master $
再次确认pod也已经变成Running的状态了
master $ kubectl get pods
NAME READY STATUS RESTARTS AGE
amber-ibex-mysql-5cd6bd76bb-hz8mh 0/1 Running 0 23m
master $
STATUS仍然不正确,是因为实际仍然在启动中,稍等一会再次确认就发现已经正常了
master $ kubectl get pods
NAME READY STATUS RESTARTS AGE
amber-ibex-mysql-5cd6bd76bb-hz8mh 1/1 Running 0 26m
master $