13. pod优化1-应用拆分
1. 为什么要优化¶
- 考虑真实的使用场景,像数据库这类中间件,是作为公共资源,为多个项目提供服务,不适合和业务容器绑定在同一个Pod中,因为业务容器是经常变更的,而数据库不需要频繁迭代
- yaml的环境变量中存在敏感信息(账号、密码),存在安全隐患
2. 拆分原yaml¶
1. 创建目录¶
mkdir -p /k8s/pod/myblog/two-pod/
cd /k8s/pod/myblog/two-pod
2. 原yaml模板¶
apiVersion: v1
kind: Pod
metadata:
name: myblog
namespace: demo
labels:
component: myblog
spec:
volumes:
- name: mysql-data
hostPath:
path: /opt/mysql/data
nodeSelector: # 使用节点选择器将Pod调度到指定label的节点
component: mysql
containers:
- name: myblog
image: myblog:v1
env:
- name: MYSQL_HOST # 指定root用户的用户名
value: "127.0.0.1"
- name: MYSQL_PASSWD
value: "123456"
ports:
- containerPort: 8002
- name: mysql
image: mysql:5.7-utf8
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: "myblog"
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
3. 创建mysql.yaml¶
vim mysql.yaml
apiVersion: v1
kind: Pod
metadata:
name: mysql
namespace: demo
labels:
component: mysql
spec:
hostNetwork: true # 声明pod的网络模式为host模式,效果通docker run --net=host
volumes:
- name: mysql-data
hostPath:
path: /opt/mysql/data
nodeSelector: # 使用节点选择器将Pod调度到指定label的节点
component: mysql
containers:
- name: mysql
image: mysql:5.7-utf8
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: "myblog"
resources: #资源限制
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 500Mi
cpu: 100m
readinessProbe: #探针
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 15
periodSeconds: 20
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
4. 创建myblog.yaml¶
vim myblog.yaml
apiVersion: v1
kind: Pod
metadata:
name: myblog
namespace: demo
labels:
component: myblog
spec:
containers:
- name: myblog
image: myblog:v1
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_HOST
value: "81.70.4.171" # 这里不知道写宿主机IP是否可以???可以,因为mysql使用的网络模式是host模式
- name: MYSQL_PASSWD
value: "123456"
ports:
- containerPort: 8002
resources:
requests:
memory: 100Mi
cpu: 50m
limits:
memory: 500Mi
cpu: 100m
livenessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10 # 容器启动后第一次执行探测是需要等待多少秒
periodSeconds: 15 # 执行探测的频率
timeoutSeconds: 2 # 探测超时时间
readinessProbe:
httpGet:
path: /blog/index/
port: 8002
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 2
periodSeconds: 15
3. 创建测试¶
1. 删除旧的pod¶
## 先删除旧pod
kubectl -n demo delete po myblog
root@k8s-master:/k8s/pod/myblog# mkdir -p /k8s/pod/myblog/two-pod/
root@k8s-master:/k8s/pod/myblog# cd /k8s/pod/myblog/two-pod
root@k8s-master:/k8s/pod/myblog/two-pod#
root@k8s-master:/k8s/pod/myblog/two-pod# vim mysql.yaml
root@k8s-master:/k8s/pod/myblog/two-pod#
root@k8s-master:/k8s/pod/myblog/two-pod# vim myblog.yaml
root@k8s-master:/k8s/pod/myblog/two-pod#
root@k8s-master:/k8s/pod/myblog/two-pod# kubectl -n demo get po
NAME READY STATUS RESTARTS AGE
myblog 2/2 Running 0 19m
root@k8s-master:/k8s/pod/myblog/two-pod#
root@k8s-master:/k8s/pod/myblog/two-pod# kubectl -n demo delete po myblog
pod "myblog" deleted
root@k8s-master:/k8s/pod/myblog/two-pod#
root@k8s-master:/k8s/pod/myblog/two-pod# kubectl -n demo get po
No resources found in demo namespace.
2. 创建2个新的pod¶
## 分别创建mysql和myblog
kubectl apply -f mysql.yaml
kubectl apply -f myblog.yaml
3. 查看myblog的IP¶
## 查看pod,注意mysqlIP为宿主机IP,因为网络模式为host
kubectl -n demo get po -o wide
root@k8s-master:/k8s/pod/myblog/two-pod# kubectl -n demo get po -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myblog 1/1 Running 0 30s 10.244.0.36 k8s-master <none> <none>
mysql 1/1 Running 0 31s 81.70.4.171 k8s-master <none> <none>
4. 访问测试¶
## 访问myblog服务正常
curl 10.244.0.36:8002/blog/index/
root@k8s-master:/k8s/pod/myblog/two-pod# curl 10.244.0.36:8002/blog/index/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<h3>我的博客列表:</h3>
</br>
</br>
<a href=" /blog/article/edit/0 ">写博客</a>
</body>
</html>r
最后更新:
2022-02-22 04:55:01