[toc]

需求

MySQL需求

  1. 名称空间:
    • blog
  2. 镜像
    • mysql:5.7
  3. 环境变量
    • root密码:123
    • 数据库:wp
    • 用户:wp_user
    • 参数:字符集
  4. 数据持久化
  • 映射到宿主机的/data/mysql/data

wordpress需求

  1. 镜像:
    • 官方
  2. 数据库地址
    • cluster ip
  3. 数据库名称
    • wp
  4. 用户
    • www
  5. wordpress数量
    • 单独起2pod
  6. mysql数量
    • 单独起1个pod

使用资源

  1. ns
  2. Controller
    • pod
    • initContainer
    • 存活探针
    • 就绪探针
  3. clusterIP
  4. ingress

交付方案

规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 镜像
wordpress:latest
mysql:5.7

# wordpress资源清单
- namespace
- deployment
- clusterip
- ingress

# mysql资源清单
- namespace
- deployment
- clusterip

# MySQL账户
- root密码:123
- 数据库:wp
- 用户:wp_user
- 参数:字符集

部署NFS服务器

  • 安装NFS

    1
    2
    # 安装nfs-utils
    yum install -y nfs-utils
  • 创建www用户组进行管理

    1
    2
    3
    4
    5
    # 创建www组
    groupadd www -g 666

    # 创建www用户
    useradd www -u 666 -s /sbin/nologin -M -g 666
  • 创建文件共享目录并授权

    1
    2
    3
    4
    5
    # 创建文件共享目录
    mkdir /data

    # 授权www用户、组
    chown www:www /data/
  • 编辑NFS的配置文件

    1
    2
    3
    # 编辑NFS的配置文件
    vim /etc/exports
    /data/wp 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
  • 启动NFS服务

    1
    2
    # 启动nfs服务
    systemctl start nfs

资源清单

  • 创建名称空间清单

    1
    2
    3
    4
    5
    # vim ns-blog.yaml
    apiVersion: v1
    kind: Namespace
    metadata:
    name: blog
  • 创建mysql-dp清单

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    # vim mysql-dp.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: mysql-dp
    namespace: blog
    spec:
    replicas: 1
    selector:
    matchLabels:
    run: mysql
    template:
    metadata:
    name: mysql-pod
    labels:
    run: mysql
    spec:
    volumes:
    - name: db-data
    hostPath:
    path: /data/mysql/
    containers:
    - name: mysql-container
    image: mysql:5.7
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
    value: "123"
    - name: MYSQL_DATABASE
    value: "wp"
    - name: MYSQL_USER
    value: "wp_user"
    - name: MYSQL_PASSWORD
    value: "123"
    volumeMounts:
    - name: db-data
    mountPath: /var/lib/mysql
    args:
    - --character-set-server=utf8
  • 创建mysql的service网络资源(Cluster)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # vim mysql-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
    name: mysql-cluster
    namespace: blog
    spec:
    selector:
    run: mysql
    ports:
    - name: mysql-port
    port: 3306
    protocol: TCP
    targetPort: 3306
    type: ClusterIP
  • 创建wp清单

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    # vim wordpress-dp.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: wp-dp
    namespace: blog
    spec:
    replicas: 2
    selector:
    matchLabels:
    run: wp
    template:
    metadata:
    name: wp-pod
    labels:
    run: wp
    spec:
    volumes:
    - name: wp-data
    nfs:
    path: /data/wp
    server: 172.16.1.31
    containers:
    - name: wp-container
    image: wordpress
    imagePullPolicy: IfNotPresent
    env:
    - name: WORDPRESS_DB_HOST
    value: "mysql-cluster"
    - name: WORDPRESS_DB_NAME
    value: "wp"
    - name: WORDPRESS_DB_USER
    value: "wp_user"
    - name: WORDPRESS_DB_PASSWORD
    value: "123"
    volumeMounts:
    - name: wp-data
    mountPath: /var/www/html
  • 创建wp的service网络资源(Cluster)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # vim wp-svc.yaml 
    apiVersion: v1
    kind: Service
    metadata:
    name: wp-cluster
    namespace: blog
    spec:
    selector:
    run: wp
    ports:
    - name: wp-port
    port: 80
    protocol: TCP
    targetPort: 80
    type: ClusterIP
  • 创建wp的ingress资源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # wp-ingress
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: wp-ingress
    namespace: blog
    spec:
    rules:
    - host: blog.xxx.com
    http:
    paths:
    - path: /
    pathType: ImplementationSpecific
    backend:
    service:
    name: wp-cluster
    port:
    number: 80
  • 优化合并资源清单

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    # vim wp_mysql.yaml
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
    name: blog

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: mysql-dp
    namespace: blog
    spec:
    replicas: 1
    selector:
    matchLabels:
    run: mysql
    template:
    metadata:
    name: mysql-pod
    labels:
    run: mysql
    spec:
    volumes:
    - name: db-data
    hostPath:
    path: /data/mysql/
    containers:
    - name: mysql-container
    image: mysql:5.7
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 3306
    env:
    - name: MYSQL_ROOT_PASSWORD
    value: "123"
    - name: MYSQL_DATABASE
    value: "wp"
    - name: MYSQL_USER
    value: "wp_user"
    - name: MYSQL_PASSWORD
    value: "123"
    volumeMounts:
    - name: db-data
    mountPath: /var/lib/mysql
    args:
    - --character-set-server=utf8

    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: mysql-cluster
    namespace: blog
    spec:
    selector:
    run: mysql
    ports:
    - name: mysql-port
    port: 3306
    protocol: TCP
    targetPort: 3306
    type: ClusterIP

    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: wp-dp
    namespace: blog
    spec:
    replicas: 2
    selector:
    matchLabels:
    run: wp
    template:
    metadata:
    name: wp-pod
    labels:
    run: wp
    spec:
    volumes:
    - name: wp-data
    nfs:
    path: /data/wp
    server: 172.16.1.31
    containers:
    - name: wp-container
    image: wordpress
    imagePullPolicy: IfNotPresent
    env:
    - name: WORDPRESS_DB_HOST
    value: "mysql-cluster"
    - name: WORDPRESS_DB_NAME
    value: "wp"
    - name: WORDPRESS_DB_USER
    value: "wp_user"
    - name: WORDPRESS_DB_PASSWORD
    value: "123"
    volumeMounts:
    - name: wp-data
    mountPath: /var/www/html

    ---
    apiVersion: v1
    kind: Service
    metadata:
    name: wp-cluster
    namespace: blog
    spec:
    selector:
    run: wp
    ports:
    - name: wp-port
    port: 80
    protocol: TCP
    targetPort: 80
    type: ClusterIP

    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
    name: wp-ingress
    namespace: blog
    spec:
    rules:
    - host: blog.xxx.com
    http:
    paths:
    - path: /
    pathType: ImplementationSpecific
    backend:
    service:
    name: wp-cluster
    port:
    number: 80

应用资源清单

1
2
# 应用资源清单
kubectl apply -f wp_mysql.yaml

资源检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 检查pod启动状态
kubectl get pod -n blog
NAME READY STATUS RESTARTS AGE
mysql-dp-5bb7dc754-96ttd 1/1 Running 0 43s
wp-dp-5699cdcf58-q24wf 1/1 Running 1 43s
wp-dp-5699cdcf58-rbbtd 1/1 Running 0 43s

# 检查service网络资源状态
kubectl get svc -n blog
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql-cluster ClusterIP 10.1.80.196 <none> 3306/TCP 78s
wp-cluster ClusterIP 10.1.35.27 <none> 80/TCP 78s

# 查看MySQL的service网络资源详细状态
kubectl describe svc -n blog mysql-cluster
Name: mysql-cluster
Namespace: blog
Labels: <none>
Annotations: <none>
Selector: run=mysql
Type: ClusterIP
IP: 10.1.80.196
Port: mysql-port 3306/TCP
TargetPort: 3306/TCP
Endpoints: 10.2.1.46:3306
Session Affinity: None
Events: <none>

# 查看wp的service网络资源详细状态
kubectl describe svc -n blog wp-cluster
Name: wp-cluster
Namespace: blog
Labels: <none>
Annotations: <none>
Selector: run=wp
Type: ClusterIP
IP: 10.1.35.27
Port: wp-port 80/TCP
TargetPort: 80/TCP
Endpoints: 10.2.1.47:80,10.2.2.27:80
Session Affinity: None
Events: <none>

# 查看ingress网络资源的状态
kubectl get -n blog ingress wp-ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
wp-ingress <none> blog.xxx.com 80 4m