K8S学习指南(三)---安装Mysql并运行wordpress
创建Mysql
服务
定义一个服务需要三部分Pod
Service
PV(PVC)
# mysql-deployment.yaml
apiVersion: v1 ## 指定APi版本
kind: Service ## 表明是 kubernetes Service
metadata:
name: wordpress-mysql ## Service 的全局唯一名称
labels:
app: wordpress ## 用来识别pod
spec:
ports:
- port: 3306 ## 这里是创建虚拟IP的端口,直接ping 和 curl 是不通的
selector: ## 选择 pod.metadata.app&tier == wordpress&mysql 的pod(是的,一个service是可以对接多个pod的)
app: wordpress
tier: mysql
clusterIP: None ## 不建立虚拟IP
---
apiVersion: v1
kind: PersistentVolumeClaim ## 是用户存储的请求,PVC消耗PV的资源,可以请求特定的大小和访问模式,需要指定归属于某个Namespace,在同一个Namespace的Pod才可以指定对应的PVC
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce ## 该volume只能被单个节点以读写的方式映射
resources:
requests:
storage: 8Gi
---
## 定义Pod
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment ## 指定创建资源的角色/类型.这里定义的是一个
metadata:
name: wordpress-mysql ## 全局唯一名称
labels:
app: wordpress
spec: ## 相关属性定义
selector: ## kubernetes 通过 spec.selector来筛选要控制的Pod
matchLabels:
app: wordpress
tier: mysql
strategy: ## 指新的Pod替换旧的Pod的策略
type: Recreate ## Recreate 重建策略,在创建出新的Pod之前会先杀掉所有已存在的Pod
template: ## 这里定义Pod模版.K8S会根据此模板创建实例(副本)
metadata: ## # Pod 副本拥有的标签,对应 RC 的 selector.这里的labels必须匹配之前的spec.selector,否则创建一个无法匹配的Pod就会不停尝试创建新的Pod
labels:
app: wordpress
tier: mysql
spec: ## 容器内定义内容
containers:
- image: mysql:5.6 ## 对应Docker Image
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD ## 定义root密码
value: "123456"
ports:
- containerPort: 3306
name: mysql
volumeMounts: ## volumeMounts 字段保证了 /var/lib/mysql 文件夹由一个 PersistentVolume 支持
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes: ## 指定Volume的类型和内容
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim ## 这里表明使用上文创建的PVC
复制代码
- 创建好
mysql-deployment.yaml
文件后,将他发布到K8S
集群中,我们需要在Master
节点中执行命令:
# kubectl create -f mysql-deployment.yaml
service/wordpress-mysql created
persistentvolumeclaim/mysql-pv-claim created
deployment.apps/wordpress-mysql created
复制代码
- 用
kubectl
命令查看刚刚创建的Dem
# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
wordpress-mysql 1/1 1 1 89m
复制代码
- 查看刚刚创建的
Service
# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 139m
wordpress-mysql ClusterIP None <none> 3306/TCP 90m
复制代码
- 查看
Pod
的创建情况时,可以运行下面的命令
kubectl describe pod 可以查看更加详细的情况
r# kubectl get pods -o wide --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default wordpress-mysql-b67565868-pvlps 1/1 Running 0 90m
复制代码
我们看到一个名为
wordpress-mysql--xxxx
的Pod
实例,这是K8S根据mysql
这个RC的定义自动创建的Pod
.
由于
Pod
的调度以及下载Docker Image
都需要一段时间,当Pod
成功创建容器以后,状态会更新为Running
.
- 通过
docker ps
查看正在运行的容器.发现除了Mysql
服务的Pod
容器以及创建了,此外还有一个k8s_POD
的Pause
容器.这就是Pod
的"根服务器".
# docker ps | grep mysql
1dae03a4fcdd mysql "docker-entrypoint.s…" 2 hours ago Up 2 hours k8s_mysql_wordpress-mysql-b67565868-pvlps_default_58f50096-fec0-43ed-ad01-4c696f155b58_0
37483feec714 k8s.gcr.io/pause:3.1 "/pause" 2 hours ago Up 2 hours k8s_POD_wordpress-mysql-b67565868-pvlps_default_58f50096-fec0-43ed-ad01-4c696f155b58_0
复制代码
启动myweb
博客
上面已经定义和创建好Mysql
服务.接下来完成wordpress
应用的启动过程
- 首先创建对应的文件
wordpress-deployment.yaml
# application/wordpress/wordpress-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
value: "123456"
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
复制代码
- 查看创建的
wordpress
对外开放端口
# kubectl get services wordpress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress LoadBalancer 10.107.143.141 <pending> 80:32314/TCP 5m2
复制代码
可以看到对外开放
NodePort
是 32314.(如果不指定随机在30000 - 350000中选取)
在浏览器上输入 http://Node的IP:32314/
即可登陆wordpress
快速安装
kubectl apply -f
https://raw.githubusercontent.com/charSLee013/Kubernetes-learn/master/chapter03/mysql-deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/charSLee013/Kubernetes-learn/master/chapter03/wordpress-deployment.yaml
复制代码
其他
Kubernetes 删除资源指令
kubectl delete ([-f FILENAME] | TYPE [(NAME | -l label | --all)])
复制代码
示例
# 通过pod.json文件中指定的资源类型和名称删除一个pod
$ kubectl delete -f ./mysql-rc.yaml
# 通过控制台输入的JSON所指定的资源类型和名称删除一个pod
$ cat pod.json | kubectl delete -f -
# 删除所有名为“baz”和“foo”的pod和service
$ kubectl delete pod,service baz foo
# 删除所有带有lable name=myLabel的pod和service
$ kubectl delete pods,services -l name=myLabel
# 删除UID为1234-56-7890-234234-456456的pod
$ kubectl delete pod 1234-56-7890-234234-456456
# 删除所有的pod
$ kubectl delete pods --all
复制代码
选项
--all[=false]: 使用[-all]选择所有指定的资源。
--cascade[=true]: 如果为true,级联删除指定资源所管理的其他资源(例如:被replication controller管理的所有pod)。默认为true。
-f, --filename=[]: 用以指定待删除资源的文件名,目录名或者URL。
--grace-period=-1: 安全删除资源前等待的秒数。如果为负值则忽略该选项。
--ignore-not-found[=false]: 当待删除资源未找到时,也认为删除成功。如果设置了--all选项,则默认为true。
-o, --output="": 输出格式,使用“-o name”来输出简短格式(资源类型/资源名)。
-l, --selector="": 用于过滤资源的Label。
--timeout=0: 删除资源的超时设置,0表示根据待删除资源的大小由系统决定。
复制代码
继承自父命令的选项
--alsologtostderr[=false]: 同时输出日志到标准错误控制台和文件。
--api-version="": 和服务端交互使用的API版本。
--certificate-authority="": 用以进行认证授权的.cert文件路径。
--client-certificate="": TLS使用的客户端证书路径。
--client-key="": TLS使用的客户端密钥路径。
--cluster="": 指定使用的kubeconfig配置文件中的集群名。
--context="": 指定使用的kubeconfig配置文件中的环境名。
--insecure-skip-tls-verify[=false]: 如果为true,将不会检查服务器凭证的有效性,这会导致你的HTTPS链接变得不安全。
--kubeconfig="": 命令行请求使用的配置文件路径。
--log-backtrace-at=:0: 当日志长度超过定义的行数时,忽略堆栈信息。
--log-dir="": 如果不为空,将日志文件写入此目录。
--log-flush-frequency=5s: 刷新日志的最大时间间隔。
--logtostderr[=true]: 输出日志到标准错误控制台,不输出到文件。
--match-server-version[=false]: 要求服务端和客户端版本匹配。
--namespace="": 如果不为空,命令将使用此namespace。
--password="": API Server进行简单认证使用的密码。
-s, --server="": Kubernetes API Server的地址和端口号。
--stderrthreshold=2: 高于此级别的日志将被输出到错误控制台。
--token="": 认证到API Server使用的令牌。
--user="": 指定使用的kubeconfig配置文件中的用户名。
--username="": API Server进行简单认证使用的用户名。
--v=0: 指定输出日志的级别。
--vmodule=: 指定输出日志的模块,格式如下:pattern=N,使用逗号分隔。
复制代码
更多学习文章在点击访问