跳转至

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