Kubernetes实战案例

可以参考kubernetes的官方example中的例子

https://github.com/kubernetes/examples

1.kubernetes mysql 持久化实战(单节点)

安装nfs服务器,将nfs服务器的/data/mysql_nfs路径进行共享。

这里nfs服务器地址为:192.168.1.40

1.1 创建mysql的namespaces

mysql-namespaces.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: mysql

1.2 创建pv

mysql-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-data
  namespace: mysql
spec:
  capacity:
    storage: 2Gi
  accessModes:
  - ReadWriteMany
  nfs:
    path: /data      #nfs共享目录
    server: 192.168.186.129     #nfs服务器地址
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: nfs

1.3 创建pvc

mysql-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-data
  namespace: mysql
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi
  storageClassName: nfs

1.4 创建ConfigMap

mysql-cm.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config-sre
  namespace: mysql
data:
  mysqld.cnf: |
        [mysqld]
        pid-file        = /var/run/mysqld/mysqld.pid
        socket          = /var/run/mysqld/mysqld.sock
        datadir         = /var/lib/mysql
        log-error      = /var/log/mysql/error.log
        bind-address   = 0.0.0.0
        # Disabling symbolic-links is recommended to prevent assorted security risks
        symbolic-links=0
        max_connections=1000
        default_storage_engine=innodb
        skip_external_locking
        lower_case_table_names=1
        skip_host_cache
        skip_name_resolve
        character_set_server=utf8
        sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

1.5 创建mysql deployment

mysql-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: mysql
  labels:
    app: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: registry.cn-hangzhou.aliyuncs.com/bzvs/mysql5.7:latest
          ports:
            - containerPort: 3306
              protocol: TCP
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123456"
          volumeMounts:
            - name: mysql-data
              mountPath: /var/lib/mysql
            - name: mysql-config
              mountPath: /etc/mysql/conf.d/
      volumes:
        - name: mysql-data
          persistentVolumeClaim:
            claimName: mysql-data
        - name: mysql-config
          configMap:
            name: mysql-config-sre

---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: mysql
  labels:
    app: mysql
spec:
  type: NodePort
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
      nodePort: 30006

注意nfs服务器上需要开启rpcbind服务

systemctl enable rpcbind
systemctl start rpcbind
systemctl start nfs-server

依次创建命令

kubectl create -f mysql-namespaces.yaml
kubectl create -f mysql-pv.yaml
kubectl create -f mysql-pvc.yaml
kubectl create -f mysql-cm.yaml
kubectl create -f mysql-deployment.yaml

查看结果

[root@ci-base k8s-example]# kubectl get ns
NAME                   STATUS   AGE
mysql                  Active   17s


[root@ci-base k8s-example]# kubectl get pv -n mysql
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
mysql-data   2Gi        RWX            Recycle          Available           nfs                     17s

[root@ci-base k8s-example]# kubectl get pvc -n mysql

NAME         STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-data   Bound    mysql-data   2Gi        RWX            nfs            8s

[root@ci-base k8s-example]# kubectl get cm -n mysql
NAME               DATA   AGE
mysql-config-sre   1      14s

[root@ci-base k8s-example]# kubectl get pod,svc -n mysql
NAME                         READY   STATUS    RESTARTS   AGE
pod/mysql-565b7cd487-hw5lc   1/1     Running   0          8m20s

NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/mysql   NodePort   10.98.67.121   <none>        3306:30006/TCP   8m11s

1.6 测试mysql连接是否正常

image0

2.部署群集应用 lnmp平台

2.1 创建namespace

namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: lnmp

2.2 创建pv,pvc

pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv
  namespace: lnmp
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/nfs/mysql
    server: 192.168.1.40
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv-one
  namespace: lnmp
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/nfs/data
    server: 192.168.1.40
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv-two
  namespace: lnmp
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  nfs:
    path: /data/nfs/data
    server: 192.168.1.40

pvc.yaml

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  namespace: lnmp
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-one
  namespace: lnmp
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-two
  namespace: lnmp
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 2Gi

2.3 创建svc,deployment

mysql-deployment.yaml

---
apiVersion: v1
data:
  password: MTIzNDU2      # pass 123456
kind: Secret
metadata:
  managedFields:
    - apiVersion: v1
      fieldsType: FieldsV1
  name: mysql-pass
  namespace: lnmp
type: Opaque



---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  namespace: lnmp
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  namespace: lnmp
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.6
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

php-deployment.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-php
  namespace: lnmp
  labels:
    app: wordpress
spec:
  ports:
    - port: 9000
  selector:
    app: wordpress-php
    tier: frontend

---
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1
kind: Deployment
metadata:
  name: wordpress-php
  namespace: lnmp
  labels:
    app: wordpress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress-php
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress-php
        tier: frontend
    spec:
      containers:
      - name: php
        image: registry.cn-hangzhou.aliyuncs.com/balloon/php56:latest
        ports:
        - containerPort: 9000
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      imagePullSecrets:
        - name: registrypullsecret
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-one

nginx-deployment.yaml

nginx的配置使用cm的方式进行配置

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-wp-config
  namespace: lnmp
data:
  site.conf: |-
    server {
        listen 80;
        server_name localhost;
        root html;
        index index.html index.php;

        location ~ \.php$ {
            root html;
            fastcgi_pass wordpress-php:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
            fastcgi_connect_timeout 60s;
            fastcgi_read_timeout 300s;
            fastcgi_send_timeout 300s;
        }
    }

---
apiVersion: v1
kind: Service
metadata:
  name: wordpress-nginx
  namespace: lnmp
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress-nginx
    tier: frontend
  type: NodePort
  sessionAffinity: ClientIP

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-nginx
  namespace: lnmp
  labels:
    app: wordpress
spec:
  replicas: 3
  selector:
    matchLabels:
      app: wordpress-nginx
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress-nginx
        tier: frontend
    spec:
      containers:
      - name: nginx
        image: registry.cn-hangzhou.aliyuncs.com/devops_hu/nginx:none-cfg
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /usr/local/nginx/html
        - name: config
          mountPath: /usr/local/nginx/conf/vhost/site.conf
          subPath: site.conf
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-two
      - name: config
        configMap:
          name: nginx-wp-config

2.4 创建Ingress

ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-lnmp
  namespace: lnmp

spec:
  rules:
    - host: lnmp.linux.com     #测试域名
      http:
        paths:
          - backend:
              serviceName: wordpress-nginx
              servicePort: 80

/data/nfs/data下创建index.html文件,如下:

[root@jenkins data]# echo "<h1>hello nginxtouch index.html</h1>" > index.html
[root@jenkins data]# cat index.html
<h1>hello nginxtouch index.html</h1>

网页访问如下:

image1

其他参考文献:

https://github.com/donxan/k8s_lnmp_discuzx

https://blog.51cto.com/m51cto/2344819

3. 实战|基于Kubernetes使用MySQL

https://mp.weixin.qq.com/s/uKtSzAz7fN7lBPCZKURwHg

4. Kubernetes部署MySQL 主从架构

实验目的

  • 搭建一个主从复制(Master-Slave)的MySQL集群

  • 从节点可以水平扩展

  • 所有的操作只能在MySQL主节点上执行

  • 读操作可以在MySQL主从节点上执行

  • 从节点能同步主节点的数据

Helm安装nfs-client-provisioner

helm repo add azure http://mirror.azure.cn/kubernetes/charts/
helm repo update

helm pull  azure/nfs-client-provisioner  --version 1.2.8
tar xvf nfs-client-provisioner-*.tgz

安装 nfs-client-provisioner

kubectl create ns nfs

helm install nfs-client-provisioner -n nfs \
--set nfs.server=192.168.1.60 \
--set nfs.path=/mysql57  \
--set storageClass.name=mysql-nfs,storageClass.reclaimPolicy=Retain \
--set storageClass.defaultClass=true \
nfs-client-provisioner


kubectl get sc
NAME                            PROVISIONER                                                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
mysql-nfs-storage (default)     cluster.local/mysql-nfs-storage-nfs-client-provisioner     Retain          Immediate           true                   37s